avo 2.46.0 → 3.0.0.pre2
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 +23 -22
- data/Gemfile.lock +181 -160
- data/README.md +1 -1
- data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
- data/app/assets/builds/avo.base.js +93804 -0
- data/app/assets/builds/avo.base.js.map +7 -0
- data/app/assets/stylesheets/avo.base.css +2 -2
- data/app/assets/svgs/failed_to_load.svg +1 -0
- data/app/assets/svgs/font.svg +1 -0
- data/app/assets/svgs/grid-empty-state.svg +1 -0
- data/app/assets/svgs/table-empty-state.svg +1 -0
- data/app/assets/svgs/triangle-up.svg +1 -0
- data/app/components/avo/actions_component.html.erb +18 -4
- data/app/components/avo/actions_component.rb +12 -18
- data/app/components/avo/alert_component.html.erb +1 -1
- 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 +14 -11
- 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 +4 -4
- data/app/components/avo/field_wrapper_component.rb +12 -23
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
- 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 -2
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
- data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
- data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
- data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
- data/app/components/avo/fields/common/heading_component.html.erb +1 -1
- data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
- data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
- data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
- data/app/components/avo/fields/file_field/edit_component.rb +0 -1
- data/app/components/avo/fields/file_field/index_component.rb +2 -2
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
- data/app/components/avo/fields/files_field/edit_component.rb +0 -1
- data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
- data/app/components/avo/fields/index_component.rb +5 -6
- data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
- data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
- data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
- 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/progress_bar_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
- data/app/components/avo/fields/show_component.rb +4 -1
- data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
- data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -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.html.erb +1 -1
- data/app/components/avo/index/grid_item_component.html.erb +5 -2
- data/app/components/avo/index/grid_item_component.rb +7 -6
- data/app/components/avo/index/resource_controls_component.html.erb +3 -81
- data/app/components/avo/index/resource_controls_component.rb +128 -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_table_component.html.erb +5 -4
- data/app/components/avo/index/resource_table_component.rb +14 -20
- data/app/components/avo/index/table_row_component.html.erb +8 -4
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/item_switcher_component.html.erb +5 -10
- data/app/components/avo/item_switcher_component.rb +2 -3
- data/app/components/avo/modal_component.html.erb +7 -12
- data/app/components/avo/modal_component.rb +0 -21
- data/app/components/avo/paginator_component.html.erb +40 -29
- data/app/components/avo/paginator_component.rb +5 -23
- data/app/components/avo/panel_component.html.erb +8 -11
- data/app/components/avo/panel_component.rb +0 -1
- data/app/components/avo/profile_item_component.html.erb +2 -17
- data/app/components/avo/profile_item_component.rb +1 -13
- data/app/components/avo/referrer_params_component.html.erb +1 -4
- data/app/components/avo/resource_component.rb +142 -30
- data/app/components/avo/resource_sidebar_component.html.erb +6 -2
- data/app/components/avo/sidebar/link_component.html.erb +0 -2
- data/app/components/avo/sidebar/link_component.rb +3 -5
- data/app/components/avo/sidebar_component.html.erb +9 -2
- data/app/components/avo/sidebar_component.rb +5 -3
- data/app/components/avo/sidebar_profile_component.html.erb +27 -20
- data/app/components/avo/tab_group_component.html.erb +13 -7
- data/app/components/avo/tab_group_component.rb +1 -6
- data/app/components/avo/tab_switcher_component.html.erb +17 -40
- data/app/components/avo/tab_switcher_component.rb +4 -39
- data/app/components/avo/views/resource_edit_component.html.erb +16 -52
- data/app/components/avo/views/resource_edit_component.rb +7 -18
- data/app/components/avo/views/resource_index_component.html.erb +38 -53
- data/app/components/avo/views/resource_index_component.rb +60 -16
- data/app/components/avo/views/resource_show_component.html.erb +8 -151
- data/app/components/avo/views/resource_show_component.rb +6 -11
- data/app/controllers/avo/actions_controller.rb +19 -16
- data/app/controllers/avo/application_controller.rb +40 -109
- data/app/controllers/avo/associations_controller.rb +34 -41
- data/app/controllers/avo/attachments_controller.rb +10 -25
- data/app/controllers/avo/base_controller.rb +91 -103
- data/app/controllers/avo/debug_controller.rb +17 -5
- data/app/controllers/avo/search_controller.rb +29 -54
- data/app/controllers/avo/team_users_controller.rb +4 -0
- data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
- data/app/helpers/avo/application_helper.rb +20 -21
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +27 -11
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/application.js +0 -5
- 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/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
- 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 +1 -3
- 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 +12 -8
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
- data/app/views/avo/actions/show.html.erb +12 -11
- data/app/views/avo/associations/new.html.erb +4 -4
- data/app/views/avo/base/index.html.erb +3 -2
- data/app/views/avo/base/new.html.erb +2 -1
- data/app/views/avo/base/preview.html.erb +19 -0
- data/app/views/avo/base/show.html.erb +1 -1
- data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
- data/app/views/avo/debug/report.html.erb +32 -17
- data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
- data/app/views/avo/home/index.html.erb +1 -1
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_javascript.html.erb +5 -0
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +3 -5
- data/app/views/avo/partials/_table_header.html.erb +5 -3
- data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
- data/app/views/avo/private/design.html.erb +2 -2
- data/app/views/layouts/avo/application.html.erb +3 -0
- data/avo.gemspec +6 -7
- data/bin/dev +1 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +10 -14
- data/config/master.key +1 -0
- data/config/routes.rb +8 -12
- data/db/factories.rb +7 -18
- data/lib/avo/action_model.rb +20 -0
- data/lib/avo/app.rb +90 -162
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +38 -36
- data/lib/avo/base_resource.rb +108 -96
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
- data/lib/avo/concerns/filters_session_handler.rb +1 -0
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_item_type.rb +38 -0
- data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
- data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
- data/lib/avo/concerns/is_resource_item.rb +24 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/visible_in_different_views.rb +126 -0
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +8 -45
- data/lib/avo/current.rb +5 -0
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +6 -2
- data/lib/avo/engine.rb +37 -30
- data/lib/avo/error_manager.rb +25 -0
- data/lib/avo/execution_context.rb +9 -15
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +72 -124
- data/lib/avo/fields/belongs_to_field.rb +14 -25
- data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
- data/lib/avo/fields/concerns/has_default.rb +1 -5
- data/lib/avo/fields/concerns/has_field_name.rb +22 -0
- data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
- data/lib/avo/fields/concerns/is_disabled.rb +1 -5
- data/lib/avo/fields/concerns/is_readonly.rb +1 -5
- data/lib/avo/fields/concerns/is_required.rb +5 -7
- data/lib/avo/fields/concerns/is_searchable.rb +13 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_field.rb +3 -16
- data/lib/avo/fields/date_time_field.rb +1 -5
- data/lib/avo/fields/field_manager.rb +45 -0
- data/lib/avo/fields/file_field.rb +0 -2
- data/lib/avo/fields/files_field.rb +0 -6
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +11 -14
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +5 -10
- data/lib/avo/fields/heading_field.rb +4 -1
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +2 -3
- data/lib/avo/fields/password_field.rb +1 -1
- data/lib/avo/fields/preview_field.rb +14 -0
- data/lib/avo/fields/select_field.rb +12 -8
- data/lib/avo/fields/status_field.rb +4 -0
- data/lib/avo/filters/base_filter.rb +3 -8
- data/lib/avo/grid_collector.rb +7 -9
- data/lib/avo/html/builder.rb +5 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +4 -68
- data/lib/avo/licensing/license.rb +2 -2
- data/lib/avo/licensing/license_manager.rb +1 -1
- data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
- data/lib/avo/licensing/pro_license.rb +1 -7
- data/lib/avo/plugin.rb +6 -0
- data/lib/avo/plugin_manager.rb +58 -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 +6 -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 +76 -0
- data/lib/avo/resources/items/item_group.rb +48 -0
- data/lib/avo/resources/items/main_panel.rb +2 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/sidebar.rb +47 -0
- data/lib/avo/resources/items/tab.rb +60 -0
- data/lib/avo/resources/items/tab_group.rb +68 -0
- data/lib/avo/resources/resource_manager.rb +181 -0
- data/lib/avo/services/authorization_service.rb +11 -110
- data/lib/avo/services/debug_service.rb +92 -0
- data/lib/avo/services/telemetry_service.rb +84 -0
- data/lib/avo/test_helpers.rb +362 -0
- data/lib/avo/tools/tool_manager.rb +30 -0
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +7 -0
- data/lib/generators/avo/eject_generator.rb +0 -1
- data/lib/generators/avo/install_generator.rb +1 -11
- data/lib/generators/avo/resource_generator.rb +5 -23
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
- data/lib/generators/avo/templates/action.tt +1 -1
- 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 +1 -1
- data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
- data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
- data/lib/generators/avo/templates/initializer/avo.tt +1 -11
- data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
- data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
- data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
- data/lib/generators/avo/templates/resource/resource.tt +1 -1
- data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
- data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
- data/lib/generators/avo/templates/scope.tt +6 -0
- data/lib/generators/avo/templates/standalone_action.tt +1 -1
- data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
- data/lib/generators/avo/templates/tool/view.tt +2 -2
- data/lib/tasks/avo_tasks.rake +22 -0
- metadata +82 -161
- data/app/assets/stylesheets/css/tags.css +0 -32
- data/app/assets/svgs/map-empty-state.svg +0 -35
- data/app/assets/svgs/map-view-type.svg +0 -3
- 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/area_field/edit_component.html.erb +0 -7
- data/app/components/avo/fields/area_field/edit_component.rb +0 -4
- data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
- data/app/components/avo/fields/area_field/show_component.rb +0 -4
- 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/common/files/controls_component.html.erb +0 -29
- data/app/components/avo/fields/common/files/controls_component.rb +0 -19
- data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
- data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
- data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
- data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
- data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
- data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
- data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
- data/app/components/avo/fields/location_field/edit_component.rb +0 -4
- data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/location_field/show_component.rb +0 -4
- 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/index/resource_map_component.html.erb +0 -16
- data/app/components/avo/index/resource_map_component.rb +0 -109
- data/app/components/avo/row_component.html.erb +0 -3
- data/app/components/avo/row_component.rb +0 -12
- data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
- data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
- data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
- data/app/controllers/avo/dashboards_controller.rb +0 -22
- data/app/controllers/avo/reorder_controller.rb +0 -25
- data/app/javascript/js/controllers/base_controller.js +0 -22
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
- data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
- data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
- data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
- data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
- data/app/views/avo/dashboards/cards/show.html.erb +0 -3
- data/app/views/avo/dashboards/show.html.erb +0 -38
- data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
- data/app/views/avo/partials/_global_search.html.erb +0 -19
- data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
- data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
- data/lib/avo/base_card.rb +0 -161
- data/lib/avo/concerns/fetches_things.rb +0 -150
- data/lib/avo/concerns/handles_field_args.rb +0 -47
- data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_html_attributes.rb +0 -123
- data/lib/avo/concerns/pagination.rb +0 -53
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- data/lib/avo/concerns/visible_items.rb +0 -51
- data/lib/avo/dashboards/base_dashboard.rb +0 -89
- data/lib/avo/dashboards/base_divider.rb +0 -35
- data/lib/avo/dashboards/chartkick_card.rb +0 -77
- data/lib/avo/dashboards/dashboard_card.rb +0 -6
- data/lib/avo/dashboards/metric_card.rb +0 -9
- data/lib/avo/dashboards/partial_card.rb +0 -7
- data/lib/avo/fields/area_field.rb +0 -39
- data/lib/avo/fields/concerns/file_authorization.rb +0 -31
- 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/location_field.rb +0 -86
- data/lib/avo/fields/tags_field.rb +0 -102
- 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/templates/locales/avo.es.yml +0 -126
- data/public/avo-assets/avo.base.js +0 -1037
- data/public/avo-assets/avo.base.js.map +0 -7
@@ -0,0 +1,15 @@
|
|
1
|
+
module Avo
|
2
|
+
module Resources
|
3
|
+
module Controls
|
4
|
+
class CreateButton < BaseControl
|
5
|
+
def initialize(**args)
|
6
|
+
super(**args)
|
7
|
+
|
8
|
+
if args[:item].present?
|
9
|
+
@label = I18n.t("avo.create_new_item", item: args[:item]) if label.nil?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -5,7 +5,11 @@ module Avo
|
|
5
5
|
def initialize(**args)
|
6
6
|
super(**args)
|
7
7
|
|
8
|
-
@label = I18n.t("avo.delete").capitalize
|
8
|
+
@label = args[:label] || I18n.t("avo.delete").capitalize
|
9
|
+
if args[:item].present?
|
10
|
+
@title = I18n.t("avo.delete_item", item: args[:item]).capitalize if title.nil?
|
11
|
+
@confirmation_message = I18n.t("avo.are_you_sure") if confirmation_message.nil?
|
12
|
+
end
|
9
13
|
end
|
10
14
|
end
|
11
15
|
end
|
@@ -5,7 +5,10 @@ module Avo
|
|
5
5
|
def initialize(**args)
|
6
6
|
super(**args)
|
7
7
|
|
8
|
-
|
8
|
+
if args[:item].present?
|
9
|
+
@title = I18n.t("avo.detach_item", item: args[:item]).capitalize if title.nil?
|
10
|
+
@confirmation_message = I18n.t("avo.are_you_sure_detach_item", item: args[:item]) if confirmation_message.nil?
|
11
|
+
end
|
9
12
|
end
|
10
13
|
end
|
11
14
|
end
|
@@ -5,7 +5,10 @@ module Avo
|
|
5
5
|
def initialize(**args)
|
6
6
|
super(**args)
|
7
7
|
|
8
|
-
@label = I18n.t("avo.edit").capitalize
|
8
|
+
@label = args[:label] || I18n.t("avo.edit").capitalize
|
9
|
+
if args[:item].present?
|
10
|
+
@title = I18n.t("avo.edit_item", item: args[:item]).capitalize if title.nil?
|
11
|
+
end
|
9
12
|
end
|
10
13
|
end
|
11
14
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Avo
|
2
|
+
module Resources
|
3
|
+
module Controls
|
4
|
+
class ShowButton < BaseControl
|
5
|
+
def initialize(**args)
|
6
|
+
super(**args)
|
7
|
+
|
8
|
+
if args[:item].present?
|
9
|
+
@title = I18n.t("avo.view_item", item: args[:item]).capitalize if title.nil?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
class Avo::Resources::Items::Holder
|
2
|
+
attr_reader :tools
|
3
|
+
attr_accessor :items
|
4
|
+
attr_accessor :invalid_fields
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@items = []
|
8
|
+
@items_index = 0
|
9
|
+
@invalid_fields = []
|
10
|
+
end
|
11
|
+
|
12
|
+
# Adds a field to the items_holder
|
13
|
+
def field(field_name, **args, &block)
|
14
|
+
field_parser = Avo::Dsl::FieldParser.new(id: field_name, order_index: @items_index, **args, &block).parse
|
15
|
+
|
16
|
+
if field_parser.invalid?
|
17
|
+
as = args.fetch(:as, nil)
|
18
|
+
|
19
|
+
# End execution ehre and add the field to the invalid_fileds payload so we know to wanr the developer about that.
|
20
|
+
# @todo: Make sure this warning is still active
|
21
|
+
return add_invalid_field({
|
22
|
+
name: field_name,
|
23
|
+
as: as,
|
24
|
+
# resource: resource_class.name,
|
25
|
+
message: "There's an invalid field configuration for this resource. <br/> <code class='px-1 py-px rounded bg-red-600'>field :#{field_name}, as: #{as}</code>"
|
26
|
+
})
|
27
|
+
end
|
28
|
+
|
29
|
+
add_item field_parser.instance
|
30
|
+
end
|
31
|
+
|
32
|
+
def tabs(instance)
|
33
|
+
add_item instance
|
34
|
+
end
|
35
|
+
|
36
|
+
def tab(name, **args, &block)
|
37
|
+
add_item Avo::Resources::Items::Tab::Builder.parse_block(name: name, **args, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
def tool(klass, **args)
|
41
|
+
instance = klass.new(**args)
|
42
|
+
add_item instance
|
43
|
+
end
|
44
|
+
|
45
|
+
def panel(panel_name = nil, **args, &block)
|
46
|
+
panel = Avo::Resources::Items::ItemGroup::Builder.parse_block(name: panel_name, **args, &block)
|
47
|
+
|
48
|
+
add_item panel
|
49
|
+
end
|
50
|
+
|
51
|
+
def heading(body = nil, **args, &block)
|
52
|
+
field = Avo::Fields::HeadingField.new(body, **args)
|
53
|
+
|
54
|
+
add_item field
|
55
|
+
end
|
56
|
+
|
57
|
+
def sidebar(instance)
|
58
|
+
add_item instance
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_item(instance)
|
62
|
+
@items << instance
|
63
|
+
|
64
|
+
increment_order_index
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def add_invalid_field(payload)
|
70
|
+
@invalid_fields << payload
|
71
|
+
end
|
72
|
+
|
73
|
+
def increment_order_index
|
74
|
+
@items_index += 1
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Avo::Resources::Items::ItemGroup
|
2
|
+
prepend Avo::Concerns::IsResourceItem
|
3
|
+
|
4
|
+
include Avo::Concerns::HasItems
|
5
|
+
include Avo::Concerns::HasItemType
|
6
|
+
include Avo::Concerns::IsVisible
|
7
|
+
include Avo::Concerns::VisibleInDifferentViews
|
8
|
+
|
9
|
+
attr_reader :name
|
10
|
+
attr_reader :description
|
11
|
+
|
12
|
+
delegate :items, :add_item, to: :items_holder
|
13
|
+
|
14
|
+
def initialize(name: nil, description: nil, view: nil, **args)
|
15
|
+
@name = name
|
16
|
+
@view = view
|
17
|
+
@description = description
|
18
|
+
@items_holder = Avo::Resources::Items::Holder.new
|
19
|
+
@args = args
|
20
|
+
|
21
|
+
post_initialize if respond_to?(:post_initialize)
|
22
|
+
end
|
23
|
+
|
24
|
+
class Builder
|
25
|
+
class << self
|
26
|
+
def parse_block(**args, &block)
|
27
|
+
Docile.dsl_eval(new(**args), &block).build
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
delegate :heading, to: :items_holder
|
32
|
+
delegate :field, to: :items_holder
|
33
|
+
delegate :items, to: :items_holder
|
34
|
+
|
35
|
+
attr_reader :items_holder
|
36
|
+
|
37
|
+
def initialize(name: nil, **args)
|
38
|
+
@panel = Avo::Resources::Items::Panel.new(name: name, **args)
|
39
|
+
@items_holder = Avo::Resources::Items::Holder.new
|
40
|
+
end
|
41
|
+
|
42
|
+
# Fetch the tab
|
43
|
+
def build
|
44
|
+
@panel.items_holder = @items_holder
|
45
|
+
@panel
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class Avo::Resources::Items::Sidebar
|
2
|
+
prepend Avo::Concerns::IsResourceItem
|
3
|
+
|
4
|
+
include Avo::Concerns::HasItems
|
5
|
+
include Avo::Concerns::HasItemType
|
6
|
+
include Avo::Concerns::IsVisible
|
7
|
+
include Avo::Concerns::VisibleInDifferentViews
|
8
|
+
|
9
|
+
delegate :items, :add_item, to: :items_holder
|
10
|
+
|
11
|
+
attr_reader :name
|
12
|
+
|
13
|
+
def initialize(name: nil, view: nil, **args)
|
14
|
+
@name = name
|
15
|
+
@items_holder = Avo::Resources::Items::Holder.new
|
16
|
+
@view = view
|
17
|
+
@args = args
|
18
|
+
|
19
|
+
post_initialize if respond_to?(:post_initialize)
|
20
|
+
end
|
21
|
+
|
22
|
+
class Builder
|
23
|
+
class << self
|
24
|
+
def parse_block(**args, &block)
|
25
|
+
Docile.dsl_eval(new(**args), &block).build
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_reader :items_holder
|
30
|
+
|
31
|
+
delegate :field, to: :items_holder
|
32
|
+
delegate :items, to: :items_holder
|
33
|
+
delegate :heading, to: :items_holder
|
34
|
+
|
35
|
+
def initialize(name: nil, **args)
|
36
|
+
@sidebar = Avo::Resources::Items::Sidebar.new(**args)
|
37
|
+
@items_holder = Avo::Resources::Items::Holder.new
|
38
|
+
end
|
39
|
+
|
40
|
+
# Fetch the sidebar
|
41
|
+
def build
|
42
|
+
@sidebar.items_holder = @items_holder
|
43
|
+
@sidebar
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class Avo::Resources::Items::Tab
|
2
|
+
prepend Avo::Concerns::IsResourceItem
|
3
|
+
|
4
|
+
include Avo::Concerns::HasItems
|
5
|
+
include Avo::Concerns::HasItemType
|
6
|
+
include Avo::Concerns::IsVisible
|
7
|
+
include Avo::Concerns::VisibleInDifferentViews
|
8
|
+
|
9
|
+
delegate :items, :add_item, to: :items_holder
|
10
|
+
|
11
|
+
attr_accessor :description
|
12
|
+
|
13
|
+
def initialize(name: nil, description: nil, view: nil, **args)
|
14
|
+
@name = name
|
15
|
+
@description = description
|
16
|
+
@items_holder = Avo::Resources::Items::Holder.new
|
17
|
+
@view = view
|
18
|
+
@args = args
|
19
|
+
|
20
|
+
post_initialize if respond_to?(:post_initialize)
|
21
|
+
end
|
22
|
+
|
23
|
+
def name
|
24
|
+
Avo::ExecutionContext.new(target: @name).handle
|
25
|
+
end
|
26
|
+
|
27
|
+
def turbo_frame_id(parent: nil)
|
28
|
+
id = "#{Avo::Resources::Items::Tab.to_s.parameterize} #{name}".parameterize
|
29
|
+
|
30
|
+
return id if parent.nil?
|
31
|
+
|
32
|
+
"#{parent.turbo_frame_id} #{id}".parameterize
|
33
|
+
end
|
34
|
+
|
35
|
+
class Builder
|
36
|
+
class << self
|
37
|
+
def parse_block(**args, &block)
|
38
|
+
Docile.dsl_eval(new(**args), &block).build
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_reader :items_holder
|
43
|
+
|
44
|
+
delegate :field, to: :items_holder
|
45
|
+
delegate :tool, to: :items_holder
|
46
|
+
delegate :panel, to: :items_holder
|
47
|
+
delegate :items, to: :items_holder
|
48
|
+
|
49
|
+
def initialize(name: nil, **args)
|
50
|
+
@tab = Avo::Resources::Items::Tab.new(name: name, **args)
|
51
|
+
@items_holder = Avo::Resources::Items::Holder.new
|
52
|
+
end
|
53
|
+
|
54
|
+
# Fetch the tab
|
55
|
+
def build
|
56
|
+
@tab.items_holder = @items_holder
|
57
|
+
@tab
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class Avo::Resources::Items::TabGroup
|
2
|
+
prepend Avo::Concerns::IsResourceItem
|
3
|
+
|
4
|
+
include Avo::Concerns::HasItems
|
5
|
+
include Avo::Concerns::HasItemType
|
6
|
+
include Avo::Concerns::IsVisible
|
7
|
+
include Avo::Concerns::VisibleInDifferentViews
|
8
|
+
|
9
|
+
attr_accessor :index
|
10
|
+
attr_accessor :style
|
11
|
+
|
12
|
+
def initialize(index: 0, view: nil, style: nil, **args)
|
13
|
+
@index = index
|
14
|
+
@items_holder = Avo::Resources::Items::Holder.new
|
15
|
+
@view = view
|
16
|
+
@style = style
|
17
|
+
@args = args
|
18
|
+
|
19
|
+
post_initialize if respond_to?(:post_initialize)
|
20
|
+
end
|
21
|
+
|
22
|
+
def turbo_frame_id
|
23
|
+
"#{Avo::Resources::Items::TabGroup.to_s.parameterize} #{index}".parameterize
|
24
|
+
end
|
25
|
+
|
26
|
+
class Builder
|
27
|
+
class << self
|
28
|
+
def parse_block(**args, &block)
|
29
|
+
Docile.dsl_eval(new(**args), &block).build
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_reader :items_holder
|
34
|
+
|
35
|
+
delegate :tab, to: :items_holder
|
36
|
+
|
37
|
+
def initialize(style: nil)
|
38
|
+
@group = Avo::Resources::Items::TabGroup.new(style: style)
|
39
|
+
@items_holder = Avo::Resources::Items::Holder.new
|
40
|
+
end
|
41
|
+
|
42
|
+
def field(field_name, **args, &block)
|
43
|
+
parsed = Avo::Dsl::FieldParser.new(id: field_name, order_index: @items_index, **args, &block).parse
|
44
|
+
field_instance = parsed.instance
|
45
|
+
|
46
|
+
name = field_instance.name
|
47
|
+
tab = Avo::Resources::Items::Tab.new name: name
|
48
|
+
|
49
|
+
if field_instance.has_own_panel?
|
50
|
+
tab.items_holder.add_item parsed.instance
|
51
|
+
else
|
52
|
+
# If the field is not in a panel, create one and add it
|
53
|
+
panel = Avo::Resources::Items::Panel.new name: name
|
54
|
+
panel.items_holder.add_item parsed.instance
|
55
|
+
# Add that panel to the items_holder
|
56
|
+
tab.items_holder.add_item panel
|
57
|
+
end
|
58
|
+
|
59
|
+
@items_holder.tabs tab
|
60
|
+
end
|
61
|
+
|
62
|
+
# Fetch the tab
|
63
|
+
def build
|
64
|
+
@group.items_holder = @items_holder
|
65
|
+
@group
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
module Avo
|
2
|
+
module Resources
|
3
|
+
class ResourceManager
|
4
|
+
attr_accessor :resources
|
5
|
+
|
6
|
+
alias_method :all, :resources
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def build
|
10
|
+
instance = new
|
11
|
+
instance.init_resources
|
12
|
+
instance.check_bad_resources
|
13
|
+
instance
|
14
|
+
end
|
15
|
+
|
16
|
+
# Fetches the resources available to the application.
|
17
|
+
# We have two ways of doing that.
|
18
|
+
#
|
19
|
+
# 1. Through eager loading.
|
20
|
+
# We automatically eager load the resources directory and fetch the descendants from the scanned files.
|
21
|
+
# This is the simple way to get started.
|
22
|
+
#
|
23
|
+
# 2. Manually, declared by the user.
|
24
|
+
# We have this option to load the resources because when they are loaded automatically through eager loading,
|
25
|
+
# those Resource classes and their methods may trigger loading other classes. And that may disrupt Rails booting process.
|
26
|
+
# Ex: AdminResource may use self.model_class = User. That will trigger Ruby to load the User class and itself load
|
27
|
+
# other classes in a chain reaction.
|
28
|
+
# The scenario that comes up most often is when Rails boots, the routes are being computed which eager loads the resource files.
|
29
|
+
# At that boot time some migration might have not been run yet, but Rails tries to access them through model associations,
|
30
|
+
# and they are not available.
|
31
|
+
#
|
32
|
+
# To enable this feature add a `resources` array config in your Avo initializer.
|
33
|
+
# config.resources = [
|
34
|
+
# "UserResource",
|
35
|
+
# "FishResource",
|
36
|
+
# ]
|
37
|
+
def fetch_resources
|
38
|
+
resources = if Avo.configuration.resources.nil?
|
39
|
+
BaseResource.descendants
|
40
|
+
else
|
41
|
+
Avo.configuration.resources
|
42
|
+
end
|
43
|
+
|
44
|
+
resources.map do |resource|
|
45
|
+
if resource.is_a?(Class)
|
46
|
+
resource
|
47
|
+
else
|
48
|
+
resource.to_s.safe_constantize
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def initialize
|
55
|
+
@resources = []
|
56
|
+
end
|
57
|
+
|
58
|
+
def init_resources
|
59
|
+
self.resources = self.class.fetch_resources
|
60
|
+
.reject do |resource|
|
61
|
+
# Remove the BaseResource. We only need the descendants
|
62
|
+
resource == Avo::BaseResource
|
63
|
+
end
|
64
|
+
.uniq do |klass|
|
65
|
+
# On invalid resource configuration the resource classes get duplicated in `ObjectSpace`
|
66
|
+
# We need to de-duplicate them
|
67
|
+
klass.name
|
68
|
+
end
|
69
|
+
.map do |resource|
|
70
|
+
resource.new if resource.is_a? Class
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def check_bad_resources
|
75
|
+
resources.each do |resource|
|
76
|
+
has_model = resource.model_class.present?
|
77
|
+
|
78
|
+
unless has_model
|
79
|
+
possible_model = resource.class.to_s.gsub "Avo::Resources::", ""
|
80
|
+
possible_model = possible_model.gsub "Resource", ""
|
81
|
+
|
82
|
+
Avo::App.errors.add({
|
83
|
+
url: "https://docs.avohq.io/2.0/resources.html#custom-model-class",
|
84
|
+
target: "_blank",
|
85
|
+
message: "#{resource.class} does not have a valid model assigned. It failed to find the #{possible_model} model. \n\r Please create that model or assign one using self.model_class = YOUR_MODEL"
|
86
|
+
})
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Filters out the resources that are missing the model_class
|
92
|
+
def valid_resources
|
93
|
+
resources
|
94
|
+
.select do |resource|
|
95
|
+
resource.model_class.present?
|
96
|
+
end
|
97
|
+
.sort_by(&:to_s)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns the Avo resource by camelized name
|
101
|
+
#
|
102
|
+
# get_resource_by_name('User') => Avo::Resources::User
|
103
|
+
def get_resource(resource)
|
104
|
+
resource = "Avo::Resources::#{resource}" unless resource.to_s.starts_with?("Avo::Resources::")
|
105
|
+
|
106
|
+
resources.find do |available_resource|
|
107
|
+
resource.to_s == available_resource.class.to_s
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns the Avo resource by singular snake_cased name
|
112
|
+
#
|
113
|
+
# get_resource_by_name('user') => Avo::Resources::User
|
114
|
+
def get_resource_by_name(name)
|
115
|
+
get_resource name.singularize.camelize
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns the Avo resource by singular snake_cased name
|
119
|
+
# From all the resources that use the same model_class, it will fetch the first one in alphabetical order
|
120
|
+
#
|
121
|
+
# get_resource_by_name('User') => Avo::Resources::User
|
122
|
+
# get_resource_by_name(User) => Avo::Resources::User
|
123
|
+
|
124
|
+
def get_resource_by_model_class(klass)
|
125
|
+
# Fetch the mappings imposed by the user.
|
126
|
+
# If they are present, use those ones.
|
127
|
+
mapping = get_mapping_for_model klass
|
128
|
+
return get_resource(mapping) if mapping.present?
|
129
|
+
|
130
|
+
valid_resources
|
131
|
+
.find do |resource|
|
132
|
+
resource.model_class.model_name.name == klass.to_s
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Returns the Avo resource by singular snake_cased name
|
137
|
+
#
|
138
|
+
# get_resource_by_controller_name('delayed_backend_active_record_jobs') => DelayedJobResource
|
139
|
+
# get_resource_by_controller_name('users') => Avo::Resources::User
|
140
|
+
def get_resource_by_controller_name(name)
|
141
|
+
valid_resources
|
142
|
+
.find do |resource|
|
143
|
+
resource.model_class.to_s.pluralize.underscore.tr("/", "_") == name.to_s
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Returns the Avo resource by some name
|
148
|
+
def guess_resource(name)
|
149
|
+
get_resource_by_name(name.to_s) || get_resource_by_model_class(name)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Returns the Rails model class by singular snake_cased name
|
153
|
+
#
|
154
|
+
# get_model_class_by_name('user') => User
|
155
|
+
def get_model_class_by_name(name)
|
156
|
+
name.to_s.camelize.singularize
|
157
|
+
end
|
158
|
+
|
159
|
+
def get_available_resources(user = nil)
|
160
|
+
valid_resources
|
161
|
+
.select do |resource|
|
162
|
+
Services::AuthorizationService.authorize user, resource.model_class, Avo.configuration.authorization_methods.stringify_keys["index"], raise_exception: false
|
163
|
+
end
|
164
|
+
.sort_by { |r| r.name }
|
165
|
+
end
|
166
|
+
|
167
|
+
def resources_for_navigation(user = nil)
|
168
|
+
get_available_resources(user)
|
169
|
+
.select do |resource|
|
170
|
+
resource.visible_on_sidebar
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
private
|
175
|
+
|
176
|
+
def get_mapping_for_model(klass)
|
177
|
+
(Avo.configuration.model_resource_mapping || {}).stringify_keys.transform_values(&:to_s)[klass.to_s]
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|