avo 2.45.0 → 3.0.0.pre1
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 +9 -9
- 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 +11 -10
- 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 -35
- data/lib/avo/base_resource.rb +107 -95
- 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/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 -123
- 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 +3 -67
- 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 +5 -5
- 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 +81 -159
- 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_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_html_attributes.rb +0 -108
- 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
@@ -1,8 +0,0 @@
|
|
1
|
-
<%= turbo_stream.remove("new_via_belongs_to") %>
|
2
|
-
|
3
|
-
<turbo-stream action="update-belongs-to"
|
4
|
-
data-relation-name="<%= params[:via_relation] %>"
|
5
|
-
data-target-resource-id="<%= @model.id %>"
|
6
|
-
data-target-resource-label="<%= @resource.label %>"
|
7
|
-
data-target-resource-class="<%= @model.class.name %>">
|
8
|
-
</turbo-stream>
|
@@ -1,13 +0,0 @@
|
|
1
|
-
<%= turbo_stream.replace(frame_id(@resource), template: "avo/base/new") %>
|
2
|
-
|
3
|
-
<%= turbo_stream.append "alerts" do %>
|
4
|
-
<%= render Avo::FlashAlertsComponent.new flashes: flash %>
|
5
|
-
<% end %>
|
6
|
-
|
7
|
-
<% if @model.errors.any? %>
|
8
|
-
<%= turbo_stream.append("alerts") do %>
|
9
|
-
<% @model.errors.full_messages.each do |message| %>
|
10
|
-
<%= render Avo::AlertComponent.new :error, message %>
|
11
|
-
<% end %>
|
12
|
-
<% end %>
|
13
|
-
<% end %>
|
@@ -1,14 +0,0 @@
|
|
1
|
-
<%= render Avo::TurboFrameWrapperComponent.new(params[:turbo_frame]) do %>
|
2
|
-
<div class="w-full h-full flex items-center text-center">
|
3
|
-
<div class="flex-1">
|
4
|
-
Chartkick is missing.
|
5
|
-
<a
|
6
|
-
href="https://docs.avohq.io/2.0/upgrade.html#upgrade-from-2-17-to-2-18"
|
7
|
-
target="_blank"
|
8
|
-
>
|
9
|
-
Manually require it in your
|
10
|
-
<code class="inline">Gemfile</code>
|
11
|
-
</a>.
|
12
|
-
</div>
|
13
|
-
</div>
|
14
|
-
<% end %>
|
@@ -1,38 +0,0 @@
|
|
1
|
-
<%= render Avo::PanelComponent.new(name: @dashboard.name, description: @dashboard.description) do |c| %>
|
2
|
-
<% c.with_bare_content do %>
|
3
|
-
<% if @dashboard.items.present? %>
|
4
|
-
<div class="min-h-24">
|
5
|
-
<%= content_tag(:div, class: "grid gap-4 grid-cols-1 #{@dashboard.classes}") do %>
|
6
|
-
<% @dashboard.items.each do |item| %>
|
7
|
-
<% if item.is_divider? %>
|
8
|
-
<%= render Avo::Dashboards::DividerComponent.new(divider: item) %>
|
9
|
-
<% elsif item.is_card? %>
|
10
|
-
<%= content_tag(:div, class: "relative bg-white rounded shadow-panel space-y-2 #{item.card_classes} overflow-hidden") do %>
|
11
|
-
<turbo-frame id="<%= item.turbo_frame %>"
|
12
|
-
src="<%= item.frame_url(enforced_range: @range, params: params) %>"
|
13
|
-
data-card-index="<%= item.index %>"
|
14
|
-
>
|
15
|
-
<%= render(Avo::LoadingComponent.new(title: item.label)) %>
|
16
|
-
</turbo-frame>
|
17
|
-
<% end %>
|
18
|
-
<% end %>
|
19
|
-
<% end %>
|
20
|
-
<% end %>
|
21
|
-
</div>
|
22
|
-
<% else %>
|
23
|
-
<div class="w-full h-full">
|
24
|
-
<% if Rails.env.development? %>
|
25
|
-
<%= render Avo::PanelComponent.new do |c| %>
|
26
|
-
<% c.with_body do %>
|
27
|
-
<div class="p-6">
|
28
|
-
<%= t 'avo.empty_dashboard_message' %>. <%= link_to 'Docs', 'https://docs.avohq.io/2.0/dashboards.html', target: '_blank' %>
|
29
|
-
</div>
|
30
|
-
<% end %>
|
31
|
-
<% end %>
|
32
|
-
<% end %>
|
33
|
-
|
34
|
-
<%= empty_state message: t('avo.no_cards_present') %>
|
35
|
-
</div>
|
36
|
-
<% end %>
|
37
|
-
<% end %>
|
38
|
-
<% end %>
|
@@ -1,19 +0,0 @@
|
|
1
|
-
<div data-controller="search" class="relative flex global-search rounded border border-gray-200 sm:min-w-[16rem]">
|
2
|
-
<div class="flex-1 text-gray-500"
|
3
|
-
data-search-target="autocomplete"
|
4
|
-
data-search-resource="global"
|
5
|
-
data-translation-keys='{"no_item_found": "<%= I18n.translate 'avo.no_item_found' %>", "placeholder": "<%= I18n.translate 'avo.search.placeholder' %>", "cancel_button": "<%= I18n.translate 'avo.search.cancel_button' %>"}'
|
6
|
-
>
|
7
|
-
</div>
|
8
|
-
<div class="absolute top-1/2 hidden sm:inline-flex text-gray-400 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md cursor-pointer -translate-y-1/2 left-auto right-0 mr-4"
|
9
|
-
data-search-target="button"
|
10
|
-
>
|
11
|
-
<span class="sr-only">Press </span>
|
12
|
-
<kbd class="font-sans">
|
13
|
-
<abbr title="Command" class="no-underline pc:hidden">⌘</abbr>
|
14
|
-
<abbr title="CTRL" class="no-underline mac:hidden">CTRL + </abbr>
|
15
|
-
</kbd>
|
16
|
-
<span class="sr-only"> and </span>
|
17
|
-
<kbd class="font-sans">K</kbd><span class="sr-only"> to search</span>
|
18
|
-
</div>
|
19
|
-
</div>
|
@@ -1,6 +0,0 @@
|
|
1
|
-
<% if license[:id] == 'pro' and license[:valid] == false %>
|
2
|
-
<%= render_license_warning title: 'Trial Mode', message: 'You are experiencing paid features that need to be licensed before deploying this site. Enjoy!' %>
|
3
|
-
<% end %>
|
4
|
-
<% if license[:error].present? && !(Avo.configuration.display_license_request_timeout_error === false && license[:error] === "Request timeout.") %>
|
5
|
-
<%= render_license_warning title: 'Avo HQ Error', message: "#{license[:error]} Checking back every 5 minutes." %>
|
6
|
-
<% end %>
|
data/lib/avo/base_card.rb
DELETED
@@ -1,161 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
class BaseCard
|
3
|
-
include Avo::Concerns::VisibleInDashboard
|
4
|
-
|
5
|
-
class_attribute :id
|
6
|
-
class_attribute :label
|
7
|
-
class_attribute :description
|
8
|
-
class_attribute :cols, default: 1
|
9
|
-
class_attribute :rows, default: 1
|
10
|
-
class_attribute :initial_range
|
11
|
-
class_attribute :ranges, default: []
|
12
|
-
class_attribute :refresh_every
|
13
|
-
class_attribute :display_header, default: true
|
14
|
-
# private
|
15
|
-
class_attribute :result_data
|
16
|
-
class_attribute :query_block
|
17
|
-
|
18
|
-
attr_accessor :dashboard
|
19
|
-
attr_accessor :options
|
20
|
-
attr_accessor :arguments
|
21
|
-
attr_accessor :index
|
22
|
-
attr_accessor :params
|
23
|
-
|
24
|
-
delegate :context, to: ::Avo::App
|
25
|
-
delegate :current_user, to: ::Avo::App
|
26
|
-
delegate :view_context, to: ::Avo::App
|
27
|
-
delegate :params, to: ::Avo::App
|
28
|
-
delegate :request, to: ::Avo::App
|
29
|
-
|
30
|
-
class << self
|
31
|
-
def query(&block)
|
32
|
-
self.query_block = block
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def initialize(dashboard:, options: {}, arguments: {}, index: 0, cols: nil, rows: nil, label: nil, description: nil, refresh_every: nil, visible: nil)
|
37
|
-
@dashboard = dashboard
|
38
|
-
@options = options
|
39
|
-
@arguments = arguments
|
40
|
-
@index = index
|
41
|
-
@cols = cols
|
42
|
-
@rows = rows
|
43
|
-
@label = label
|
44
|
-
@refresh_every = refresh_every
|
45
|
-
@description = description
|
46
|
-
@visible = visible
|
47
|
-
end
|
48
|
-
|
49
|
-
def label
|
50
|
-
return @label.to_s if @label.present?
|
51
|
-
return self.class.label.to_s if self.class.label.present?
|
52
|
-
|
53
|
-
self.class.id.to_s.humanize
|
54
|
-
end
|
55
|
-
|
56
|
-
def description
|
57
|
-
@description || self.class.description
|
58
|
-
end
|
59
|
-
|
60
|
-
def refresh_every
|
61
|
-
@refresh_every || self.class.refresh_every
|
62
|
-
end
|
63
|
-
|
64
|
-
def turbo_frame
|
65
|
-
"#{dashboard.id}_#{id}"
|
66
|
-
end
|
67
|
-
|
68
|
-
def frame_url(enforced_range: nil, params: {})
|
69
|
-
enforced_range ||= initial_range || ranges.first
|
70
|
-
|
71
|
-
Avo::App.view_context.avo.dashboard_card_path(dashboard.id, id, turbo_frame: turbo_frame, index: index, range: enforced_range, **params.permit!)
|
72
|
-
end
|
73
|
-
|
74
|
-
def card_classes
|
75
|
-
result = ""
|
76
|
-
|
77
|
-
# Writing down the classes so TailwindCSS knows not to purge them
|
78
|
-
classes_for_cols = {
|
79
|
-
1 => " sm:col-span-1",
|
80
|
-
2 => " sm:col-span-2",
|
81
|
-
3 => " sm:col-span-3",
|
82
|
-
4 => " sm:col-span-4",
|
83
|
-
5 => " sm:col-span-5",
|
84
|
-
6 => " sm:col-span-6"
|
85
|
-
}
|
86
|
-
|
87
|
-
classes_for_rows = {
|
88
|
-
1 => " h-36",
|
89
|
-
2 => " h-72",
|
90
|
-
3 => " h-[27rem]",
|
91
|
-
4 => " h-[36rem]",
|
92
|
-
5 => " h-[45rem]",
|
93
|
-
6 => " h-[54rem]"
|
94
|
-
}
|
95
|
-
|
96
|
-
result += classes_for_cols[cols.to_i] if classes_for_cols[cols.to_i].present?
|
97
|
-
result += classes_for_rows[rows.to_i] if classes_for_rows[rows.to_i].present?
|
98
|
-
|
99
|
-
result
|
100
|
-
end
|
101
|
-
|
102
|
-
def type
|
103
|
-
return :metric if is_a?(::Avo::Dashboards::MetricCard)
|
104
|
-
return :chartkick if is_a?(::Avo::Dashboards::ChartkickCard)
|
105
|
-
return :partial if is_a?(::Avo::Dashboards::PartialCard)
|
106
|
-
end
|
107
|
-
|
108
|
-
def compute_result
|
109
|
-
Avo::Hosts::DashboardCard.new(card: self, dashboard: dashboard, params: params, context: context, range: range, options: options)
|
110
|
-
.compute_result
|
111
|
-
|
112
|
-
self
|
113
|
-
end
|
114
|
-
|
115
|
-
def hydrate(dashboard: nil)
|
116
|
-
@dashboard = dashboard if dashboard.present?
|
117
|
-
|
118
|
-
self
|
119
|
-
end
|
120
|
-
|
121
|
-
def range
|
122
|
-
return params[:range] if params.dig(:range).present?
|
123
|
-
|
124
|
-
return initial_range if initial_range.present?
|
125
|
-
|
126
|
-
ranges.first
|
127
|
-
end
|
128
|
-
|
129
|
-
def result(data)
|
130
|
-
self.result_data = data
|
131
|
-
|
132
|
-
self
|
133
|
-
end
|
134
|
-
|
135
|
-
def is_card?
|
136
|
-
true
|
137
|
-
end
|
138
|
-
|
139
|
-
def is_divider?
|
140
|
-
false
|
141
|
-
end
|
142
|
-
|
143
|
-
def visible
|
144
|
-
@visible || self.class.visible
|
145
|
-
end
|
146
|
-
|
147
|
-
def call_block
|
148
|
-
::Avo::Hosts::CardVisibility.new(block: visible, card: self, parent: dashboard).handle
|
149
|
-
end
|
150
|
-
|
151
|
-
private
|
152
|
-
|
153
|
-
def cols
|
154
|
-
@cols || self.class.cols
|
155
|
-
end
|
156
|
-
|
157
|
-
def rows
|
158
|
-
@rows || self.class.rows
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
@@ -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,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,53 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
module Concerns
|
3
|
-
module Pagination
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
include Pagy::Backend
|
8
|
-
|
9
|
-
class_attribute :pagination, default: {}
|
10
|
-
|
11
|
-
PAGINATION_METHOD = {
|
12
|
-
default: :pagy,
|
13
|
-
countless: :pagy_countless,
|
14
|
-
} unless defined? PAGINATION_METHOD
|
15
|
-
|
16
|
-
PAGINATION_DEFAULTS = {
|
17
|
-
type: :default,
|
18
|
-
size: [1, 2, 2, 1],
|
19
|
-
} unless defined? PAGINATION_DEFAULTS
|
20
|
-
end
|
21
|
-
|
22
|
-
def pagination_type
|
23
|
-
@pagination_type ||= ActiveSupport::StringInquirer.new(pagination_hash[:type].to_s)
|
24
|
-
end
|
25
|
-
|
26
|
-
def apply_pagination(index_params:, query:)
|
27
|
-
extra_pagy_params = {}
|
28
|
-
|
29
|
-
# Reset open filters when a user navigates to a new page
|
30
|
-
extra_pagy_params[:keep_filters_panel_open] = if params[:keep_filters_panel_open] == "1"
|
31
|
-
"0"
|
32
|
-
end
|
33
|
-
|
34
|
-
send PAGINATION_METHOD[pagination_type.to_sym],
|
35
|
-
query,
|
36
|
-
items: index_params[:per_page],
|
37
|
-
link_extra: "data-turbo-frame=\"#{params[:turbo_frame]}\"",
|
38
|
-
params: extra_pagy_params,
|
39
|
-
size: pagination_hash[:size]
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def pagination_hash
|
45
|
-
@pagination ||= PAGINATION_DEFAULTS.merge Avo::ExecutionContext.new(
|
46
|
-
target: pagination,
|
47
|
-
resource: self,
|
48
|
-
view: @view
|
49
|
-
).handle
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|