avo 2.49.0 → 3.0.0.beta1
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 +26 -25
- data/Gemfile.lock +179 -147
- data/README.md +1 -1
- data/app/assets/stylesheets/avo.base.css +0 -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 +37 -17
- 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 +15 -26
- 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 +96 -118
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
- 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_group_field/edit_component.html.erb +3 -3
- 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.rb +3 -3
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
- data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/file_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 +3 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
- data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/index_component.rb +5 -5
- 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 +4 -1
- data/app/components/avo/fields/trix_field/edit_component.rb +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 +0 -12
- 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 +124 -17
- 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 +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.rb +2 -2
- 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 -6
- data/app/components/avo/referrer_params_component.html.erb +1 -2
- data/app/components/avo/resource_component.rb +189 -14
- data/app/components/avo/resource_sidebar_component.html.erb +6 -2
- data/app/components/avo/resource_sidebar_component.rb +1 -1
- 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 +15 -8
- 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 +12 -48
- data/app/components/avo/views/resource_edit_component.rb +7 -18
- data/app/components/avo/views/resource_index_component.html.erb +41 -47
- data/app/components/avo/views/resource_index_component.rb +62 -12
- data/app/components/avo/views/resource_show_component.html.erb +6 -149
- data/app/components/avo/views/resource_show_component.rb +6 -11
- data/app/controllers/avo/actions_controller.rb +27 -24
- data/app/controllers/avo/application_controller.rb +105 -151
- 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 +102 -102
- 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 +30 -51
- data/app/controllers/avo/team_users_controller.rb +4 -0
- data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
- data/app/helpers/avo/application_helper.rb +15 -9
- 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 -3
- 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/date_field_controller.js +3 -7
- data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
- 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 +2 -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 +10 -6
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
- data/app/views/avo/actions/show.html.erb +10 -7
- data/app/views/avo/associations/new.html.erb +2 -2
- data/app/views/avo/base/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 -14
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_footer.html.erb +1 -1
- data/app/views/avo/partials/_javascript.html.erb +5 -0
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +3 -5
- data/app/views/avo/partials/_table_header.html.erb +5 -11
- data/app/views/layouts/avo/application.html.erb +4 -2
- data/avo.gemspec +11 -12
- data/bin/dev +1 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +0 -2
- data/config/master.key +1 -0
- data/config/routes.rb +6 -10
- data/db/factories.rb +7 -1
- data/lib/avo/action_model.rb +20 -0
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +57 -42
- data/lib/avo/base_resource.rb +264 -227
- data/lib/avo/base_resource_tool.rb +9 -16
- 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 +5 -3
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_description.rb +23 -0
- data/lib/avo/concerns/has_item_type.rb +42 -0
- data/lib/avo/concerns/has_items.rb +325 -0
- 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/model_class_constantized.rb +0 -2
- data/lib/avo/concerns/visible_in_different_views.rb +126 -0
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +1 -37
- data/lib/avo/current.rb +39 -0
- data/lib/avo/dsl/field_parser.rb +1 -1
- 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 +10 -14
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +91 -106
- data/lib/avo/fields/belongs_to_field.rb +18 -22
- 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 +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_time_field.rb +3 -14
- data/lib/avo/fields/field_manager.rb +55 -0
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +12 -15
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +6 -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 +1 -1
- data/lib/avo/fields/location_field.rb +8 -8
- 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 +8 -4
- data/lib/avo/html/builder.rb +7 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +8 -67
- data/lib/avo/licensing/license.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 +16 -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 +84 -0
- data/lib/avo/resources/items/item_group.rb +49 -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/row.rb +54 -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 +174 -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 +5 -1
- 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.rb +115 -24
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/resource_generator.rb +4 -4
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
- 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 +1 -9
- 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 +7 -7
- 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/tool/view.tt +2 -2
- data/lib/tasks/avo_tasks.rake +27 -0
- data/public/avo-assets/avo.base.css +1810 -1189
- data/public/avo-assets/avo.base.js +217 -307
- 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
- metadata +102 -146
- data/app/assets/stylesheets/css/tags.css +0 -32
- 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/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/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_action_stimulus_controllers.rb +0 -15
- 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 -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/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/locales/avo.es.yml +0 -126
- data/lib/generators/avo/templates/standalone_action.tt +0 -8
- /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +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,12 +0,0 @@
|
|
1
|
-
<%= turbo_frame_tag "new_via_belongs_to" do %>
|
2
|
-
<%= render(Avo::ModalComponent.new(width: :xl, body_class: "bg-application")) do |c| %>
|
3
|
-
<div class="pt-4 pb-8">
|
4
|
-
<%= render Avo::Views::ResourceEditComponent.new(
|
5
|
-
resource: @resource,
|
6
|
-
model: @model,
|
7
|
-
view: @view,
|
8
|
-
display_breadcrumbs: false
|
9
|
-
) %>
|
10
|
-
</div>
|
11
|
-
<% end %>
|
12
|
-
<% end %>
|
@@ -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/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
|