avo 2.44.0 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of avo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +28 -26
- data/Gemfile.lock +231 -161
- data/README.md +19 -27
- data/Rakefile +2 -0
- data/app/assets/stylesheets/avo.base.css +1 -1
- data/app/assets/svgs/font.svg +1 -0
- data/app/assets/svgs/triangle-up.svg +1 -0
- data/app/components/avo/actions_component.html.erb +19 -5
- data/app/components/avo/actions_component.rb +39 -19
- data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
- data/app/components/avo/asset_manager/javascript_component.rb +13 -0
- data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
- data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
- data/app/components/avo/base_component.rb +15 -12
- data/app/components/avo/button_component.rb +20 -3
- data/app/components/avo/empty_state_component.rb +1 -1
- data/app/components/avo/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/field_wrapper_component.rb +9 -15
- data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +75 -79
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
- data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
- data/app/components/avo/fields/common/badge_viewer_component.rb +1 -1
- data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
- data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
- data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
- data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
- data/app/components/avo/fields/common/heading_component.html.erb +3 -8
- data/app/components/avo/fields/common/heading_component.rb +1 -3
- data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
- data/app/components/avo/fields/common/key_value_component.rb +2 -2
- data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
- data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
- data/app/components/avo/fields/edit_component.rb +2 -2
- data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
- data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
- data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/index_component.rb +6 -6
- data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
- data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
- data/app/components/avo/fields/preview_field/index_component.rb +4 -0
- data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/show_component.rb +5 -2
- data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
- data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
- data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
- data/app/components/avo/filters_component.html.erb +9 -3
- data/app/components/avo/filters_component.rb +4 -4
- data/app/components/avo/index/field_wrapper_component.rb +1 -13
- data/app/components/avo/index/grid_item_component.html.erb +13 -36
- data/app/components/avo/index/grid_item_component.rb +43 -16
- data/app/components/avo/index/resource_controls_component.html.erb +3 -81
- data/app/components/avo/index/resource_controls_component.rb +125 -18
- data/app/components/avo/index/resource_grid_component.html.erb +5 -3
- data/app/components/avo/index/resource_grid_component.rb +5 -2
- data/app/components/avo/index/resource_map_component.html.erb +1 -1
- data/app/components/avo/index/resource_map_component.rb +3 -3
- data/app/components/avo/index/resource_table_component.html.erb +5 -4
- data/app/components/avo/index/resource_table_component.rb +24 -7
- data/app/components/avo/index/table_row_component.html.erb +9 -5
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/items/panel_component.html.erb +25 -0
- data/app/components/avo/items/panel_component.rb +43 -0
- data/app/components/avo/items/switcher_component.html.erb +17 -0
- data/app/components/avo/items/switcher_component.rb +79 -0
- data/app/components/avo/items/visible_items_component.html.erb +10 -0
- data/app/components/avo/items/visible_items_component.rb +11 -0
- data/app/components/avo/modal_component.html.erb +3 -4
- data/app/components/avo/paginator_component.html.erb +29 -40
- data/app/components/avo/paginator_component.rb +23 -5
- data/app/components/avo/panel_component.html.erb +7 -5
- data/app/components/avo/referrer_params_component.html.erb +1 -1
- data/app/components/avo/resource_component.rb +205 -26
- data/app/components/avo/resource_sidebar_component.html.erb +15 -18
- data/app/components/avo/resource_sidebar_component.rb +5 -3
- data/app/components/avo/sidebar/link_component.rb +1 -1
- data/app/components/avo/sidebar_component.html.erb +10 -3
- data/app/components/avo/sidebar_component.rb +5 -3
- data/app/components/avo/sidebar_profile_component.html.erb +18 -12
- data/app/components/avo/tab_group_component.html.erb +14 -8
- data/app/components/avo/tab_group_component.rb +1 -6
- data/app/components/avo/tab_switcher_component.html.erb +17 -40
- data/app/components/avo/tab_switcher_component.rb +6 -41
- data/app/components/avo/views/resource_edit_component.html.erb +23 -84
- data/app/components/avo/views/resource_edit_component.rb +20 -19
- data/app/components/avo/views/resource_index_component.html.erb +42 -47
- data/app/components/avo/views/resource_index_component.rb +76 -13
- data/app/components/avo/views/resource_show_component.html.erb +16 -177
- data/app/components/avo/views/resource_show_component.rb +16 -10
- data/app/controllers/avo/actions_controller.rb +29 -31
- data/app/controllers/avo/application_controller.rb +119 -181
- data/app/controllers/avo/associations_controller.rb +34 -43
- data/app/controllers/avo/attachments_controller.rb +4 -4
- data/app/controllers/avo/base_controller.rb +145 -98
- data/app/controllers/avo/debug_controller.rb +17 -5
- data/app/controllers/avo/home_controller.rb +1 -1
- data/app/controllers/avo/search_controller.rb +56 -50
- data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
- data/app/helpers/avo/application_helper.rb +18 -8
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +28 -12
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/controllers/action_controller.js +3 -1
- data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
- data/app/javascript/js/controllers/filter_controller.js +1 -1
- data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
- data/app/javascript/js/controllers/preview_controller.js +24 -0
- data/app/javascript/js/controllers/search_controller.js +4 -2
- data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
- data/app/javascript/js/controllers/toggle_controller.js +48 -0
- data/app/javascript/js/controllers.js +11 -5
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/actions/show.html.erb +9 -5
- data/app/views/avo/associations/new.html.erb +2 -2
- data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
- data/app/views/avo/base/edit.html.erb +1 -1
- data/app/views/avo/base/index.html.erb +4 -3
- data/app/views/avo/base/new.html.erb +2 -1
- data/app/views/avo/base/preview.html.erb +19 -0
- data/app/views/avo/base/show.html.erb +2 -2
- data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
- data/app/views/avo/debug/report.html.erb +32 -17
- data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +1 -1
- data/app/views/avo/partials/_footer.html.erb +1 -1
- data/app/views/avo/partials/_javascript.html.erb +5 -0
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +3 -5
- data/app/views/avo/partials/_resource_search.html.erb +1 -0
- data/app/views/avo/partials/_table_header.html.erb +5 -11
- data/app/views/layouts/avo/application.html.erb +5 -4
- data/avo.gemspec +10 -8
- data/bin/dev +3 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +2 -0
- data/config/master.key +1 -0
- data/config/routes.rb +7 -10
- data/db/factories.rb +6 -0
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +78 -60
- data/lib/avo/base_resource.rb +286 -225
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/borrow_items_holder.rb +35 -0
- data/lib/avo/concerns/breadcrumbs.rb +2 -2
- data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
- data/lib/avo/concerns/filters_session_handler.rb +7 -5
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_description.rb +23 -0
- data/lib/avo/concerns/has_helpers.rb +18 -0
- data/lib/avo/concerns/has_item_type.rb +42 -0
- data/lib/avo/concerns/has_items.rb +339 -0
- data/lib/avo/concerns/hydration.rb +17 -0
- data/lib/avo/concerns/is_resource_item.rb +16 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/model_class_constantized.rb +0 -2
- data/lib/avo/concerns/pagination.rb +53 -0
- data/lib/avo/concerns/visible_in_different_views.rb +132 -0
- data/lib/avo/concerns/visible_items.rb +7 -38
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +28 -11
- data/lib/avo/current.rb +39 -0
- data/lib/avo/dsl/field_parser.rb +3 -3
- data/lib/avo/dynamic_router.rb +18 -3
- data/lib/avo/engine.rb +35 -30
- data/lib/avo/error_manager.rb +25 -0
- data/lib/avo/execution_context.rb +14 -15
- data/lib/avo/fields/base_field.rb +84 -121
- data/lib/avo/fields/belongs_to_field.rb +19 -23
- data/lib/avo/fields/concerns/file_authorization.rb +2 -2
- data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
- data/lib/avo/fields/concerns/has_default.rb +1 -5
- data/lib/avo/fields/concerns/has_field_name.rb +22 -0
- data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
- data/lib/avo/fields/concerns/is_disabled.rb +1 -5
- data/lib/avo/fields/concerns/is_readonly.rb +1 -5
- data/lib/avo/fields/concerns/is_required.rb +5 -7
- data/lib/avo/fields/concerns/is_searchable.rb +15 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/concerns/use_view_components.rb +45 -0
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_time_field.rb +1 -5
- data/lib/avo/fields/external_image_field.rb +2 -2
- data/lib/avo/fields/field_manager.rb +55 -0
- data/lib/avo/fields/file_field.rb +2 -2
- data/lib/avo/fields/gravatar_field.rb +2 -2
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +21 -17
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +8 -12
- data/lib/avo/fields/heading_field.rb +9 -14
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +3 -3
- data/lib/avo/fields/location_field.rb +10 -10
- data/lib/avo/fields/password_field.rb +1 -1
- data/lib/avo/fields/preview_field.rb +14 -0
- data/lib/avo/fields/select_field.rb +12 -8
- data/lib/avo/fields/status_field.rb +7 -1
- data/lib/avo/fields/text_field.rb +2 -2
- data/lib/avo/filters/base_filter.rb +9 -4
- data/lib/avo/html/builder.rb +8 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +11 -73
- data/lib/avo/licensing/license.rb +5 -1
- data/lib/avo/licensing/license_manager.rb +1 -1
- data/lib/avo/licensing/pro_license.rb +1 -7
- data/lib/avo/loaders/fields_loader.rb +7 -1
- data/lib/avo/plugin.rb +36 -0
- data/lib/avo/plugin_manager.rb +56 -0
- data/lib/avo/prefixed_test_helpers.rb +20 -0
- data/lib/avo/reloader.rb +3 -0
- data/lib/avo/resources/controls/actions_list.rb +7 -12
- data/lib/avo/resources/controls/attach_button.rb +15 -0
- data/lib/avo/resources/controls/back_button.rb +1 -1
- data/lib/avo/resources/controls/base_control.rb +15 -49
- data/lib/avo/resources/controls/create_button.rb +15 -0
- data/lib/avo/resources/controls/delete_button.rb +5 -1
- data/lib/avo/resources/controls/detach_button.rb +4 -1
- data/lib/avo/resources/controls/edit_button.rb +4 -1
- data/lib/avo/resources/controls/order_controls.rb +8 -0
- data/lib/avo/resources/controls/save_button.rb +13 -0
- data/lib/avo/resources/controls/show_button.rb +15 -0
- data/lib/avo/resources/items/holder.rb +96 -0
- data/lib/avo/resources/items/item_group.rb +44 -0
- data/lib/avo/resources/items/main_panel.rb +12 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/row.rb +42 -0
- data/lib/avo/resources/items/sidebar.rb +46 -0
- data/lib/avo/resources/items/tab.rb +54 -0
- data/lib/avo/resources/items/tab_group.rb +62 -0
- data/lib/avo/resources/resource_manager.rb +179 -0
- data/lib/avo/services/authorization_service.rb +11 -110
- data/lib/avo/services/debug_service.rb +93 -0
- data/lib/avo/services/encryption_service.rb +8 -12
- data/lib/avo/services/telemetry_service.rb +85 -0
- data/lib/avo/test_helpers.rb +362 -0
- data/lib/avo/tools/tool_manager.rb +30 -0
- data/lib/avo/version.rb +1 -1
- data/lib/avo/view_inquirer.rb +36 -0
- data/lib/avo.rb +109 -24
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/concerns/parent_controller.rb +20 -0
- data/lib/generators/avo/controller_generator.rb +3 -0
- data/lib/generators/avo/eject_generator.rb +180 -15
- data/lib/generators/avo/field_generator.rb +49 -2
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/js/install_generator.rb +2 -2
- data/lib/generators/avo/resource_generator.rb +12 -9
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
- data/lib/generators/avo/templates/action.tt +8 -6
- data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
- data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
- data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
- data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
- data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
- data/lib/generators/avo/templates/initializer/avo.tt +7 -3
- data/lib/generators/avo/templates/locales/avo.ar.yml +7 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +6 -3
- data/lib/generators/avo/templates/locales/avo.es.yml +127 -0
- data/lib/generators/avo/templates/locales/avo.fr.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.nb.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.nn.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.pt.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.ro.yml +8 -5
- data/lib/generators/avo/templates/locales/avo.tr.yml +3 -0
- data/lib/generators/avo/templates/resource/controller.tt +1 -1
- data/lib/generators/avo/templates/resource/resource.tt +7 -7
- data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
- data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
- data/lib/generators/avo/templates/scope.tt +6 -0
- data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
- data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
- data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
- data/lib/tasks/avo_tasks.rake +72 -4
- data/public/avo-assets/avo.base.css +1893 -1187
- data/public/avo-assets/avo.base.js +217 -305
- data/public/avo-assets/avo.base.js.map +3 -3
- data/public/avo-assets/avo.css +9744 -0
- data/public/avo-assets/avo.js +513 -0
- data/public/avo-assets/avo.js.map +7 -0
- data/tailwind.custom.js +47 -0
- data/tailwind.preset.js +152 -0
- metadata +107 -114
- data/app/components/avo/card_component.html.erb +0 -46
- data/app/components/avo/card_component.rb +0 -25
- data/app/components/avo/dashboards/divider_component.html.erb +0 -9
- data/app/components/avo/dashboards/divider_component.rb +0 -19
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
- data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
- data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
- data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
- data/app/components/avo/fields/tags_field/index_component.rb +0 -9
- data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/tags_field/show_component.rb +0 -5
- data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
- data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
- data/app/components/avo/index/ordering/base_component.rb +0 -9
- data/app/components/avo/index/ordering/button_component.html.erb +0 -11
- data/app/components/avo/index/ordering/button_component.rb +0 -23
- data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
- data/app/components/avo/index/ordering/buttons_component.rb +0 -47
- data/app/components/avo/item_switcher_component.html.erb +0 -27
- data/app/components/avo/item_switcher_component.rb +0 -48
- data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
- data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
- data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
- data/app/controllers/avo/dashboards_controller.rb +0 -22
- data/app/controllers/avo/reorder_controller.rb +0 -25
- data/app/javascript/js/controllers/base_controller.js +0 -22
- data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
- data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
- data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
- data/app/views/avo/dashboards/cards/show.html.erb +0 -3
- data/app/views/avo/dashboards/show.html.erb +0 -38
- data/app/views/avo/partials/_global_search.html.erb +0 -19
- data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
- data/lib/avo/app.rb +0 -237
- data/lib/avo/base_card.rb +0 -161
- data/lib/avo/concerns/fetches_things.rb +0 -150
- data/lib/avo/concerns/handles_field_args.rb +0 -47
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_fields.rb +0 -334
- data/lib/avo/concerns/has_html_attributes.rb +0 -108
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- data/lib/avo/dashboards/base_dashboard.rb +0 -89
- data/lib/avo/dashboards/base_divider.rb +0 -35
- data/lib/avo/dashboards/chartkick_card.rb +0 -77
- data/lib/avo/dashboards/dashboard_card.rb +0 -6
- data/lib/avo/dashboards/metric_card.rb +0 -9
- data/lib/avo/dashboards/partial_card.rb +0 -7
- data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
- data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
- data/lib/avo/fields/tags_field.rb +0 -102
- data/lib/avo/grid_collector.rb +0 -42
- data/lib/avo/hosts/association_scope_host.rb +0 -8
- data/lib/avo/hosts/base_host.rb +0 -25
- data/lib/avo/hosts/card_visibility.rb +0 -20
- data/lib/avo/hosts/dashboard_card.rb +0 -22
- data/lib/avo/hosts/dashboard_visibility.rb +0 -19
- data/lib/avo/hosts/ordering.rb +0 -22
- data/lib/avo/hosts/record_host.rb +0 -7
- data/lib/avo/hosts/resource_record_host.rb +0 -7
- data/lib/avo/hosts/resource_view_record_host.rb +0 -7
- data/lib/avo/hosts/search_scope_host.rb +0 -7
- data/lib/avo/hosts/view_record_host.rb +0 -7
- data/lib/avo/hosts/visibility_host.rb +0 -12
- data/lib/avo/items_holder.rb +0 -96
- data/lib/avo/main_panel.rb +0 -3
- data/lib/avo/menu/base_item.rb +0 -25
- data/lib/avo/menu/builder.rb +0 -82
- data/lib/avo/menu/dashboard.rb +0 -22
- data/lib/avo/menu/group.rb +0 -2
- data/lib/avo/menu/link.rb +0 -6
- data/lib/avo/menu/menu.rb +0 -2
- data/lib/avo/menu/resource.rb +0 -22
- data/lib/avo/menu/section.rb +0 -2
- data/lib/avo/panel.rb +0 -24
- data/lib/avo/panel_builder.rb +0 -25
- data/lib/avo/resources/controls/action.rb +0 -38
- data/lib/avo/resources/controls/execution_context.rb +0 -58
- data/lib/avo/resources/controls/items_holder.rb +0 -19
- data/lib/avo/resources/controls/link_to.rb +0 -27
- data/lib/avo/row.rb +0 -26
- data/lib/avo/row_builder.rb +0 -24
- data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
- data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
- data/lib/avo/sidebar.rb +0 -30
- data/lib/avo/sidebar_builder.rb +0 -24
- data/lib/avo/tab.rb +0 -72
- data/lib/avo/tab_builder.rb +0 -25
- data/lib/avo/tab_group.rb +0 -42
- data/lib/avo/tab_group_builder.rb +0 -43
- data/lib/avo/tools_manager.rb +0 -11
- data/lib/generators/avo/card/chartkick_generator.rb +0 -18
- data/lib/generators/avo/card/metric_generator.rb +0 -18
- data/lib/generators/avo/card/partial_generator.rb +0 -19
- data/lib/generators/avo/templates/js/avo.custom.js +0 -2
- data/lib/generators/avo/templates/standalone_action.tt +0 -8
- /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -1,127 +0,0 @@
|
|
1
|
-
import { first, isObject, merge } from 'lodash'
|
2
|
-
import Tagify from '@yaireo/tagify'
|
3
|
-
import URI from 'urijs'
|
4
|
-
|
5
|
-
import { suggestionItemTemplate, tagTemplate } from './tags_field_helpers'
|
6
|
-
import BaseController from '../base_controller'
|
7
|
-
import debouncePromise from '../../helpers/debounce_promise'
|
8
|
-
|
9
|
-
export default class extends BaseController {
|
10
|
-
static targets = ['input', 'fakeInput'];
|
11
|
-
|
12
|
-
static values = {
|
13
|
-
whitelistItems: { type: Array, default: [] },
|
14
|
-
disallowedItems: { type: Array, default: [] },
|
15
|
-
enforceSuggestions: { type: Boolean, default: false },
|
16
|
-
closeOnSelect: { type: Boolean, default: false },
|
17
|
-
delimiters: { type: Array, default: [] },
|
18
|
-
suggestionsMaxItems: { type: Number, default: 20 },
|
19
|
-
mode: String,
|
20
|
-
fetchValuesFrom: String,
|
21
|
-
}
|
22
|
-
|
23
|
-
tagify = null;
|
24
|
-
|
25
|
-
searchDebounce = 500
|
26
|
-
|
27
|
-
debouncedFetch = debouncePromise(fetch, this.searchDebounce);
|
28
|
-
|
29
|
-
get suggestionsAreObjects() {
|
30
|
-
return isObject(first(this.whitelistItemsValue)) || this.fetchValuesFromValue
|
31
|
-
}
|
32
|
-
|
33
|
-
get tagifyOptions() {
|
34
|
-
let options = {
|
35
|
-
whitelist: this.whitelistItemsValue,
|
36
|
-
blacklist: this.disallowedItemsValue,
|
37
|
-
enforceWhitelist: this.enforceSuggestionsValue || this.fetchValuesFromValue,
|
38
|
-
delimiters: this.delimitersValue.join('|'),
|
39
|
-
dropdown: {
|
40
|
-
maxItems: this.suggestionsMaxItemsValue,
|
41
|
-
enabled: 0,
|
42
|
-
searchKeys: [this.labelAttributeValue],
|
43
|
-
closeOnSelect: this.closeOnSelectValue,
|
44
|
-
},
|
45
|
-
}
|
46
|
-
|
47
|
-
if (this.modeValue) {
|
48
|
-
options.mode = this.modeValue // null or "select"
|
49
|
-
}
|
50
|
-
|
51
|
-
if (this.suggestionsAreObjects) {
|
52
|
-
options = merge(options, {
|
53
|
-
tagTextProp: 'label',
|
54
|
-
dropdown: {
|
55
|
-
searchKeys: ['label'],
|
56
|
-
mapValueTo: 'value',
|
57
|
-
},
|
58
|
-
templates: {
|
59
|
-
tag: tagTemplate,
|
60
|
-
dropdownItem: suggestionItemTemplate,
|
61
|
-
},
|
62
|
-
originalInputValueFormat: (valuesArr) => valuesArr.map((item) => item.value),
|
63
|
-
})
|
64
|
-
} else {
|
65
|
-
options = merge(options, {
|
66
|
-
originalInputValueFormat: (valuesArr) => valuesArr.map((item) => item.value).join(','),
|
67
|
-
})
|
68
|
-
}
|
69
|
-
|
70
|
-
return options
|
71
|
-
}
|
72
|
-
|
73
|
-
connect() {
|
74
|
-
if (this.hasInputTarget) {
|
75
|
-
this.hideFakeInput()
|
76
|
-
this.showRealInput()
|
77
|
-
this.initTagify()
|
78
|
-
}
|
79
|
-
}
|
80
|
-
|
81
|
-
initTagify() {
|
82
|
-
this.tagify = new Tagify(this.inputTarget, this.tagifyOptions)
|
83
|
-
const that = this
|
84
|
-
|
85
|
-
function onInput(e) {
|
86
|
-
// Create the URL from which to fetch the values
|
87
|
-
const query = e.detail.value
|
88
|
-
const uri = new URI(that.fetchValuesFromValue)
|
89
|
-
uri.addSearch({
|
90
|
-
q: query,
|
91
|
-
})
|
92
|
-
|
93
|
-
// reset current whitelist
|
94
|
-
that.tagify.whitelist = null
|
95
|
-
// show the loader animation
|
96
|
-
that.tagify.loading(true)
|
97
|
-
|
98
|
-
// get new whitelist from a request
|
99
|
-
that.fetchResults(uri.toString())
|
100
|
-
.then((result) => {
|
101
|
-
that.tagify.settings.whitelist = result // add already-existing tags to the new whitelist array
|
102
|
-
|
103
|
-
that.tagify
|
104
|
-
.loading(false)
|
105
|
-
.dropdown.show(e.detail.value) // render the suggestions dropdown.
|
106
|
-
})
|
107
|
-
.catch(() => that.tagify.dropdown.hide())
|
108
|
-
}
|
109
|
-
|
110
|
-
if (this.fetchValuesFromValue) {
|
111
|
-
this.tagify.on('input', onInput)
|
112
|
-
}
|
113
|
-
}
|
114
|
-
|
115
|
-
fetchResults(endpoint) {
|
116
|
-
return this.debouncedFetch(endpoint)
|
117
|
-
.then((response) => response.json())
|
118
|
-
}
|
119
|
-
|
120
|
-
hideFakeInput() {
|
121
|
-
this.fakeInputTarget.classList.add('hidden')
|
122
|
-
}
|
123
|
-
|
124
|
-
showRealInput() {
|
125
|
-
this.inputTarget.classList.remove('hidden')
|
126
|
-
}
|
127
|
-
}
|
@@ -1,18 +0,0 @@
|
|
1
|
-
import { Controller } from '@hotwired/stimulus'
|
2
|
-
import { useClickOutside } from 'stimulus-use'
|
3
|
-
|
4
|
-
export default class extends Controller {
|
5
|
-
static targets = ['panel']
|
6
|
-
|
7
|
-
connect() {
|
8
|
-
useClickOutside(this)
|
9
|
-
}
|
10
|
-
|
11
|
-
clickOutside() {
|
12
|
-
this.panelTarget.classList.add('hidden')
|
13
|
-
}
|
14
|
-
|
15
|
-
togglePanel() {
|
16
|
-
this.panelTarget.classList.toggle('hidden')
|
17
|
-
}
|
18
|
-
}
|
@@ -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/app.rb
DELETED
@@ -1,237 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
class App
|
3
|
-
include Avo::Concerns::FetchesThings
|
4
|
-
|
5
|
-
class_attribute :resources, default: []
|
6
|
-
class_attribute :dashboards, default: []
|
7
|
-
class_attribute :cache_store, default: nil
|
8
|
-
class_attribute :fields, default: []
|
9
|
-
class_attribute :request, default: nil
|
10
|
-
class_attribute :context, default: nil
|
11
|
-
class_attribute :license, default: nil
|
12
|
-
class_attribute :current_user, default: nil
|
13
|
-
class_attribute :root_path, default: nil
|
14
|
-
class_attribute :view_context, default: nil
|
15
|
-
class_attribute :params, default: {}
|
16
|
-
class_attribute :translation_enabled, default: false
|
17
|
-
class_attribute :error_messages
|
18
|
-
|
19
|
-
class << self
|
20
|
-
def eager_load(entity)
|
21
|
-
paths = Avo::ENTITIES.fetch entity
|
22
|
-
|
23
|
-
return unless paths.present?
|
24
|
-
|
25
|
-
pathname = Rails.root.join(*paths)
|
26
|
-
if pathname.directory?
|
27
|
-
Rails.autoloaders.main.eager_load_dir(pathname.to_s)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def boot
|
32
|
-
init_fields
|
33
|
-
|
34
|
-
self.cache_store = Avo.configuration.cache_store
|
35
|
-
end
|
36
|
-
|
37
|
-
# Generate a dynamic root path using the URIService
|
38
|
-
def root_path(paths: [], query: {}, **args)
|
39
|
-
Avo::Services::URIService.parse(view_context.avo.root_url.to_s)
|
40
|
-
.append_paths(paths)
|
41
|
-
.append_query(query)
|
42
|
-
.to_s
|
43
|
-
end
|
44
|
-
|
45
|
-
def init(request:, context:, current_user:, view_context:, params:)
|
46
|
-
self.error_messages = []
|
47
|
-
self.context = context
|
48
|
-
self.current_user = current_user
|
49
|
-
self.params = params
|
50
|
-
self.request = request
|
51
|
-
self.view_context = view_context
|
52
|
-
|
53
|
-
self.license = Licensing::LicenseManager.new(Licensing::HQ.new(request).response).license
|
54
|
-
self.translation_enabled = license.has(:localization)
|
55
|
-
|
56
|
-
# Set the current host for ActiveStorage
|
57
|
-
begin
|
58
|
-
if defined?(ActiveStorage::Current)
|
59
|
-
if Rails::VERSION::MAJOR === 6
|
60
|
-
ActiveStorage::Current.host = request.base_url
|
61
|
-
elsif Rails::VERSION::MAJOR === 7
|
62
|
-
ActiveStorage::Current.url_options = {protocol: request.protocol, host: request.host, port: request.port}
|
63
|
-
end
|
64
|
-
end
|
65
|
-
rescue => exception
|
66
|
-
Rails.logger.debug "[Avo] Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
|
67
|
-
end
|
68
|
-
|
69
|
-
check_bad_resources
|
70
|
-
init_resources
|
71
|
-
init_dashboards if license.has_with_trial(:dashboards)
|
72
|
-
end
|
73
|
-
|
74
|
-
# This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
|
75
|
-
# so later we can instantiate them on our resources.
|
76
|
-
#
|
77
|
-
# If the field has their `def_method` set up it will follow that convention, if not it will snake_case the name:
|
78
|
-
#
|
79
|
-
# Avo::Fields::TextField -> text
|
80
|
-
# Avo::Fields::DateTimeField -> date_time
|
81
|
-
def init_fields
|
82
|
-
Avo::Fields::BaseField.descendants.each do |class_name|
|
83
|
-
next if class_name.to_s == "BaseField"
|
84
|
-
|
85
|
-
if class_name.to_s.end_with? "Field"
|
86
|
-
load_field class_name.get_field_name, class_name
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def load_field(method_name, klass)
|
92
|
-
fields.push(
|
93
|
-
name: method_name,
|
94
|
-
class: klass
|
95
|
-
)
|
96
|
-
end
|
97
|
-
|
98
|
-
def check_bad_resources
|
99
|
-
resources.each do |resource|
|
100
|
-
has_model = resource.model_class.present?
|
101
|
-
|
102
|
-
unless has_model
|
103
|
-
possible_model = resource.class.to_s.gsub "Resource", ""
|
104
|
-
|
105
|
-
Avo::App.error_messages.push({
|
106
|
-
url: "https://docs.avohq.io/2.0/resources.html#custom-model-class",
|
107
|
-
target: "_blank",
|
108
|
-
message: "#{resource.class.to_s} 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"
|
109
|
-
})
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# Fetches the resources available to the application.
|
115
|
-
# We have two ways of doing that.
|
116
|
-
#
|
117
|
-
# 1. Through eager loading.
|
118
|
-
# We automatically eager load the resources directory and fetch the descendants from the scanned files.
|
119
|
-
# This is the simple way to get started.
|
120
|
-
#
|
121
|
-
# 2. Manually, declared by the user.
|
122
|
-
# We have this option to load the resources because when they are loaded automatically through eager loading,
|
123
|
-
# those Resource classes and their methods may trigger loading other classes. And that may disrupt Rails booting process.
|
124
|
-
# Ex: AdminResource may use self.model_class = User. That will trigger Ruby to load the User class and itself load
|
125
|
-
# other classes in a chain reaction.
|
126
|
-
# The scenario that comes up most often is when Rails boots, the routes are being computed which eager loads the resource files.
|
127
|
-
# At that boot time some migration might have not been run yet, but Rails tries to access them through model associations,
|
128
|
-
# and they are not available.
|
129
|
-
#
|
130
|
-
# To enable this feature add a `resources` array config in your Avo initializer.
|
131
|
-
# config.resources = [
|
132
|
-
# "UserResource",
|
133
|
-
# "FishResource",
|
134
|
-
# ]
|
135
|
-
def fetch_resources
|
136
|
-
resources = if Avo.configuration.resources.nil?
|
137
|
-
BaseResource.descendants
|
138
|
-
else
|
139
|
-
Avo.configuration.resources
|
140
|
-
end
|
141
|
-
|
142
|
-
resources.map do |resource|
|
143
|
-
if resource.is_a?(Class)
|
144
|
-
resource
|
145
|
-
else
|
146
|
-
resource.to_s.safe_constantize
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
def init_resources
|
152
|
-
self.resources = fetch_resources
|
153
|
-
.select do |resource|
|
154
|
-
# Remove the BaseResource. We only need the descendants
|
155
|
-
resource != BaseResource
|
156
|
-
end
|
157
|
-
.uniq do |klass|
|
158
|
-
# On invalid resource configuration the resource classes get duplicated in `ObjectSpace`
|
159
|
-
# We need to de-duplicate them
|
160
|
-
klass.name
|
161
|
-
end
|
162
|
-
.map do |resource|
|
163
|
-
resource.new if resource.is_a? Class
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def init_dashboards
|
168
|
-
eager_load :dashboards unless Rails.application.config.eager_load
|
169
|
-
|
170
|
-
self.dashboards = Dashboards::BaseDashboard.descendants
|
171
|
-
.select do |dashboard|
|
172
|
-
dashboard != Dashboards::BaseDashboard
|
173
|
-
end
|
174
|
-
.uniq do |dashboard|
|
175
|
-
dashboard.id
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def has_main_menu?
|
180
|
-
return false if Avo::App.license.lacks_with_trial(:menu_editor)
|
181
|
-
return false if Avo.configuration.main_menu.nil?
|
182
|
-
|
183
|
-
true
|
184
|
-
end
|
185
|
-
|
186
|
-
def has_profile_menu?
|
187
|
-
return false if Avo::App.license.lacks_with_trial(:menu_editor)
|
188
|
-
return false if Avo.configuration.profile_menu.nil?
|
189
|
-
|
190
|
-
true
|
191
|
-
end
|
192
|
-
|
193
|
-
def main_menu
|
194
|
-
# Return empty menu if the app doesn't have the profile menu configured
|
195
|
-
return Avo::Menu::Builder.new.build unless has_main_menu?
|
196
|
-
|
197
|
-
Avo::Menu::Builder.parse_menu(&Avo.configuration.main_menu)
|
198
|
-
end
|
199
|
-
|
200
|
-
def profile_menu
|
201
|
-
# Return empty menu if the app doesn't have the profile menu configured
|
202
|
-
return Avo::Menu::Builder.new.build unless has_profile_menu?
|
203
|
-
|
204
|
-
Avo::Menu::Builder.parse_menu(&Avo.configuration.profile_menu)
|
205
|
-
end
|
206
|
-
|
207
|
-
def debug_report(request = nil)
|
208
|
-
payload = {}
|
209
|
-
|
210
|
-
hq = Avo::Licensing::HQ.new(request)
|
211
|
-
|
212
|
-
payload[:license_id] = Avo::App&.license&.id
|
213
|
-
payload[:license_valid] = Avo::App&.license&.valid?
|
214
|
-
payload[:license_payload] = Avo::App&.license&.payload
|
215
|
-
payload[:license_response] = Avo::App&.license&.response
|
216
|
-
payload[:hq_payload] = hq&.payload
|
217
|
-
payload[:thread_count] = get_thread_count
|
218
|
-
payload[:license_abilities] = Avo::App&.license&.abilities
|
219
|
-
payload[:cache_store] = self.cache_store&.class&.to_s
|
220
|
-
payload[:avo_metadata] = hq&.avo_metadata
|
221
|
-
payload[:app_timezone] = Time.current.zone
|
222
|
-
payload[:cache_key] = Avo::Licensing::HQ.cache_key
|
223
|
-
payload[:cache_key_contents] = hq&.cached_response
|
224
|
-
|
225
|
-
payload
|
226
|
-
rescue => e
|
227
|
-
e
|
228
|
-
end
|
229
|
-
|
230
|
-
def get_thread_count
|
231
|
-
Thread.list.select {|thread| thread.status == "run"}.count
|
232
|
-
rescue => e
|
233
|
-
e
|
234
|
-
end
|
235
|
-
end
|
236
|
-
end
|
237
|
-
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
|