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
@@ -3,7 +3,30 @@ require_relative "base_generator"
|
|
3
3
|
module Generators
|
4
4
|
module Avo
|
5
5
|
class EjectGenerator < BaseGenerator
|
6
|
-
|
6
|
+
class_option :partial,
|
7
|
+
desc: "The partial to eject. Example: ':logo', 'app/views/layouts/avo/application.html.erb'",
|
8
|
+
type: :string,
|
9
|
+
required: false
|
10
|
+
|
11
|
+
class_option :component,
|
12
|
+
desc: "The component to eject. Example: 'Avo::Index::TableRowComponent', 'avo/index/table_row_component'",
|
13
|
+
type: :string,
|
14
|
+
required: false
|
15
|
+
|
16
|
+
class_option :scope,
|
17
|
+
desc: "The scope of the component. Example: 'users', 'admins'",
|
18
|
+
type: :string,
|
19
|
+
required: false
|
20
|
+
|
21
|
+
class_option "field-components",
|
22
|
+
desc: "The field components to eject. Example: 'trix', 'text'",
|
23
|
+
type: :string,
|
24
|
+
required: false
|
25
|
+
|
26
|
+
class_option :view,
|
27
|
+
desc: "The view of the component to eject when using --field-component option. Example: 'index', 'show'",
|
28
|
+
type: :string,
|
29
|
+
required: false
|
7
30
|
|
8
31
|
source_root ::Avo::Engine.root
|
9
32
|
|
@@ -21,19 +44,23 @@ module Generators
|
|
21
44
|
}
|
22
45
|
|
23
46
|
def handle
|
24
|
-
if
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
else
|
31
|
-
say("Failed to find the `#{template_id.to_sym}` template.", :yellow)
|
32
|
-
end
|
33
|
-
elsif path_exists? @filename
|
34
|
-
eject @filename
|
47
|
+
if options[:partial].present?
|
48
|
+
eject_partial
|
49
|
+
elsif options[:component].present?
|
50
|
+
eject_component
|
51
|
+
elsif options["field-components"].present?
|
52
|
+
eject_field_components
|
35
53
|
else
|
36
|
-
say
|
54
|
+
say "Please specify a partial or a component to eject.\n" \
|
55
|
+
"Examples: rails g avo:eject --partial :logo\n" \
|
56
|
+
" rails g avo:eject --partial app/views/layouts/avo/application.html.erb\n" \
|
57
|
+
" rails g avo:eject --component Avo::Index::TableRowComponent\n" \
|
58
|
+
" rails g avo:eject --component avo/index/table_row_component\n" \
|
59
|
+
" rails g avo:eject --field-components trix\n" \
|
60
|
+
" rails g avo:eject --field-components trix --scope users\n" \
|
61
|
+
" rails g avo:eject --field-components text --scope users --view edit\n" \
|
62
|
+
" rails g avo:eject --component Avo::Views::ResourceIndexComponent --scope users\n" \
|
63
|
+
" rails g avo:eject --component avo/views/resource_index_component --scope users", :yellow
|
37
64
|
end
|
38
65
|
end
|
39
66
|
|
@@ -48,8 +75,146 @@ module Generators
|
|
48
75
|
path.present? && File.file?(::Avo::Engine.root.join(path))
|
49
76
|
end
|
50
77
|
|
51
|
-
def
|
52
|
-
|
78
|
+
def dir_exists?(path)
|
79
|
+
path.present? && Dir.exist?(::Avo::Engine.root.join(path))
|
80
|
+
end
|
81
|
+
|
82
|
+
def eject(path, dest_path = nil, is_directory: false)
|
83
|
+
method = is_directory ? :directory : :copy_file
|
84
|
+
|
85
|
+
send method, ::Avo::Engine.root.join(path), ::Rails.root.join(dest_path || path)
|
86
|
+
end
|
87
|
+
|
88
|
+
def eject_partial
|
89
|
+
if options[:partial].starts_with?(":")
|
90
|
+
template_id = path_to_sym options[:partial]
|
91
|
+
template_path = TEMPLATES[template_id]
|
92
|
+
|
93
|
+
if path_exists? template_path
|
94
|
+
return unless confirm_ejection_on template_path
|
95
|
+
eject template_path
|
96
|
+
else
|
97
|
+
say("Failed to find the `#{template_id.to_sym}` template.", :yellow)
|
98
|
+
end
|
99
|
+
elsif path_exists? options[:partial]
|
100
|
+
return unless confirm_ejection_on template_path
|
101
|
+
eject options[:partial]
|
102
|
+
else
|
103
|
+
say("Failed to find the `#{options[:partial]}` template.", :yellow)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def eject_component(component_to_eject = options[:component], confirmation: true)
|
108
|
+
# Underscore the component name
|
109
|
+
# Example: Avo::Views::ResourceIndexComponent => avo/views/resource_index_component
|
110
|
+
component = component_to_eject.underscore
|
111
|
+
|
112
|
+
# Get the component path for both, the rb and erb files
|
113
|
+
rb, erb = ["app/components/#{component}.rb", "app/components/#{component}.html.erb"]
|
114
|
+
|
115
|
+
# Return if one of the components doesn't exist
|
116
|
+
if !path_exists?(rb) || !path_exists?(erb)
|
117
|
+
return say("Failed to find the `#{component_to_eject}` component.", :yellow)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Add the scope to the component if it's possible
|
121
|
+
if add_scope? component
|
122
|
+
component = if component.starts_with?("avo/views/")
|
123
|
+
component.gsub("avo/views/", "avo/views/#{options[:scope].underscore}/")
|
124
|
+
elsif component.starts_with?("avo/fields/")
|
125
|
+
component.gsub("avo/fields/", "avo/fields/#{options[:scope].underscore}/")
|
126
|
+
end
|
127
|
+
added_scope = true
|
128
|
+
end
|
129
|
+
|
130
|
+
# Confirm the ejection
|
131
|
+
if confirmation
|
132
|
+
return if !confirm_ejection_on(component.camelize)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Get the destination path for both, the rb and erb files
|
136
|
+
dest_rb = "#{::Avo.configuration.view_component_path}/#{component}.rb"
|
137
|
+
dest_erb = "#{::Avo.configuration.view_component_path}/#{component}.html.erb"
|
138
|
+
|
139
|
+
# Eject the component
|
140
|
+
eject rb, dest_rb
|
141
|
+
eject erb, dest_erb
|
142
|
+
|
143
|
+
# Remame the component class if scope was added
|
144
|
+
# Example: Avo::Views::ResourceIndexComponent => Avo::Views::Admins::ResourceIndexComponent
|
145
|
+
if added_scope
|
146
|
+
[dest_rb, dest_erb].each do |path|
|
147
|
+
if component.starts_with?("avo/views/")
|
148
|
+
modified_content = File.read(path).gsub("Avo::Views::", "Avo::Views::#{options[:scope].camelize}::")
|
149
|
+
elsif component.starts_with?("avo/fields/")
|
150
|
+
modified_content = File.read(path).gsub("#{options["field-components"].camelize}Field", "#{options[:scope].camelize}::#{options["field-components"].camelize}Field")
|
151
|
+
end
|
152
|
+
|
153
|
+
File.open(path, "w") do |file|
|
154
|
+
file.puts modified_content
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
if component.starts_with?("avo/views/")
|
159
|
+
say "You can now use this component on any resource by configuring the 'self.components' option.\n" \
|
160
|
+
" self.components = {\n" \
|
161
|
+
" #{component.split("/").last}: #{component.camelize}\n" \
|
162
|
+
" }", :green
|
163
|
+
elsif component.starts_with?("avo/fields/")
|
164
|
+
say "You can now use this component on any field by configuring the 'components' option.\n" \
|
165
|
+
" field :name, as: :#{options["field-components"]}, components: {\n" \
|
166
|
+
" #{component.split("/").last}: #{component.camelize}\n" \
|
167
|
+
" }", :green
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def eject_field_components
|
173
|
+
# Check if the field exists
|
174
|
+
field_path = "lib/avo/fields/#{options["field-components"]}_field.rb"
|
175
|
+
return say("Failed to find the `#{options["field-components"]}` field.", :yellow) if !path_exists?(field_path)
|
176
|
+
|
177
|
+
# Eject single component if view is specified
|
178
|
+
if options[:view].present?
|
179
|
+
return eject_component "Avo::Fields::#{options["field-components"].camelize}Field::#{options[:view].camelize}Component"
|
180
|
+
end
|
181
|
+
|
182
|
+
# Check if the field components directory exist
|
183
|
+
components_path = "app/components/avo/fields/#{options["field-components"]}_field"
|
184
|
+
return say("Failed to find the `#{options["field-components"]}` field components.", :yellow) if !dir_exists?(components_path)
|
185
|
+
|
186
|
+
# Build the destination path for the components directory add the scope
|
187
|
+
destination_components_path = "#{::Avo.configuration.view_component_path}/#{components_path.gsub("app/components/", "")}"
|
188
|
+
|
189
|
+
if options[:scope].present?
|
190
|
+
destination_components_path = destination_components_path.gsub("avo/fields/", "avo/fields/#{options[:scope].underscore}/")
|
191
|
+
end
|
192
|
+
|
193
|
+
# Confirm the ejection
|
194
|
+
confirm_ejection_on destination_components_path, is_directory: true
|
195
|
+
|
196
|
+
# Eject the components directory
|
197
|
+
eject components_path, destination_components_path, is_directory: true
|
198
|
+
|
199
|
+
# Rename the component classes if scope was added
|
200
|
+
if options[:scope].present?
|
201
|
+
Dir.glob("#{destination_components_path}/*").each do |file|
|
202
|
+
modified_content = File.read(file).gsub("#{options["field-components"].camelize}Field", "#{options[:scope].camelize}::#{options["field-components"].camelize}Field")
|
203
|
+
|
204
|
+
File.open(file, "w") do |open_file|
|
205
|
+
open_file.puts modified_content
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def confirm_ejection_on(path, is_directory: false)
|
212
|
+
say("By ejecting the '#{path}'#{" directory" if is_directory} \033[1myou'll take on the responsibility for maintain it.", :yellow)
|
213
|
+
yes?("Are you sure you want to eject the '#{path}'#{" directory" if is_directory}? [y/N]", :yellow)
|
214
|
+
end
|
215
|
+
|
216
|
+
def add_scope?(component)
|
217
|
+
(component.starts_with?("avo/views/") || component.starts_with?("avo/fields/")) && options[:scope].present?
|
53
218
|
end
|
54
219
|
end
|
55
220
|
end
|
@@ -8,9 +8,56 @@ module Generators
|
|
8
8
|
namespace "avo:field"
|
9
9
|
desc "Add a custom Avo field to your project."
|
10
10
|
|
11
|
+
class_option "field-template", type: :string, required: false
|
12
|
+
|
11
13
|
def handle
|
12
|
-
|
13
|
-
|
14
|
+
return field_from_template if field_template.present?
|
15
|
+
|
16
|
+
directory "field/components", destination_components_path
|
17
|
+
template "field/%singular_name%_field.rb.tt", destination_field_path
|
18
|
+
end
|
19
|
+
|
20
|
+
no_tasks do
|
21
|
+
def field_from_template
|
22
|
+
if !File.file? ::Avo::Engine.root.join(template_field_path)
|
23
|
+
return say("Failed to find the `#{field_template}` template field.", :yellow)
|
24
|
+
end
|
25
|
+
|
26
|
+
if !Dir.exist? ::Avo::Engine.root.join(template_components_path)
|
27
|
+
return say("Failed to find the `#{field_template}` template field components.", :yellow)
|
28
|
+
end
|
29
|
+
|
30
|
+
directory ::Avo::Engine.root.join(template_components_path), destination_components_path
|
31
|
+
copy_file ::Avo::Engine.root.join(template_field_path), destination_field_path
|
32
|
+
|
33
|
+
Dir.glob("#{destination_components_path}/*").push(destination_field_path).each do |file|
|
34
|
+
modified_content = File.read(file).gsub("#{field_template.camelize}Field", "#{singular_name.camelize}Field")
|
35
|
+
|
36
|
+
File.open(file, "w") do |open_file|
|
37
|
+
open_file.puts modified_content
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def field_template
|
43
|
+
options["field-template"]
|
44
|
+
end
|
45
|
+
|
46
|
+
def template_field_path
|
47
|
+
"lib/avo/fields/#{field_template}_field.rb"
|
48
|
+
end
|
49
|
+
|
50
|
+
def template_components_path
|
51
|
+
"app/components/avo/fields/#{field_template}_field"
|
52
|
+
end
|
53
|
+
|
54
|
+
def destination_components_path
|
55
|
+
"#{::Avo.configuration.view_component_path}/avo/fields/#{singular_name}_field"
|
56
|
+
end
|
57
|
+
|
58
|
+
def destination_field_path
|
59
|
+
"app/avo/fields/#{singular_name}_field.rb"
|
60
|
+
end
|
14
61
|
end
|
15
62
|
end
|
16
63
|
end
|
@@ -5,20 +5,20 @@ module Generators
|
|
5
5
|
class FilterGenerator < NamedBaseGenerator
|
6
6
|
source_root File.expand_path("templates", __dir__)
|
7
7
|
|
8
|
-
class_option :
|
9
|
-
class_option :select, type: :boolean
|
10
|
-
class_option :text, type: :boolean
|
8
|
+
class_option :type, type: :string, default: "boolean"
|
11
9
|
|
12
10
|
namespace "avo:filter"
|
13
11
|
|
14
12
|
def create_resource_file
|
15
|
-
type
|
13
|
+
raise "Invalid filter type '#{options[:type]}'" unless filter_types.include? options[:type]
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
template "filters/#{options[:type]}_filter.tt", "app/avo/filters/#{singular_name}.rb"
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
20
19
|
|
21
|
-
|
20
|
+
def filter_types
|
21
|
+
%w[boolean select text multiple_select]
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -31,7 +31,7 @@ module Generators
|
|
31
31
|
end
|
32
32
|
|
33
33
|
say "Ejecting the _head.html.erb partial"
|
34
|
-
Rails::Generators.invoke("avo:eject", [":head", "--skip-avo-version"], {destination_root: Rails.root})
|
34
|
+
Rails::Generators.invoke("avo:eject", ["--partial", ":head", "--skip-avo-version"], {destination_root: Rails.root})
|
35
35
|
|
36
36
|
say "Adding the JS asset to the partial"
|
37
37
|
append_to_file Rails.root.join("app", "views", "avo", "partials", "_head.html.erb"), "<%= javascript_importmap_tags \"avo.custom\" %>"
|
@@ -48,7 +48,7 @@ module Generators
|
|
48
48
|
end
|
49
49
|
|
50
50
|
say "Ejecting the _head.html.erb partial"
|
51
|
-
Rails::Generators.invoke("avo:eject", [":head", "--skip-avo-version"], {destination_root: Rails.root})
|
51
|
+
Rails::Generators.invoke("avo:eject", ["--partial", ":head", "--skip-avo-version"], {destination_root: Rails.root})
|
52
52
|
|
53
53
|
say "Adding the JS asset to the partial"
|
54
54
|
append_to_file Rails.root.join("app", "views", "avo", "partials", "_head.html.erb"), "<%= javascript_include_tag \"avo.custom\", \"data-turbo-track\": \"reload\", defer: true %>"
|
@@ -1,16 +1,19 @@
|
|
1
1
|
require_relative "named_base_generator"
|
2
|
+
require_relative "concerns/parent_controller"
|
2
3
|
|
3
4
|
module Generators
|
4
5
|
module Avo
|
5
6
|
class ResourceGenerator < NamedBaseGenerator
|
7
|
+
include Generators::Avo::Concerns::ParentController
|
8
|
+
|
6
9
|
source_root File.expand_path("templates", __dir__)
|
7
10
|
|
8
11
|
namespace "avo:resource"
|
9
12
|
|
10
13
|
class_option "model-class",
|
14
|
+
desc: "The name of the model.",
|
11
15
|
type: :string,
|
12
|
-
required: false
|
13
|
-
desc: "The name of the model."
|
16
|
+
required: false
|
14
17
|
|
15
18
|
def create
|
16
19
|
template "resource/resource.tt", "app/avo/resources/#{resource_name}.rb"
|
@@ -18,7 +21,7 @@ module Generators
|
|
18
21
|
end
|
19
22
|
|
20
23
|
def resource_class
|
21
|
-
|
24
|
+
class_name.remove(":").to_s
|
22
25
|
end
|
23
26
|
|
24
27
|
def controller_class
|
@@ -26,7 +29,7 @@ module Generators
|
|
26
29
|
end
|
27
30
|
|
28
31
|
def resource_name
|
29
|
-
|
32
|
+
model_resource_name.to_s
|
30
33
|
end
|
31
34
|
|
32
35
|
def controller_name
|
@@ -132,16 +135,16 @@ module Generators
|
|
132
135
|
def generated_fields_template
|
133
136
|
return if fields.blank?
|
134
137
|
|
135
|
-
fields_string = "
|
138
|
+
fields_string = ""
|
136
139
|
|
137
140
|
fields.each do |field_name, field_options|
|
138
141
|
# if field_options are not available (likely a missing resource for an association), skip the field
|
139
|
-
fields_string += "\n
|
140
|
-
|
142
|
+
fields_string += "\n # Could not generate a field for #{field_name}" and next unless field_options
|
143
|
+
|
141
144
|
options = ""
|
142
145
|
field_options[:options].each { |k, v| options += ", #{k}: #{v}" } if field_options[:options].present?
|
143
146
|
|
144
|
-
fields_string += "\n
|
147
|
+
fields_string += "\n #{field_string field_name, field_options[:field], options}"
|
145
148
|
end
|
146
149
|
|
147
150
|
fields_string
|
@@ -163,7 +166,7 @@ module Generators
|
|
163
166
|
|
164
167
|
def fields_from_model_rich_texts
|
165
168
|
rich_texts.each do |name, _|
|
166
|
-
fields[
|
169
|
+
fields[name.delete_prefix("rich_text_")] = {field: "trix"}
|
167
170
|
end
|
168
171
|
end
|
169
172
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative "named_base_generator"
|
2
|
+
|
3
|
+
module Generators
|
4
|
+
module Avo
|
5
|
+
class ScopeGenerator < NamedBaseGenerator
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
7
|
+
|
8
|
+
namespace "avo:scope"
|
9
|
+
|
10
|
+
def create
|
11
|
+
template "scope.tt", "app/avo/scopes/#{singular_name}.rb"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -11,17 +11,31 @@ module Generators
|
|
11
11
|
|
12
12
|
def create_files
|
13
13
|
unless tailwindcss_installed?
|
14
|
+
say "Installing Tailwindcss"
|
14
15
|
system "./bin/bundle add tailwindcss-rails"
|
15
16
|
system "./bin/rails tailwindcss:install"
|
16
17
|
end
|
17
18
|
|
18
|
-
unless Rails.root.join("
|
19
|
-
say "
|
20
|
-
copy_file template_path("
|
19
|
+
unless (path = Rails.root.join("config", "avo", "tailwind.config.js")).exist?
|
20
|
+
say "Generating the Avo config file."
|
21
|
+
copy_file template_path("tailwind.config.js"), path
|
21
22
|
end
|
22
23
|
|
24
|
+
unless (path = Rails.root.join("app", "assets", "stylesheets", "avo", "tailwindcss")).exist?
|
25
|
+
say "Generating the tailwindcss directory."
|
26
|
+
directory ::Avo::Engine.root.join("app", "assets", "stylesheets", "css", "tailwindcss"), path
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
unless (path = Rails.root.join("app", "assets", "stylesheets", "avo" ,"tailwind.css")).exist?
|
31
|
+
say "Add default tailwind.css"
|
32
|
+
copy_file template_path("avo.tailwind.css"), path
|
33
|
+
end
|
34
|
+
|
35
|
+
script_name = "avo:tailwind:css"
|
23
36
|
if Rails.root.join("Procfile.dev").exist?
|
24
|
-
|
37
|
+
say "Add #{cmd = "avo_css: yarn #{script_name} --watch"} to Procfile.dev"
|
38
|
+
append_to_file "Procfile.dev", "#{cmd}\n"
|
25
39
|
else
|
26
40
|
say "Add default Procfile.dev"
|
27
41
|
copy_file template_path("Procfile.dev"), "Procfile.dev"
|
@@ -30,28 +44,64 @@ module Generators
|
|
30
44
|
run "gem install foreman"
|
31
45
|
end
|
32
46
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
47
|
+
script_command = "tailwindcss -i ./app/assets/stylesheets/avo/tailwind.css -o ./app/assets/builds/avo.tailwind.css -c ./config/avo/tailwind.config.js --minify"
|
48
|
+
pretty_script_command = "\"#{script_name}\": \"#{script_command}\""
|
49
|
+
|
50
|
+
if (path = Rails.root.join("package.json")).exist?
|
51
|
+
say "Add #{pretty_script_command} to package.json"
|
52
|
+
json_data = JSON.parse(File.read(path))
|
53
|
+
json_data["scripts"] ||= {}
|
54
|
+
json_data["scripts"][script_name] = script_command
|
55
|
+
|
56
|
+
File.open(path, 'w') do |file|
|
57
|
+
file.write(JSON.pretty_generate(json_data) + "\n")
|
58
|
+
end
|
59
|
+
else
|
60
|
+
say "package.json not found.", :yellow
|
61
|
+
say "Ensure you have the following script in your package.json file.", :yellow
|
62
|
+
say "\"scripts\": {\n" \
|
63
|
+
" #{pretty_script_command}\n" \
|
64
|
+
"}", :green
|
37
65
|
end
|
38
66
|
|
39
|
-
|
40
|
-
|
67
|
+
rake_enhance = <<~RUBY
|
68
|
+
|
69
|
+
# When running `rake assets:precompile` this is the order of events:
|
70
|
+
# 1 - Task `avo:yarn_install`
|
71
|
+
# 2 - Task `avo:sym_link`
|
72
|
+
# 3 - Cmd `yarn avo:tailwind:css`
|
73
|
+
# 4 - Task `assets:precompile`
|
74
|
+
Rake::Task["assets:precompile"].enhance(["avo:sym_link"])
|
75
|
+
Rake::Task["avo:sym_link"].enhance(["avo:yarn_install"])
|
76
|
+
Rake::Task["avo:sym_link"].enhance do
|
77
|
+
`yarn avo:tailwind:css`
|
78
|
+
end
|
79
|
+
|
80
|
+
RUBY
|
41
81
|
|
42
|
-
|
43
|
-
|
44
|
-
|
82
|
+
if (path = Rails.root.join("Rakefile")).exist?
|
83
|
+
say "Add #{rake_enhance.strip} to Rakefile"
|
84
|
+
append_to_file path, rake_enhance
|
85
|
+
else
|
86
|
+
say "Rakefile not found.", :yellow
|
87
|
+
say "Ensure you have the following code in your Rakefile file.", :yellow
|
88
|
+
say rake_enhance, :green
|
89
|
+
end
|
90
|
+
|
91
|
+
say "Make sure you run \"bundle exec rake avo:sym_link\" and \"bundle exec rake avo:yarn_install\" before compiling the assets with the \"#{script_name}\" task.", :green
|
92
|
+
if (path = Rails.root.join("bin", "dev")).exist?
|
93
|
+
lines = File.read(path).lines
|
94
|
+
|
95
|
+
# Insert the task after the shebang line (the first line)
|
96
|
+
shebang = lines.first
|
97
|
+
lines[0] = "#{shebang}\nbundle exec rake avo:sym_link\nbundle exec rake avo:yarn_install\n"
|
98
|
+
|
99
|
+
|
100
|
+
File.write(path, lines.join)
|
101
|
+
end
|
45
102
|
end
|
46
103
|
|
47
104
|
no_tasks do
|
48
|
-
def setup_tailwind_script
|
49
|
-
tailwind_config_path = tailwindcss_config_path()
|
50
|
-
tailwind_script = "tailwindcss -i ./app/assets/stylesheets/avo.tailwind.css -o ./app/assets/builds/avo.tailwind.css"
|
51
|
-
tailwind_script += " -c #{tailwind_config_path}" if tailwind_config_path
|
52
|
-
tailwind_script
|
53
|
-
end
|
54
|
-
|
55
105
|
def template_path(filename)
|
56
106
|
Pathname.new(__dir__).join("..", "templates", "tailwindcss", filename).to_s
|
57
107
|
end
|
@@ -59,12 +109,6 @@ module Generators
|
|
59
109
|
def tailwindcss_installed?
|
60
110
|
Rails.root.join("config", "tailwind.config.js").exist? || Rails.root.join("tailwind.config.js").exist?
|
61
111
|
end
|
62
|
-
|
63
|
-
def tailwindcss_config_path
|
64
|
-
if Rails.root.join("config", "tailwind.config.js").exist?
|
65
|
-
"./config/tailwind.config.js"
|
66
|
-
end
|
67
|
-
end
|
68
112
|
end
|
69
113
|
end
|
70
114
|
end
|
@@ -1,14 +1,16 @@
|
|
1
|
-
class
|
2
|
-
|
1
|
+
class Avo::Actions::<%= class_name.camelize %> < Avo::BaseAction
|
2
|
+
<%= configuration_options %>
|
3
3
|
# self.visible = -> do
|
4
4
|
# true
|
5
5
|
# end
|
6
6
|
|
7
|
-
def
|
8
|
-
|
7
|
+
# def fields
|
8
|
+
# # Add Action fields here
|
9
|
+
# end
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
def handle(records:, fields:, current_user:, resource:, **args)
|
12
|
+
records.each do |record|
|
13
|
+
# Do something with your records.
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class
|
1
|
+
class Avo::Cards::<%= class_name.camelize %> < Avo::Dashboards::PartialCard
|
2
2
|
self.id = "<%= name.underscore %>"
|
3
3
|
self.label = "<%= name.underscore.humanize %>"
|
4
4
|
self.partial = "avo/cards/<%= name.underscore %>"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class
|
1
|
+
class Avo::Cards::<%= class_name.camelize %> < Avo::Dashboards::PartialCard
|
2
2
|
self.id = "<%= name.underscore %>"
|
3
3
|
self.label = "<%= name.underscore.humanize %>"
|
4
4
|
self.partial = "avo/cards/<%= name.underscore %>"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class
|
1
|
+
class Avo::Dashboards::<%= class_name.camelize %> < Avo::Dashboards::BaseDashboard
|
2
2
|
self.id = "<%= name.underscore %>"
|
3
3
|
self.name = "<%= name.underscore.humanize %>"
|
4
4
|
# self.description = "Tiny dashboard description"
|
@@ -7,6 +7,8 @@ class <%= class_name.camelize %> < Avo::Dashboards::BaseDashboard
|
|
7
7
|
# true
|
8
8
|
# end
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
def cards
|
11
|
+
# cards go here
|
12
|
+
# card UsersCount
|
13
|
+
end
|
12
14
|
end
|