avo 2.46.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 +12 -23
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
- data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
- data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
- data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
- data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
- data/app/components/avo/fields/common/heading_component.html.erb +1 -1
- data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
- data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
- data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
- data/app/components/avo/fields/file_field/edit_component.rb +0 -1
- data/app/components/avo/fields/file_field/index_component.rb +2 -2
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
- data/app/components/avo/fields/files_field/edit_component.rb +0 -1
- data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
- data/app/components/avo/fields/index_component.rb +5 -6
- data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
- data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
- data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
- data/app/components/avo/fields/preview_field/index_component.rb +4 -0
- data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
- data/app/components/avo/fields/show_component.rb +4 -1
- data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
- data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
- data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
- data/app/components/avo/filters_component.html.erb +9 -3
- data/app/components/avo/filters_component.rb +4 -4
- data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/index/grid_item_component.html.erb +5 -2
- data/app/components/avo/index/grid_item_component.rb +7 -6
- data/app/components/avo/index/resource_controls_component.html.erb +3 -81
- data/app/components/avo/index/resource_controls_component.rb +128 -18
- data/app/components/avo/index/resource_grid_component.html.erb +5 -3
- data/app/components/avo/index/resource_grid_component.rb +5 -2
- data/app/components/avo/index/resource_table_component.html.erb +5 -4
- data/app/components/avo/index/resource_table_component.rb +14 -20
- data/app/components/avo/index/table_row_component.html.erb +8 -4
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/item_switcher_component.html.erb +5 -10
- data/app/components/avo/item_switcher_component.rb +2 -3
- data/app/components/avo/modal_component.html.erb +7 -12
- data/app/components/avo/modal_component.rb +0 -21
- data/app/components/avo/paginator_component.html.erb +40 -29
- data/app/components/avo/paginator_component.rb +5 -23
- data/app/components/avo/panel_component.html.erb +8 -11
- data/app/components/avo/panel_component.rb +0 -1
- data/app/components/avo/profile_item_component.html.erb +2 -17
- data/app/components/avo/profile_item_component.rb +1 -13
- data/app/components/avo/referrer_params_component.html.erb +1 -4
- data/app/components/avo/resource_component.rb +142 -30
- data/app/components/avo/resource_sidebar_component.html.erb +6 -2
- data/app/components/avo/sidebar/link_component.html.erb +0 -2
- data/app/components/avo/sidebar/link_component.rb +3 -5
- data/app/components/avo/sidebar_component.html.erb +9 -2
- data/app/components/avo/sidebar_component.rb +5 -3
- data/app/components/avo/sidebar_profile_component.html.erb +27 -20
- data/app/components/avo/tab_group_component.html.erb +13 -7
- data/app/components/avo/tab_group_component.rb +1 -6
- data/app/components/avo/tab_switcher_component.html.erb +17 -40
- data/app/components/avo/tab_switcher_component.rb +4 -39
- data/app/components/avo/views/resource_edit_component.html.erb +16 -52
- data/app/components/avo/views/resource_edit_component.rb +7 -18
- data/app/components/avo/views/resource_index_component.html.erb +38 -53
- data/app/components/avo/views/resource_index_component.rb +60 -16
- data/app/components/avo/views/resource_show_component.html.erb +8 -151
- data/app/components/avo/views/resource_show_component.rb +6 -11
- data/app/controllers/avo/actions_controller.rb +19 -16
- data/app/controllers/avo/application_controller.rb +40 -109
- data/app/controllers/avo/associations_controller.rb +34 -41
- data/app/controllers/avo/attachments_controller.rb +10 -25
- data/app/controllers/avo/base_controller.rb +91 -103
- data/app/controllers/avo/debug_controller.rb +17 -5
- data/app/controllers/avo/search_controller.rb +29 -54
- data/app/controllers/avo/team_users_controller.rb +4 -0
- data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
- data/app/helpers/avo/application_helper.rb +20 -21
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +27 -11
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/application.js +0 -5
- data/app/javascript/js/controllers/action_controller.js +5 -3
- data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
- data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
- data/app/javascript/js/controllers/filter_controller.js +1 -1
- data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
- data/app/javascript/js/controllers/preview_controller.js +24 -0
- data/app/javascript/js/controllers/search_controller.js +1 -3
- data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
- data/app/javascript/js/controllers/toggle_controller.js +48 -0
- data/app/javascript/js/controllers.js +12 -8
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
- data/app/views/avo/actions/show.html.erb +12 -11
- data/app/views/avo/associations/new.html.erb +4 -4
- data/app/views/avo/base/index.html.erb +3 -2
- data/app/views/avo/base/new.html.erb +2 -1
- data/app/views/avo/base/preview.html.erb +19 -0
- data/app/views/avo/base/show.html.erb +1 -1
- data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
- data/app/views/avo/debug/report.html.erb +32 -17
- data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
- data/app/views/avo/home/index.html.erb +1 -1
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_javascript.html.erb +5 -0
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +3 -5
- data/app/views/avo/partials/_table_header.html.erb +5 -3
- data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
- data/app/views/avo/private/design.html.erb +2 -2
- data/app/views/layouts/avo/application.html.erb +3 -0
- data/avo.gemspec +6 -7
- data/bin/dev +1 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +10 -14
- data/config/master.key +1 -0
- data/config/routes.rb +8 -12
- data/db/factories.rb +7 -18
- data/lib/avo/action_model.rb +20 -0
- data/lib/avo/app.rb +90 -162
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +38 -36
- data/lib/avo/base_resource.rb +108 -96
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
- data/lib/avo/concerns/filters_session_handler.rb +1 -0
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_item_type.rb +38 -0
- data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
- data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
- data/lib/avo/concerns/is_resource_item.rb +24 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/visible_in_different_views.rb +126 -0
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +8 -45
- data/lib/avo/current.rb +5 -0
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +6 -2
- data/lib/avo/engine.rb +37 -30
- data/lib/avo/error_manager.rb +25 -0
- data/lib/avo/execution_context.rb +9 -15
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +72 -124
- data/lib/avo/fields/belongs_to_field.rb +14 -25
- data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
- data/lib/avo/fields/concerns/has_default.rb +1 -5
- data/lib/avo/fields/concerns/has_field_name.rb +22 -0
- data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
- data/lib/avo/fields/concerns/is_disabled.rb +1 -5
- data/lib/avo/fields/concerns/is_readonly.rb +1 -5
- data/lib/avo/fields/concerns/is_required.rb +5 -7
- data/lib/avo/fields/concerns/is_searchable.rb +13 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_field.rb +3 -16
- data/lib/avo/fields/date_time_field.rb +1 -5
- data/lib/avo/fields/field_manager.rb +45 -0
- data/lib/avo/fields/file_field.rb +0 -2
- data/lib/avo/fields/files_field.rb +0 -6
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +11 -14
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +5 -10
- data/lib/avo/fields/heading_field.rb +4 -1
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +2 -3
- data/lib/avo/fields/password_field.rb +1 -1
- data/lib/avo/fields/preview_field.rb +14 -0
- data/lib/avo/fields/select_field.rb +12 -8
- data/lib/avo/fields/status_field.rb +4 -0
- data/lib/avo/filters/base_filter.rb +3 -8
- data/lib/avo/grid_collector.rb +7 -9
- data/lib/avo/html/builder.rb +5 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +4 -68
- data/lib/avo/licensing/license.rb +2 -2
- data/lib/avo/licensing/license_manager.rb +1 -1
- data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
- data/lib/avo/licensing/pro_license.rb +1 -7
- data/lib/avo/plugin.rb +6 -0
- data/lib/avo/plugin_manager.rb +58 -0
- data/lib/avo/prefixed_test_helpers.rb +20 -0
- data/lib/avo/reloader.rb +3 -0
- data/lib/avo/resources/controls/actions_list.rb +6 -12
- data/lib/avo/resources/controls/attach_button.rb +15 -0
- data/lib/avo/resources/controls/back_button.rb +1 -1
- data/lib/avo/resources/controls/base_control.rb +15 -49
- data/lib/avo/resources/controls/create_button.rb +15 -0
- data/lib/avo/resources/controls/delete_button.rb +5 -1
- data/lib/avo/resources/controls/detach_button.rb +4 -1
- data/lib/avo/resources/controls/edit_button.rb +4 -1
- data/lib/avo/resources/controls/order_controls.rb +8 -0
- data/lib/avo/resources/controls/save_button.rb +13 -0
- data/lib/avo/resources/controls/show_button.rb +15 -0
- data/lib/avo/resources/items/holder.rb +76 -0
- data/lib/avo/resources/items/item_group.rb +48 -0
- data/lib/avo/resources/items/main_panel.rb +2 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/sidebar.rb +47 -0
- data/lib/avo/resources/items/tab.rb +60 -0
- data/lib/avo/resources/items/tab_group.rb +68 -0
- data/lib/avo/resources/resource_manager.rb +181 -0
- data/lib/avo/services/authorization_service.rb +11 -110
- data/lib/avo/services/debug_service.rb +92 -0
- data/lib/avo/services/telemetry_service.rb +84 -0
- data/lib/avo/test_helpers.rb +362 -0
- data/lib/avo/tools/tool_manager.rb +30 -0
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +7 -0
- data/lib/generators/avo/eject_generator.rb +0 -1
- data/lib/generators/avo/install_generator.rb +1 -11
- data/lib/generators/avo/resource_generator.rb +5 -23
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
- data/lib/generators/avo/templates/action.tt +1 -1
- data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
- data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
- data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
- data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
- data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
- data/lib/generators/avo/templates/initializer/avo.tt +1 -11
- data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
- data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
- data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
- data/lib/generators/avo/templates/resource/resource.tt +1 -1
- data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
- data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
- data/lib/generators/avo/templates/scope.tt +6 -0
- data/lib/generators/avo/templates/standalone_action.tt +1 -1
- data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
- data/lib/generators/avo/templates/tool/view.tt +2 -2
- data/lib/tasks/avo_tasks.rake +22 -0
- metadata +82 -161
- data/app/assets/stylesheets/css/tags.css +0 -32
- data/app/assets/svgs/map-empty-state.svg +0 -35
- data/app/assets/svgs/map-view-type.svg +0 -3
- data/app/components/avo/card_component.html.erb +0 -46
- data/app/components/avo/card_component.rb +0 -25
- data/app/components/avo/dashboards/divider_component.html.erb +0 -9
- data/app/components/avo/dashboards/divider_component.rb +0 -19
- data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
- data/app/components/avo/fields/area_field/edit_component.rb +0 -4
- data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
- data/app/components/avo/fields/area_field/show_component.rb +0 -4
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
- data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
- data/app/components/avo/fields/common/files/controls_component.rb +0 -19
- data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
- data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
- data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
- data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
- data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
- data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
- data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
- data/app/components/avo/fields/location_field/edit_component.rb +0 -4
- data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/location_field/show_component.rb +0 -4
- data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
- data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
- data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
- data/app/components/avo/fields/tags_field/index_component.rb +0 -9
- data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/tags_field/show_component.rb +0 -5
- data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
- data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
- data/app/components/avo/index/ordering/base_component.rb +0 -9
- data/app/components/avo/index/ordering/button_component.html.erb +0 -11
- data/app/components/avo/index/ordering/button_component.rb +0 -23
- data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
- data/app/components/avo/index/ordering/buttons_component.rb +0 -47
- data/app/components/avo/index/resource_map_component.html.erb +0 -16
- data/app/components/avo/index/resource_map_component.rb +0 -109
- data/app/components/avo/row_component.html.erb +0 -3
- data/app/components/avo/row_component.rb +0 -12
- data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
- data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
- data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
- data/app/controllers/avo/dashboards_controller.rb +0 -22
- data/app/controllers/avo/reorder_controller.rb +0 -25
- data/app/javascript/js/controllers/base_controller.js +0 -22
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
- data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
- data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
- data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
- data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
- data/app/views/avo/dashboards/cards/show.html.erb +0 -3
- data/app/views/avo/dashboards/show.html.erb +0 -38
- data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
- data/app/views/avo/partials/_global_search.html.erb +0 -19
- data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
- data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
- data/lib/avo/base_card.rb +0 -161
- data/lib/avo/concerns/fetches_things.rb +0 -150
- data/lib/avo/concerns/handles_field_args.rb +0 -47
- data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_html_attributes.rb +0 -123
- data/lib/avo/concerns/pagination.rb +0 -53
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- data/lib/avo/concerns/visible_items.rb +0 -51
- data/lib/avo/dashboards/base_dashboard.rb +0 -89
- data/lib/avo/dashboards/base_divider.rb +0 -35
- data/lib/avo/dashboards/chartkick_card.rb +0 -77
- data/lib/avo/dashboards/dashboard_card.rb +0 -6
- data/lib/avo/dashboards/metric_card.rb +0 -9
- data/lib/avo/dashboards/partial_card.rb +0 -7
- data/lib/avo/fields/area_field.rb +0 -39
- data/lib/avo/fields/concerns/file_authorization.rb +0 -31
- data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
- data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
- data/lib/avo/fields/location_field.rb +0 -86
- data/lib/avo/fields/tags_field.rb +0 -102
- data/lib/avo/hosts/association_scope_host.rb +0 -8
- data/lib/avo/hosts/base_host.rb +0 -25
- data/lib/avo/hosts/card_visibility.rb +0 -20
- data/lib/avo/hosts/dashboard_card.rb +0 -22
- data/lib/avo/hosts/dashboard_visibility.rb +0 -19
- data/lib/avo/hosts/ordering.rb +0 -22
- data/lib/avo/hosts/record_host.rb +0 -7
- data/lib/avo/hosts/resource_record_host.rb +0 -7
- data/lib/avo/hosts/resource_view_record_host.rb +0 -7
- data/lib/avo/hosts/search_scope_host.rb +0 -7
- data/lib/avo/hosts/view_record_host.rb +0 -7
- data/lib/avo/hosts/visibility_host.rb +0 -12
- data/lib/avo/items_holder.rb +0 -96
- data/lib/avo/main_panel.rb +0 -3
- data/lib/avo/menu/base_item.rb +0 -25
- data/lib/avo/menu/builder.rb +0 -82
- data/lib/avo/menu/dashboard.rb +0 -22
- data/lib/avo/menu/group.rb +0 -2
- data/lib/avo/menu/link.rb +0 -6
- data/lib/avo/menu/menu.rb +0 -2
- data/lib/avo/menu/resource.rb +0 -22
- data/lib/avo/menu/section.rb +0 -2
- data/lib/avo/panel.rb +0 -24
- data/lib/avo/panel_builder.rb +0 -25
- data/lib/avo/resources/controls/action.rb +0 -38
- data/lib/avo/resources/controls/execution_context.rb +0 -58
- data/lib/avo/resources/controls/items_holder.rb +0 -19
- data/lib/avo/resources/controls/link_to.rb +0 -27
- data/lib/avo/row.rb +0 -26
- data/lib/avo/row_builder.rb +0 -24
- data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
- data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
- data/lib/avo/sidebar.rb +0 -30
- data/lib/avo/sidebar_builder.rb +0 -24
- data/lib/avo/tab.rb +0 -72
- data/lib/avo/tab_builder.rb +0 -25
- data/lib/avo/tab_group.rb +0 -42
- data/lib/avo/tab_group_builder.rb +0 -43
- data/lib/avo/tools_manager.rb +0 -11
- data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
- data/public/avo-assets/avo.base.js +0 -1037
- data/public/avo-assets/avo.base.js.map +0 -7
data/config/master.key
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2aeb23d82b909d9c6b5abb62f7058c2a
|
data/config/routes.rb
CHANGED
@@ -4,11 +4,11 @@ Avo::Engine.routes.draw do
|
|
4
4
|
get "resources", to: redirect(Avo.configuration.root_path)
|
5
5
|
get "dashboards", to: redirect(Avo.configuration.root_path)
|
6
6
|
|
7
|
-
|
7
|
+
mount AvoFilters::Engine, at: "/avo_filters" if defined?(AvoFilters)
|
8
|
+
mount AvoDashboards::Engine, at: "/dashboards" if defined?(AvoDashboards::Engine)
|
9
|
+
mount AvoPro::Engine, at: "/avo_pro" if defined?(AvoPro)
|
8
10
|
|
9
|
-
|
10
|
-
resources :cards, controller: "dashboards/cards"
|
11
|
-
end
|
11
|
+
post "/rails/active_storage/direct_uploads", to: "/active_storage/direct_uploads#create"
|
12
12
|
|
13
13
|
scope "avo_api", as: "avo_api" do
|
14
14
|
get "/search", to: "search#index"
|
@@ -16,11 +16,6 @@ Avo::Engine.routes.draw do
|
|
16
16
|
post "/resources/:resource_name/:id/attachments/", to: "attachments#create"
|
17
17
|
end
|
18
18
|
|
19
|
-
# Records ordering
|
20
|
-
scope "reorder", as: "reorder" do
|
21
|
-
patch "/:resource_name/:id", to: "reorder#order", as: "order"
|
22
|
-
end
|
23
|
-
|
24
19
|
get "failed_to_load", to: "home#failed_to_load"
|
25
20
|
|
26
21
|
scope "resources", as: "resources" do
|
@@ -28,8 +23,8 @@ Avo::Engine.routes.draw do
|
|
28
23
|
delete "/:resource_name/:id/active_storage_attachments/:attachment_name/:attachment_id", to: "attachments#destroy"
|
29
24
|
|
30
25
|
# Actions
|
31
|
-
get "/:resource_name(/:id)/actions
|
32
|
-
post "/:resource_name(/:id)/actions
|
26
|
+
get "/:resource_name(/:id)/actions/:action_id", to: "actions#show"
|
27
|
+
post "/:resource_name(/:id)/actions/:action_id", to: "actions#handle"
|
33
28
|
|
34
29
|
# Generate resource routes as below:
|
35
30
|
# resources :posts
|
@@ -44,7 +39,8 @@ Avo::Engine.routes.draw do
|
|
44
39
|
end
|
45
40
|
|
46
41
|
scope "/avo_private", as: "avo_private" do
|
47
|
-
get "/
|
42
|
+
get "/status", to: "debug#status", as: "status"
|
43
|
+
post "/status/send_to_hq", to: "debug#send_to_hq", as: "send_to_hq"
|
48
44
|
get "/debug/report", to: "debug#report", as: "debug_report"
|
49
45
|
post "/debug/refresh_license", to: "debug#refresh_license"
|
50
46
|
end
|
data/db/factories.rb
CHANGED
@@ -9,6 +9,12 @@ FactoryBot.define do
|
|
9
9
|
custom_css { ".header {\n color: red;\n}" }
|
10
10
|
end
|
11
11
|
|
12
|
+
trait :with_post do
|
13
|
+
after(:create) do |user|
|
14
|
+
create(:post, user_id: user.id)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
12
18
|
factory :team do
|
13
19
|
name { Faker::Company.name }
|
14
20
|
description { Faker::Lorem.paragraph(sentence_count: 4) }
|
@@ -32,7 +38,7 @@ FactoryBot.define do
|
|
32
38
|
factory :project do
|
33
39
|
name { Faker::App.name }
|
34
40
|
status { ['closed', :rejected, :failed, 'loading', :running, :waiting].sample }
|
35
|
-
stage { ["Discovery", "Idea", "Done", "On hold", "Cancelled"
|
41
|
+
stage { ["Discovery", "Idea", "Done", "On hold", "Cancelled"].sample }
|
36
42
|
budget { Faker::Number.decimal(l_digits: 4) }
|
37
43
|
country { Faker::Address.country_code }
|
38
44
|
description { Faker::Markdown.sandwich(sentences: 5) }
|
@@ -42,20 +48,6 @@ FactoryBot.define do
|
|
42
48
|
progress { Faker::Number.between(from: 0, to: 100) }
|
43
49
|
end
|
44
50
|
|
45
|
-
trait :with_files do
|
46
|
-
after(:create) do |project|
|
47
|
-
["watch.jpg", "dummy-video.mp4"].each do |filename|
|
48
|
-
file = Rails.root.join("db", "seed_files", filename)
|
49
|
-
project.files.attach(io: file.open, filename: filename)
|
50
|
-
end
|
51
|
-
|
52
|
-
["dummy-file.txt", "dummy-audio.mp3"].each do |filename|
|
53
|
-
file = Avo::Engine.root.join("spec", "dummy", filename)
|
54
|
-
project.files.attach(io: file.open, filename: filename)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
51
|
factory :comment do
|
60
52
|
body { Faker::Lorem.paragraphs(number: rand(4...10)).join(" ") }
|
61
53
|
posted_at { Time.now - rand(10...365).days }
|
@@ -104,8 +96,6 @@ FactoryBot.define do
|
|
104
96
|
factory :city do
|
105
97
|
name { Faker::Address.city }
|
106
98
|
population { rand(10000..999000) }
|
107
|
-
latitude { Faker::Address.latitude }
|
108
|
-
longitude { Faker::Address.longitude }
|
109
99
|
is_capital { [true, false].sample }
|
110
100
|
features { Faker::Address.community }
|
111
101
|
metadata { Faker::Address.community }
|
@@ -113,7 +103,6 @@ FactoryBot.define do
|
|
113
103
|
description { Faker::Address.community }
|
114
104
|
status { ["open", "closed"].sample }
|
115
105
|
tiny_description { Faker::Address.community }
|
116
|
-
city_center_area { [[[10.0, 11.2], [10.5, 11.9], [10.8, 12.0], [10.0, 11.2]]].to_json }
|
117
106
|
end
|
118
107
|
|
119
108
|
factory :product do
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Avo
|
2
|
+
class ActionModel
|
3
|
+
include ActiveModel::Model
|
4
|
+
|
5
|
+
# This class augments a model the action form declaration.
|
6
|
+
def initialize(attributes = {})
|
7
|
+
set_attr_accessors attributes
|
8
|
+
|
9
|
+
super(attributes)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def set_attr_accessors(attributes)
|
15
|
+
attributes.each do |k, v|
|
16
|
+
self.class.class_eval { attr_accessor k }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/avo/app.rb
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
module Avo
|
2
2
|
class App
|
3
|
-
|
4
|
-
|
5
|
-
class_attribute :resources, default: []
|
6
|
-
class_attribute :dashboards, default: []
|
3
|
+
class_attribute :field_manager
|
7
4
|
class_attribute :cache_store, default: nil
|
8
|
-
class_attribute :
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
5
|
+
class_attribute :logger
|
6
|
+
|
7
|
+
include ActiveModel::Model
|
8
|
+
|
9
|
+
attr_accessor :request, :context, :current_user, :view_context
|
10
|
+
attr_accessor :cache_store
|
11
|
+
attr_accessor :resource_manager
|
12
|
+
attr_accessor :dashboard_manager
|
13
|
+
attr_accessor :tool_manager
|
14
|
+
attr_accessor :error_manager
|
15
|
+
|
16
|
+
delegate :params, to: :request
|
18
17
|
|
19
18
|
class << self
|
20
19
|
def eager_load(entity)
|
@@ -29,151 +28,79 @@ module Avo
|
|
29
28
|
end
|
30
29
|
|
31
30
|
def boot
|
31
|
+
init_logger
|
32
32
|
init_fields
|
33
|
-
|
34
|
-
self.cache_store = Avo.configuration.cache_store
|
33
|
+
init_cache_store
|
35
34
|
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
.
|
41
|
-
|
42
|
-
.
|
36
|
+
def init_cache_store
|
37
|
+
# The cache store should be set when the app boots up.
|
38
|
+
if Rails.cache.instance_of?(ActiveSupport::Cache::NullStore)
|
39
|
+
self.cache_store ||= ActiveSupport::Cache::MemoryStore.new
|
40
|
+
else
|
41
|
+
self.cache_store = Rails.cache
|
42
|
+
end
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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
|
45
|
+
def init_logger
|
46
|
+
file_logger = ActiveSupport::Logger.new(Rails.root.join("log", "avo.log"))
|
47
|
+
|
48
|
+
file_logger.datetime_format = "%Y-%m-%d %H:%M:%S"
|
49
|
+
file_logger.formatter = proc do |severity, time, progname, msg|
|
50
|
+
"[Avo] #{time}: #{msg}\n".tap do |i|
|
51
|
+
puts i
|
64
52
|
end
|
65
|
-
rescue => exception
|
66
|
-
Rails.logger.debug "[Avo] Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
|
67
53
|
end
|
68
54
|
|
69
|
-
|
70
|
-
init_resources
|
71
|
-
init_dashboards if license.has_with_trial(:dashboards)
|
55
|
+
self.logger = file_logger
|
72
56
|
end
|
73
57
|
|
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
58
|
def init_fields
|
82
|
-
Avo::Fields::
|
83
|
-
|
59
|
+
self.field_manager = Avo::Fields::FieldManager.build
|
60
|
+
end
|
84
61
|
|
85
|
-
|
86
|
-
|
87
|
-
end
|
88
|
-
end
|
62
|
+
def fields
|
63
|
+
field_manager
|
89
64
|
end
|
90
65
|
|
91
|
-
def
|
92
|
-
|
93
|
-
name: method_name,
|
94
|
-
class: klass
|
95
|
-
)
|
66
|
+
def build(request:, context:, current_user:, view_context:)
|
67
|
+
@app || new(request: request, context: context, current_user: current_user, view_context: view_context)
|
96
68
|
end
|
97
69
|
|
98
|
-
def
|
99
|
-
|
100
|
-
|
70
|
+
def license
|
71
|
+
Current.license
|
72
|
+
end
|
101
73
|
|
102
|
-
|
103
|
-
|
74
|
+
def instance
|
75
|
+
Current.app
|
76
|
+
end
|
104
77
|
|
105
|
-
|
106
|
-
|
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
|
78
|
+
def resources
|
79
|
+
Current.app.resource_manager
|
112
80
|
end
|
113
81
|
|
114
|
-
|
115
|
-
|
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
|
82
|
+
def dashboards
|
83
|
+
Current.app.dashboard_manager
|
84
|
+
end
|
141
85
|
|
142
|
-
|
143
|
-
|
144
|
-
resource
|
145
|
-
else
|
146
|
-
resource.to_s.safe_constantize
|
147
|
-
end
|
148
|
-
end
|
86
|
+
def tools
|
87
|
+
Current.app.tool_manager
|
149
88
|
end
|
150
89
|
|
151
|
-
def
|
152
|
-
|
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
|
90
|
+
def errors
|
91
|
+
Current.app.error_manager
|
165
92
|
end
|
166
93
|
|
167
|
-
|
168
|
-
|
94
|
+
# Renerate a dynamic root path using the URIService
|
95
|
+
def root_path(paths: [], query: {}, **args)
|
96
|
+
Avo::Services::URIService.parse(Avo::Current.view_context.avo.root_url.to_s)
|
97
|
+
.append_paths(paths)
|
98
|
+
.append_query(query)
|
99
|
+
.to_s
|
100
|
+
end
|
169
101
|
|
170
|
-
|
171
|
-
|
172
|
-
dashboard != Dashboards::BaseDashboard
|
173
|
-
end
|
174
|
-
.uniq do |dashboard|
|
175
|
-
dashboard.id
|
176
|
-
end
|
102
|
+
def mount_path
|
103
|
+
Avo::Engine.routes.find_script_name({})
|
177
104
|
end
|
178
105
|
|
179
106
|
def has_main_menu?
|
@@ -191,47 +118,48 @@ module Avo
|
|
191
118
|
end
|
192
119
|
|
193
120
|
def main_menu
|
121
|
+
return unless Avo.plugin_manager.installed?(:avo_menu)
|
122
|
+
|
194
123
|
# Return empty menu if the app doesn't have the profile menu configured
|
195
|
-
return
|
124
|
+
return AvoMenu::Builder.new.build unless has_main_menu?
|
196
125
|
|
197
|
-
|
126
|
+
AvoMenu::Builder.parse_menu(&Avo.configuration.main_menu)
|
198
127
|
end
|
199
128
|
|
200
129
|
def profile_menu
|
130
|
+
return unless Avo.plugin_manager.installed?(:avo_menu)
|
131
|
+
|
201
132
|
# Return empty menu if the app doesn't have the profile menu configured
|
202
|
-
return
|
133
|
+
return AvoMenu::Builder.new.build unless has_profile_menu?
|
203
134
|
|
204
|
-
|
135
|
+
AvoMenu::Builder.parse_menu(&Avo.configuration.profile_menu)
|
205
136
|
end
|
137
|
+
end
|
206
138
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
139
|
+
def init
|
140
|
+
self.error_manager = Avo::ErrorManager.build
|
141
|
+
self.resource_manager = Avo::Resources::ResourceManager.build
|
142
|
+
self.tool_manager = Avo::Tools::ToolManager.build
|
143
|
+
end
|
211
144
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
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
|
145
|
+
# Renerate a dynamic root path using the URIService
|
146
|
+
def root_path(paths: [], query: {}, **args)
|
147
|
+
Avo::Services::URIService.parse(view_context.avo.root_url.to_s)
|
148
|
+
.append_paths(paths)
|
149
|
+
.append_query(query)
|
150
|
+
.to_s
|
151
|
+
end
|
224
152
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
end
|
153
|
+
def mount_path
|
154
|
+
Avo::Engine.routes.find_script_name({})
|
155
|
+
end
|
229
156
|
|
230
|
-
|
231
|
-
|
232
|
-
rescue => e
|
233
|
-
e
|
234
|
-
end
|
157
|
+
def app_status
|
158
|
+
Current.license.valid?
|
235
159
|
end
|
236
160
|
end
|
161
|
+
|
162
|
+
def self.logger
|
163
|
+
Avo::App.logger
|
164
|
+
end
|
237
165
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Avo
|
2
|
+
class AssetManager
|
3
|
+
include ActionView::Helpers::AssetTagHelper
|
4
|
+
|
5
|
+
attr_reader :stylesheets
|
6
|
+
attr_reader :javascripts
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@stylesheets = []
|
10
|
+
@javascripts = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def reset
|
14
|
+
@stylesheets = []
|
15
|
+
@javascripts = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_stylesheet(path)
|
19
|
+
@stylesheets.push path
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_javascript(path)
|
23
|
+
@javascripts.push path
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.asset_manager
|
28
|
+
@manager ||= AssetManager.new
|
29
|
+
end
|
30
|
+
end
|
data/lib/avo/base_action.rb
CHANGED
@@ -1,53 +1,54 @@
|
|
1
1
|
module Avo
|
2
2
|
class BaseAction
|
3
|
-
include Avo::Concerns::
|
4
|
-
include Avo::Concerns::HasActionStimulusControllers
|
3
|
+
include Avo::Concerns::HasItems
|
5
4
|
|
6
5
|
class_attribute :name, default: nil
|
7
6
|
class_attribute :message
|
8
7
|
class_attribute :confirm_button_label
|
9
8
|
class_attribute :cancel_button_label
|
10
9
|
class_attribute :no_confirmation, default: false
|
10
|
+
class_attribute :record
|
11
|
+
class_attribute :view
|
12
|
+
class_attribute :user
|
13
|
+
class_attribute :resource
|
11
14
|
class_attribute :standalone, default: false
|
12
15
|
class_attribute :visible
|
13
16
|
class_attribute :may_download_file, default: false
|
14
|
-
class_attribute :turbo
|
15
17
|
|
16
|
-
attr_accessor :view
|
17
18
|
attr_accessor :response
|
18
|
-
attr_accessor :
|
19
|
+
attr_accessor :record
|
19
20
|
attr_accessor :resource
|
20
21
|
attr_accessor :user
|
21
22
|
attr_reader :arguments
|
22
23
|
|
23
|
-
delegate :
|
24
|
-
|
25
|
-
delegate :
|
26
|
-
delegate :
|
24
|
+
delegate :view, to: :class
|
25
|
+
# TODO: find a differnet way to delegate this to the uninitialized Current variable
|
26
|
+
delegate :context, to: Avo::Current
|
27
|
+
delegate :current_user, to: Avo::Current
|
28
|
+
delegate :params, to: Avo::Current
|
29
|
+
delegate :view_context, to: Avo::Current
|
27
30
|
delegate :avo, to: :view_context
|
28
31
|
delegate :main_app, to: :view_context
|
29
32
|
|
30
33
|
class << self
|
31
|
-
delegate :context, to: ::Avo::
|
34
|
+
delegate :context, to: ::Avo::Current
|
32
35
|
|
33
36
|
def form_data_attributes
|
34
37
|
# We can't respond with a file download from Turbo se we disable it on the form
|
35
38
|
if may_download_file
|
36
|
-
{turbo:
|
39
|
+
{turbo: false, remote: false, action_target: :form}
|
37
40
|
else
|
38
|
-
{
|
41
|
+
{turbo_frame: :_top, action_target: :form}
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
45
|
# We can't respond with a file download from Turbo se we disable close the modal manually after a while (it's a hack, we know)
|
43
46
|
def submit_button_data_attributes
|
44
|
-
attributes = { action_target: "submit" }
|
45
|
-
|
46
47
|
if may_download_file
|
47
|
-
|
48
|
+
{action: "click->modal#delayedClose"}
|
49
|
+
else
|
50
|
+
{}
|
48
51
|
end
|
49
|
-
|
50
|
-
attributes
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
@@ -57,11 +58,11 @@ module Avo
|
|
57
58
|
self.class.to_s.demodulize.underscore.humanize(keep_id_suffix: true)
|
58
59
|
end
|
59
60
|
|
60
|
-
def initialize(
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
def initialize(record: nil, resource: nil, user: nil, view: nil, arguments: {})
|
62
|
+
self.class.record = record if record.present?
|
63
|
+
self.class.resource = resource if resource.present?
|
64
|
+
self.class.user = user if user.present?
|
65
|
+
self.class.view = view if view.present?
|
65
66
|
@arguments = arguments
|
66
67
|
|
67
68
|
self.class.message ||= I18n.t("avo.are_you_sure_you_want_to_run_this_option")
|
@@ -73,11 +74,13 @@ module Avo
|
|
73
74
|
end
|
74
75
|
|
75
76
|
def get_message
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
Avo::ExecutionContext.new(target: self.class.message, record: self.class.record, resource: self.class.resource).handle
|
78
|
+
end
|
79
|
+
|
80
|
+
def get_attributes_for_action
|
81
|
+
get_fields.map do |field|
|
82
|
+
[field.id, field.value || field.default]
|
83
|
+
end.to_h
|
81
84
|
end
|
82
85
|
|
83
86
|
def handle_action(**args)
|
@@ -128,18 +131,18 @@ module Avo
|
|
128
131
|
end
|
129
132
|
|
130
133
|
# Run the visible block if available
|
131
|
-
Avo::
|
132
|
-
|
134
|
+
Avo::ExecutionContext.new(
|
135
|
+
target: visible,
|
133
136
|
params: params,
|
134
137
|
parent_resource: parent_resource,
|
135
|
-
resource:
|
136
|
-
view:
|
138
|
+
resource: self.class.resource,
|
139
|
+
view: self.class.view,
|
137
140
|
arguments: arguments
|
138
141
|
).handle
|
139
142
|
end
|
140
143
|
|
141
144
|
def param_id
|
142
|
-
self.class.to_s
|
145
|
+
self.class.to_s.demodulize.underscore.tr "/", "_"
|
143
146
|
end
|
144
147
|
|
145
148
|
def succeed(text)
|
@@ -185,9 +188,8 @@ module Avo
|
|
185
188
|
self
|
186
189
|
end
|
187
190
|
|
188
|
-
def redirect_to(path = nil,
|
191
|
+
def redirect_to(path = nil, &block)
|
189
192
|
response[:type] = :redirect
|
190
|
-
response[:redirect_args] = args
|
191
193
|
response[:path] = if block.present?
|
192
194
|
block
|
193
195
|
else
|
@@ -212,9 +214,9 @@ module Avo
|
|
212
214
|
end
|
213
215
|
|
214
216
|
# We're overriding this method to hydrate with the proper resource attribute.
|
215
|
-
def hydrate_fields
|
217
|
+
def hydrate_fields
|
216
218
|
fields.map do |field|
|
217
|
-
field.hydrate(
|
219
|
+
field.hydrate(record: @record, view: @view, resource: resource)
|
218
220
|
end
|
219
221
|
|
220
222
|
self
|