avo 2.45.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.

Files changed (371) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +8 -8
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/index_component.rb +5 -5
  40. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  41. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  42. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  43. data/app/components/avo/fields/show_component.rb +4 -1
  44. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  45. data/app/components/avo/filters_component.html.erb +9 -3
  46. data/app/components/avo/filters_component.rb +4 -4
  47. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  48. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  49. data/app/components/avo/index/grid_item_component.rb +43 -16
  50. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  51. data/app/components/avo/index/resource_controls_component.rb +124 -17
  52. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  53. data/app/components/avo/index/resource_grid_component.rb +5 -2
  54. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  55. data/app/components/avo/index/resource_map_component.rb +3 -3
  56. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  57. data/app/components/avo/index/resource_table_component.rb +14 -20
  58. data/app/components/avo/index/table_row_component.html.erb +8 -4
  59. data/app/components/avo/index/table_row_component.rb +3 -2
  60. data/app/components/avo/item_switcher_component.rb +2 -2
  61. data/app/components/avo/modal_component.html.erb +7 -12
  62. data/app/components/avo/modal_component.rb +0 -21
  63. data/app/components/avo/paginator_component.html.erb +40 -29
  64. data/app/components/avo/paginator_component.rb +5 -23
  65. data/app/components/avo/panel_component.html.erb +8 -6
  66. data/app/components/avo/referrer_params_component.html.erb +1 -2
  67. data/app/components/avo/resource_component.rb +189 -14
  68. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  69. data/app/components/avo/resource_sidebar_component.rb +1 -1
  70. data/app/components/avo/sidebar/link_component.rb +1 -1
  71. data/app/components/avo/sidebar_component.html.erb +10 -3
  72. data/app/components/avo/sidebar_component.rb +5 -3
  73. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  74. data/app/components/avo/tab_group_component.html.erb +13 -7
  75. data/app/components/avo/tab_group_component.rb +1 -6
  76. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  77. data/app/components/avo/tab_switcher_component.rb +4 -39
  78. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  79. data/app/components/avo/views/resource_edit_component.rb +7 -18
  80. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  81. data/app/components/avo/views/resource_index_component.rb +62 -12
  82. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  83. data/app/components/avo/views/resource_show_component.rb +6 -11
  84. data/app/controllers/avo/actions_controller.rb +27 -24
  85. data/app/controllers/avo/application_controller.rb +105 -151
  86. data/app/controllers/avo/associations_controller.rb +34 -43
  87. data/app/controllers/avo/attachments_controller.rb +4 -4
  88. data/app/controllers/avo/base_controller.rb +102 -102
  89. data/app/controllers/avo/debug_controller.rb +17 -5
  90. data/app/controllers/avo/home_controller.rb +1 -1
  91. data/app/controllers/avo/search_controller.rb +30 -51
  92. data/app/controllers/avo/team_users_controller.rb +4 -0
  93. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  94. data/app/helpers/avo/application_helper.rb +15 -9
  95. data/app/helpers/avo/resources_helper.rb +1 -1
  96. data/app/helpers/avo/url_helpers.rb +27 -11
  97. data/app/javascript/avo.base.js +1 -0
  98. data/app/javascript/js/application.js +0 -3
  99. data/app/javascript/js/controllers/action_controller.js +5 -3
  100. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  101. data/app/javascript/js/controllers/filter_controller.js +1 -1
  102. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  103. data/app/javascript/js/controllers/preview_controller.js +24 -0
  104. data/app/javascript/js/controllers/search_controller.js +2 -2
  105. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  106. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  107. data/app/javascript/js/controllers.js +10 -6
  108. data/app/javascript/js/custom-stream-actions.js +15 -0
  109. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  110. data/app/views/avo/actions/show.html.erb +9 -6
  111. data/app/views/avo/associations/new.html.erb +2 -2
  112. data/app/views/avo/base/index.html.erb +3 -2
  113. data/app/views/avo/base/new.html.erb +2 -1
  114. data/app/views/avo/base/preview.html.erb +19 -0
  115. data/app/views/avo/base/show.html.erb +1 -1
  116. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  117. data/app/views/avo/debug/report.html.erb +32 -17
  118. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  119. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  120. data/app/views/avo/partials/_footer.html.erb +1 -1
  121. data/app/views/avo/partials/_javascript.html.erb +5 -0
  122. data/app/views/avo/partials/_logo.html.erb +1 -1
  123. data/app/views/avo/partials/_navbar.html.erb +3 -5
  124. data/app/views/avo/partials/_table_header.html.erb +5 -11
  125. data/app/views/layouts/avo/application.html.erb +4 -2
  126. data/avo.gemspec +7 -7
  127. data/bin/dev +1 -1
  128. data/bin/prod +0 -0
  129. data/config/i18n-tasks.yml +1 -1
  130. data/config/initializers/pagy.rb +0 -2
  131. data/config/master.key +1 -0
  132. data/config/routes.rb +6 -10
  133. data/db/factories.rb +7 -1
  134. data/lib/avo/action_model.rb +20 -0
  135. data/lib/avo/asset_manager.rb +30 -0
  136. data/lib/avo/base_action.rb +57 -41
  137. data/lib/avo/base_resource.rb +263 -226
  138. data/lib/avo/base_resource_tool.rb +9 -16
  139. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  140. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  141. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  142. data/lib/avo/concerns/has_controls.rb +37 -0
  143. data/lib/avo/concerns/has_description.rb +23 -0
  144. data/lib/avo/concerns/has_item_type.rb +42 -0
  145. data/lib/avo/concerns/has_items.rb +325 -0
  146. data/lib/avo/concerns/is_resource_item.rb +24 -36
  147. data/lib/avo/concerns/is_visible.rb +15 -0
  148. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  149. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  150. data/lib/avo/configuration/branding.rb +0 -12
  151. data/lib/avo/configuration.rb +1 -37
  152. data/lib/avo/current.rb +39 -0
  153. data/lib/avo/dsl/field_parser.rb +1 -1
  154. data/lib/avo/dynamic_router.rb +18 -3
  155. data/lib/avo/engine.rb +35 -30
  156. data/lib/avo/error_manager.rb +25 -0
  157. data/lib/avo/execution_context.rb +10 -14
  158. data/lib/avo/fields/badge_field.rb +1 -1
  159. data/lib/avo/fields/base_field.rb +91 -105
  160. data/lib/avo/fields/belongs_to_field.rb +18 -22
  161. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  162. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  163. data/lib/avo/fields/concerns/has_default.rb +1 -5
  164. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  165. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  166. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  167. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  168. data/lib/avo/fields/concerns/is_required.rb +5 -7
  169. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  170. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  171. data/lib/avo/fields/country_field.rb +4 -0
  172. data/lib/avo/fields/date_time_field.rb +1 -5
  173. data/lib/avo/fields/field_manager.rb +55 -0
  174. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  175. data/lib/avo/fields/has_base_field.rb +12 -15
  176. data/lib/avo/fields/has_many_field.rb +5 -2
  177. data/lib/avo/fields/has_one_field.rb +6 -10
  178. data/lib/avo/fields/heading_field.rb +4 -1
  179. data/lib/avo/fields/hidden_field.rb +1 -1
  180. data/lib/avo/fields/id_field.rb +1 -1
  181. data/lib/avo/fields/location_field.rb +8 -8
  182. data/lib/avo/fields/password_field.rb +1 -1
  183. data/lib/avo/fields/preview_field.rb +14 -0
  184. data/lib/avo/fields/select_field.rb +12 -8
  185. data/lib/avo/fields/status_field.rb +4 -0
  186. data/lib/avo/filters/base_filter.rb +8 -4
  187. data/lib/avo/html/builder.rb +7 -8
  188. data/lib/avo/item_grapher.rb +78 -0
  189. data/lib/avo/licensing/h_q.rb +7 -66
  190. data/lib/avo/licensing/license.rb +1 -1
  191. data/lib/avo/licensing/pro_license.rb +1 -7
  192. data/lib/avo/loaders/fields_loader.rb +7 -1
  193. data/lib/avo/plugin.rb +16 -0
  194. data/lib/avo/plugin_manager.rb +56 -0
  195. data/lib/avo/prefixed_test_helpers.rb +20 -0
  196. data/lib/avo/reloader.rb +3 -0
  197. data/lib/avo/resources/controls/actions_list.rb +7 -12
  198. data/lib/avo/resources/controls/attach_button.rb +15 -0
  199. data/lib/avo/resources/controls/back_button.rb +1 -1
  200. data/lib/avo/resources/controls/base_control.rb +15 -49
  201. data/lib/avo/resources/controls/create_button.rb +15 -0
  202. data/lib/avo/resources/controls/delete_button.rb +5 -1
  203. data/lib/avo/resources/controls/detach_button.rb +4 -1
  204. data/lib/avo/resources/controls/edit_button.rb +4 -1
  205. data/lib/avo/resources/controls/order_controls.rb +8 -0
  206. data/lib/avo/resources/controls/save_button.rb +13 -0
  207. data/lib/avo/resources/controls/show_button.rb +15 -0
  208. data/lib/avo/resources/items/holder.rb +84 -0
  209. data/lib/avo/resources/items/item_group.rb +49 -0
  210. data/lib/avo/resources/items/main_panel.rb +2 -0
  211. data/lib/avo/resources/items/panel.rb +2 -0
  212. data/lib/avo/resources/items/row.rb +54 -0
  213. data/lib/avo/resources/items/sidebar.rb +47 -0
  214. data/lib/avo/resources/items/tab.rb +60 -0
  215. data/lib/avo/resources/items/tab_group.rb +68 -0
  216. data/lib/avo/resources/resource_manager.rb +174 -0
  217. data/lib/avo/services/authorization_service.rb +11 -110
  218. data/lib/avo/services/debug_service.rb +93 -0
  219. data/lib/avo/services/telemetry_service.rb +85 -0
  220. data/lib/avo/test_helpers.rb +362 -0
  221. data/lib/avo/tools/tool_manager.rb +30 -0
  222. data/lib/avo/version.rb +1 -1
  223. data/lib/avo.rb +115 -24
  224. data/lib/generators/avo/action_generator.rb +8 -8
  225. data/lib/generators/avo/card_generator.rb +27 -0
  226. data/lib/generators/avo/filter_generator.rb +8 -8
  227. data/lib/generators/avo/resource_generator.rb +4 -4
  228. data/lib/generators/avo/scope_generator.rb +15 -0
  229. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  230. data/lib/generators/avo/templates/action.tt +8 -6
  231. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  232. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  233. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  234. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  235. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  236. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  237. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  238. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  239. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  240. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  241. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  242. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  243. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  244. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  245. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  246. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  247. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  248. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  249. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  250. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  251. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  252. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  253. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  254. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  255. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  256. data/lib/generators/avo/templates/scope.tt +6 -0
  257. data/lib/generators/avo/templates/tool/view.tt +2 -2
  258. data/lib/tasks/avo_tasks.rake +27 -0
  259. data/public/avo-assets/avo.base.css +1810 -1189
  260. data/public/avo-assets/avo.base.js +217 -305
  261. data/public/avo-assets/avo.base.js.map +3 -3
  262. data/public/avo-assets/avo.css +9744 -0
  263. data/public/avo-assets/avo.js +513 -0
  264. data/public/avo-assets/avo.js.map +7 -0
  265. metadata +96 -137
  266. data/app/assets/stylesheets/css/tags.css +0 -32
  267. data/app/components/avo/card_component.html.erb +0 -46
  268. data/app/components/avo/card_component.rb +0 -25
  269. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  270. data/app/components/avo/dashboards/divider_component.rb +0 -19
  271. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  272. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  273. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  274. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  275. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  276. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  277. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  278. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  279. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  280. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  281. data/app/components/avo/index/ordering/base_component.rb +0 -9
  282. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  283. data/app/components/avo/index/ordering/button_component.rb +0 -23
  284. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  285. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  286. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  287. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  288. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  289. data/app/controllers/avo/dashboards_controller.rb +0 -22
  290. data/app/controllers/avo/reorder_controller.rb +0 -25
  291. data/app/javascript/js/controllers/base_controller.js +0 -22
  292. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  293. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  294. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  295. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  296. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  297. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  298. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  299. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  300. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  301. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  302. data/app/views/avo/dashboards/show.html.erb +0 -38
  303. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  304. data/app/views/avo/partials/_global_search.html.erb +0 -19
  305. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  306. data/lib/avo/app.rb +0 -237
  307. data/lib/avo/base_card.rb +0 -161
  308. data/lib/avo/concerns/fetches_things.rb +0 -150
  309. data/lib/avo/concerns/handles_field_args.rb +0 -47
  310. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  311. data/lib/avo/concerns/has_fields.rb +0 -334
  312. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  313. data/lib/avo/concerns/pagination.rb +0 -53
  314. data/lib/avo/concerns/policy_helpers.rb +0 -31
  315. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  316. data/lib/avo/concerns/visible_items.rb +0 -51
  317. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  318. data/lib/avo/dashboards/base_divider.rb +0 -35
  319. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  320. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  321. data/lib/avo/dashboards/metric_card.rb +0 -9
  322. data/lib/avo/dashboards/partial_card.rb +0 -7
  323. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  324. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  325. data/lib/avo/fields/tags_field.rb +0 -102
  326. data/lib/avo/grid_collector.rb +0 -42
  327. data/lib/avo/hosts/association_scope_host.rb +0 -8
  328. data/lib/avo/hosts/base_host.rb +0 -25
  329. data/lib/avo/hosts/card_visibility.rb +0 -20
  330. data/lib/avo/hosts/dashboard_card.rb +0 -22
  331. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  332. data/lib/avo/hosts/ordering.rb +0 -22
  333. data/lib/avo/hosts/record_host.rb +0 -7
  334. data/lib/avo/hosts/resource_record_host.rb +0 -7
  335. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  336. data/lib/avo/hosts/search_scope_host.rb +0 -7
  337. data/lib/avo/hosts/view_record_host.rb +0 -7
  338. data/lib/avo/hosts/visibility_host.rb +0 -12
  339. data/lib/avo/items_holder.rb +0 -96
  340. data/lib/avo/main_panel.rb +0 -3
  341. data/lib/avo/menu/base_item.rb +0 -25
  342. data/lib/avo/menu/builder.rb +0 -82
  343. data/lib/avo/menu/dashboard.rb +0 -22
  344. data/lib/avo/menu/group.rb +0 -2
  345. data/lib/avo/menu/link.rb +0 -6
  346. data/lib/avo/menu/menu.rb +0 -2
  347. data/lib/avo/menu/resource.rb +0 -22
  348. data/lib/avo/menu/section.rb +0 -2
  349. data/lib/avo/panel.rb +0 -24
  350. data/lib/avo/panel_builder.rb +0 -25
  351. data/lib/avo/resources/controls/action.rb +0 -38
  352. data/lib/avo/resources/controls/execution_context.rb +0 -58
  353. data/lib/avo/resources/controls/items_holder.rb +0 -19
  354. data/lib/avo/resources/controls/link_to.rb +0 -27
  355. data/lib/avo/row.rb +0 -26
  356. data/lib/avo/row_builder.rb +0 -24
  357. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  358. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  359. data/lib/avo/sidebar.rb +0 -30
  360. data/lib/avo/sidebar_builder.rb +0 -24
  361. data/lib/avo/tab.rb +0 -72
  362. data/lib/avo/tab_builder.rb +0 -25
  363. data/lib/avo/tab_group.rb +0 -42
  364. data/lib/avo/tab_group_builder.rb +0 -43
  365. data/lib/avo/tools_manager.rb +0 -11
  366. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  367. data/lib/generators/avo/card/metric_generator.rb +0 -18
  368. data/lib/generators/avo/card/partial_generator.rb +0 -19
  369. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  370. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  371. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -0,0 +1,126 @@
1
+ module Avo
2
+ module Concerns
3
+ module VisibleInDifferentViews
4
+ attr_accessor :show_on_index
5
+ attr_accessor :show_on_show
6
+ attr_accessor :show_on_new
7
+ attr_accessor :show_on_edit
8
+ attr_accessor :show_on_preview
9
+
10
+ def post_initialize
11
+ initialize_views
12
+ end
13
+
14
+ def initialize_views
15
+ # Set defaults
16
+ @show_on_index = @show_on_index.nil? ? true : @show_on_index
17
+ @show_on_show = @show_on_show.nil? ? true : @show_on_show
18
+ @show_on_new = @show_on_new.nil? ? true : @show_on_new
19
+ @show_on_edit = @show_on_edit.nil? ? true : @show_on_edit
20
+ @show_on_preview = @show_on_preview.nil? ? false : @show_on_preview
21
+
22
+ if @args.present?
23
+ # Execute options
24
+ show_on @args[:show_on] if @args[:show_on].present?
25
+ hide_on @args[:hide_on] if @args[:hide_on].present?
26
+ only_on @args[:only_on] if @args[:only_on].present?
27
+ except_on @args[:except_on] if @args[:except_on].present?
28
+ end
29
+ end
30
+
31
+ # Validates if the field is visible on certain view
32
+ def visible_in_view?(view:)
33
+ raise "No view specified on visibility check." if view.blank?
34
+
35
+ send "show_on_#{view}"
36
+ end
37
+
38
+ def show_on(*where)
39
+ return show_on_all if where.include? :all
40
+
41
+ normalize_views(where).flatten.each do |view|
42
+ show_on_view view
43
+ end
44
+ end
45
+
46
+ def hide_on(*where)
47
+ return hide_on_all if where.include? :all
48
+
49
+ normalize_views(where).flatten.each do |view|
50
+ hide_on_view view
51
+ end
52
+ end
53
+
54
+ def only_on(*where)
55
+ hide_on_all
56
+ normalize_views(where).flatten.each do |view|
57
+ show_on_view view
58
+ end
59
+ end
60
+
61
+ def except_on(*where)
62
+ show_on_all
63
+ normalize_views(where).flatten.each do |view|
64
+ show_on_view view
65
+ end
66
+ end
67
+
68
+ # When submitting the form on creation, the new page will be create but we don't have a visibility marker for create so we'll default to new
69
+ def show_on_create
70
+ show_on_new
71
+ end
72
+
73
+ # When submitting the form on update, the new page will be create but we don't have a visibility marker for update so we'll default to edit
74
+ def show_on_update
75
+ show_on_edit
76
+ end
77
+
78
+ private
79
+
80
+ def show_on_view(view)
81
+ send("show_on_#{view}=", true)
82
+ end
83
+
84
+ def hide_on_view(view)
85
+ send("show_on_#{view}=", false)
86
+ end
87
+
88
+ def only_on_view(view)
89
+ hide_on_all
90
+ show_on_view view
91
+ end
92
+
93
+ def except_on_view(view)
94
+ show_on_all
95
+ hide_on_view view
96
+ end
97
+
98
+ def show_on_all
99
+ @show_on_index = true
100
+ @show_on_show = true
101
+ @show_on_edit = true
102
+ @show_on_new = true
103
+ @show_on_preview = true
104
+ end
105
+
106
+ def hide_on_all
107
+ @show_on_index = false
108
+ @show_on_show = false
109
+ @show_on_edit = false
110
+ @show_on_new = false
111
+ @show_on_preview = false
112
+ end
113
+
114
+ def normalize_views(*views_and_groups)
115
+ forms = views_and_groups.flatten! & [:forms]
116
+
117
+ if forms.present?
118
+ views_and_groups -= forms
119
+ views_and_groups += [:new, :edit]
120
+ end
121
+
122
+ views_and_groups.flatten.uniq
123
+ end
124
+ end
125
+ end
126
+ end
@@ -32,40 +32,28 @@ class Avo::Configuration::Branding
32
32
  end
33
33
 
34
34
  def logo
35
- return @default_logo if Avo::App.license.lacks_with_trial(:branding)
36
-
37
35
  @logo || @default_logo
38
36
  end
39
37
 
40
38
  def logomark
41
- return @default_logomark if Avo::App.license.lacks_with_trial(:branding)
42
-
43
39
  @logomark || @default_logomark
44
40
  end
45
41
 
46
42
  def placeholder
47
- return @default_placeholder if Avo::App.license.lacks_with_trial(:branding)
48
-
49
43
  @placeholder || @default_placeholder
50
44
  end
51
45
 
52
46
  def chart_colors
53
- return @default_chart_colors if Avo::App.license.lacks_with_trial(:branding)
54
-
55
47
  @chart_colors || @default_chart_colors
56
48
  end
57
49
 
58
50
  def favicon
59
- return @default_favicon if Avo::App.license.lacks_with_trial(:branding)
60
-
61
51
  @favicon || @default_favicon
62
52
  end
63
53
 
64
54
  private
65
55
 
66
56
  def colors
67
- return @default_colors if Avo::App.license.lacks_with_trial(:branding)
68
-
69
57
  @default_colors.merge(@colors) || @default_colors
70
58
  end
71
59
 
@@ -5,7 +5,6 @@ module Avo
5
5
  attr_writer :app_name
6
6
  attr_writer :branding
7
7
  attr_writer :root_path
8
- attr_writer :cache_store
9
8
  attr_accessor :timezone
10
9
  attr_accessor :per_page
11
10
  attr_accessor :per_page_steps
@@ -38,7 +37,6 @@ module Avo
38
37
  attr_accessor :main_menu
39
38
  attr_accessor :profile_menu
40
39
  attr_accessor :model_resource_mapping
41
- attr_accessor :tabs_style
42
40
  attr_accessor :resource_default_view
43
41
  attr_accessor :authorization_client
44
42
  attr_accessor :field_wrapper_layout
@@ -91,13 +89,10 @@ module Avo
91
89
  @main_menu = nil
92
90
  @profile_menu = nil
93
91
  @model_resource_mapping = {}
94
- @tabs_style = :tabs
95
92
  @resource_default_view = :show
96
93
  @authorization_client = :pundit
97
94
  @field_wrapper_layout = :inline
98
95
  @resources = nil
99
- @prefix_path = nil
100
- @cache_store = computed_cache_store
101
96
  end
102
97
 
103
98
  def current_user_method(&block)
@@ -143,38 +138,7 @@ module Avo
143
138
  end
144
139
 
145
140
  def app_name
146
- if @app_name.respond_to? :call
147
- Avo::Hosts::BaseHost.new(block: @app_name).handle
148
- else
149
- @app_name
150
- end
151
- end
152
-
153
- def cache_store
154
- Avo::ExecutionContext.new(
155
- target: @cache_store,
156
- production_rejected_cache_stores: %w[ActiveSupport::Cache::MemoryStore ActiveSupport::Cache::NullStore]
157
- ).handle
158
- end
159
-
160
- # When not in production or test we'll just use the MemoryStore which is good enough.
161
- # When running in production we'll use Rails.cache if it's not ActiveSupport::Cache::MemoryStore or ActiveSupport::Cache::NullStore.
162
- # If it's one of rejected cache stores, we'll use the FileStore.
163
- # We decided against the MemoryStore in production because it will not be shared between multiple processes (when using Puma).
164
- def computed_cache_store
165
- -> {
166
- if Rails.env.production?
167
- if Rails.cache.class.to_s.in?(production_rejected_cache_stores)
168
- ActiveSupport::Cache.lookup_store(:file_store, Rails.root.join("tmp", "cache"))
169
- else
170
- Rails.cache
171
- end
172
- elsif Rails.env.test?
173
- Rails.cache
174
- else
175
- ActiveSupport::Cache.lookup_store(:memory_store)
176
- end
177
- }
141
+ Avo::ExecutionContext.new(target: @app_name).handle
178
142
  end
179
143
  end
180
144
 
@@ -0,0 +1,39 @@
1
+ class Avo::Current < ActiveSupport::CurrentAttributes
2
+ # if Rails.env.development?
3
+ # singleton_class.attr_accessor :previous_attributes
4
+ # before_reset {
5
+ # puts ["before_reset->", self.previous_attributes].inspect
6
+ # if attributes.present?
7
+ # puts ["has attributes->"].inspect
8
+ # self.previous_attributes = attributes
9
+ # end
10
+ # puts ["before_reset->", self.previous_attributes].inspect
11
+ # }
12
+
13
+ # attr_accessor :previous_attributes
14
+
15
+ # def previous_attributes=(value)
16
+ # @previous_attributes = value
17
+ # end
18
+ # end
19
+
20
+ attribute :app
21
+ attribute :license
22
+ attribute :context, :user, :view_context
23
+ attribute :error_manager
24
+ attribute :resource_manager
25
+ attribute :tool_manager
26
+ attribute :plugin_manager
27
+
28
+ delegate :params, to: :request
29
+
30
+ def request
31
+ view_context.request || ActionDispatch::Request.empty
32
+ end
33
+
34
+ def current_user
35
+ Rails.logger.warn "DEPRECATION WARNING: Avo::Current.current_user become deprecated and will become obsolete on futhure versions. Please use Avo::Current.user instead."
36
+
37
+ user
38
+ end
39
+ end
@@ -72,7 +72,7 @@ module Avo
72
72
  end
73
73
 
74
74
  def field_class_from_symbol(symbol)
75
- matched_field = Avo::App.fields.find do |field|
75
+ matched_field = Avo.field_manager.all.find do |field|
76
76
  field[:name].to_s == symbol.to_s
77
77
  end
78
78
 
@@ -1,15 +1,26 @@
1
1
  module Avo
2
2
  class DynamicRouter
3
+ def self.eager_load(entity)
4
+ paths = Avo::ENTITIES.fetch entity
5
+
6
+ return unless paths.present?
7
+
8
+ pathname = Rails.root.join(*paths)
9
+ if pathname.directory?
10
+ Rails.autoloaders.main.eager_load_dir(pathname.to_s)
11
+ end
12
+ end
13
+
3
14
  def self.routes
4
15
  Avo::Engine.routes.draw do
5
16
  scope "resources", as: "resources" do
6
17
  # Check if the user chose to manually register the resource files.
7
18
  # If so, eager_load the resources dir.
8
19
  if Avo.configuration.resources.nil?
9
- Avo::App.eager_load(:resources) unless Rails.application.config.eager_load
20
+ Avo::DynamicRouter.eager_load(:resources) unless Rails.application.config.eager_load
10
21
  end
11
22
 
12
- Avo::App.fetch_resources
23
+ Avo::Resources::ResourceManager.fetch_resources
13
24
  .select do |resource|
14
25
  resource != :BaseResource
15
26
  end
@@ -17,7 +28,11 @@ module Avo
17
28
  resource.is_a? Class
18
29
  end
19
30
  .map do |resource|
20
- resources resource.new.route_key
31
+ resources resource.route_key do
32
+ member do
33
+ get :preview
34
+ end
35
+ end
21
36
  end
22
37
  end
23
38
  end
data/lib/avo/engine.rb CHANGED
@@ -3,6 +3,8 @@ Gem.loaded_specs["avo"].dependencies.each do |d|
3
3
  case d.name
4
4
  when "activerecord"
5
5
  require "active_record/railtie"
6
+ when "activesupport"
7
+ require "active_support/railtie"
6
8
  when "actionview"
7
9
  require "action_view/railtie"
8
10
  when "activestorage"
@@ -19,23 +21,40 @@ module Avo
19
21
  isolate_namespace Avo
20
22
 
21
23
  config.after_initialize do
22
- # Boot Avo
23
- ::Avo::App.boot
24
- end
24
+ # Reset before reloads in development
25
+ ::Avo.asset_manager.reset
25
26
 
26
- initializer "avo.autoload" do |app|
27
- Avo::ENTITIES.values.each do |path_params|
28
- path = Rails.root.join(*path_params)
27
+ # Boot Avo
28
+ ::Avo.boot
29
29
 
30
- if File.directory? path.to_s
31
- Rails.autoloaders.main.push_dir path.to_s
30
+ # After deploy we want to make sure the license response is being cleared.
31
+ # We need a fresh license response.
32
+ # This is disabled in development because the initialization process might be triggered more than once.
33
+ unless Rails.env.development?
34
+ begin
35
+ Licensing::HQ.new.clear_response
36
+ rescue => exception
37
+ Avo.logger.info "Failed to clear Avo HQ response: #{exception.message}"
32
38
  end
33
39
  end
34
40
  end
35
41
 
36
- initializer "avo.init_fields" do |app|
37
- # Init the fields
38
- ::Avo::App.init_fields
42
+ # Ensure we reboot the app when something changes
43
+ config.to_prepare do
44
+ # Boot Avo
45
+ ::Avo.boot
46
+ end
47
+
48
+ initializer "avo.autoload" do |app|
49
+ # This undoes Rails' previous nested directories behavior in the `app` dir.
50
+ # More on this: https://github.com/fxn/zeitwerk/issues/250
51
+ avo_directory = Rails.root.join("app", "avo").to_s
52
+ ActiveSupport::Dependencies.autoload_paths.delete(avo_directory)
53
+
54
+ if Dir.exist?(avo_directory)
55
+ Rails.autoloaders.main.push_dir(avo_directory, namespace: Avo)
56
+ app.config.watchable_dirs[avo_directory] = [:rb]
57
+ end
39
58
  end
40
59
 
41
60
  initializer "avo.reloader" do |app|
@@ -46,17 +65,16 @@ module Avo
46
65
  end
47
66
  end
48
67
 
49
- initializer "debug_exception_response_format" do |app|
50
- app.config.debug_exception_response_format = :api
51
- # app.config.logger = ::Logger.new(STDOUT)
52
- end
53
-
54
68
  initializer "avo.test_buddy" do |app|
55
69
  if Avo::IN_DEVELOPMENT
56
- Rails.autoloaders.main.push_dir Avo::Engine.root.join("spec", "helpers")
70
+ Rails.autoloaders.main.push_dir Avo::Engine.root.join("spec", "testing_helpers")
57
71
  end
58
72
  end
59
73
 
74
+ initializer "debug_exception_response_format" do |app|
75
+ app.config.debug_exception_response_format = :api
76
+ end
77
+
60
78
  config.app_middleware.use(
61
79
  Rack::Static,
62
80
  urls: ["/avo-assets"],
@@ -75,18 +93,5 @@ module Avo
75
93
  initializer "avo.locales" do |app|
76
94
  I18n.load_path += Dir[Avo::Engine.root.join("lib", "generators", "avo", "templates", "locales", "*.{rb,yml}")]
77
95
  end
78
-
79
- # After deploy we want to make sure the license response is being cleared.
80
- # We need a fresh license response.
81
- # This is disabled in development because the initialization process might be triggered more than once.
82
- config.after_initialize do
83
- unless Rails.env.development?
84
- begin
85
- Licensing::HQ.new.clear_response
86
- rescue => exception
87
- puts "Failed to clear Avo HQ response: #{exception.message}"
88
- end
89
- end
90
- end
91
96
  end
92
97
  end
@@ -0,0 +1,25 @@
1
+ module Avo
2
+ class ErrorManager
3
+ class << self
4
+ def build
5
+ new
6
+ end
7
+ end
8
+
9
+ attr_reader :errors
10
+
11
+ alias_method :all, :errors
12
+
13
+ def initialize
14
+ @errors = []
15
+ end
16
+
17
+ def add(error)
18
+ errors << error
19
+ end
20
+
21
+ def has_errors?
22
+ errors.present?
23
+ end
24
+ end
25
+ end
@@ -10,13 +10,6 @@ module Avo
10
10
  end
11
11
  end
12
12
 
13
- # If you want this block to behave like a view you can delegate the missing methods to the view_context
14
- #
15
- # Ex: Avo::ExecutionContext.new(target: ..., delegate_missing_to: :view_context).handle
16
- if args[:delegate_missing_to].present?
17
- self.class.send(:delegate_missing_to, args[:delegate_missing_to])
18
- end
19
-
20
13
  # If target doesn't respond to call, we don't need to initialize the others attr_accessors.
21
14
  return unless (@target = args[:target]).respond_to? :call
22
15
 
@@ -26,15 +19,18 @@ module Avo
26
19
  end
27
20
 
28
21
  # Set defaults on not initialized accessors
29
- @context ||= Avo::App.context
30
- @params ||= Avo::App.params
31
- @view_context ||= Avo::App.view_context
32
- @current_user ||= Avo::App.current_user
33
- @request ||= view_context&.request
34
- @main_app ||= view_context&.main_app
35
- @avo ||= view_context&.avo
22
+ @context ||= Avo::Current.context
23
+ @current_user ||= Avo::Current.user
24
+ @params ||= Avo::Current.params
25
+ @request ||= Avo::Current.request
26
+ @view_context ||= Avo::Current.view_context
27
+ @main_app ||= @view_context.main_app
28
+ @avo ||= @view_context.avo
36
29
  end
37
30
 
31
+ delegate :result, to: :card
32
+ delegate :authorize, to: Avo::Services::AuthorizationService
33
+
38
34
  # Return target if target is not callable, otherwise, execute target on this instance context
39
35
  def handle
40
36
  target.respond_to?(:call) ? instance_exec(&target) : target
@@ -8,7 +8,7 @@ module Avo
8
8
 
9
9
  hide_on [:edit, :new]
10
10
 
11
- default_options = {info: :info, success: :success, danger: :danger, warning: :warning, neutral: :neutral}
11
+ default_options = {info: :info, success: :success, danger: :danger, warning: :warning}
12
12
  @options = args[:options].present? ? default_options.merge(args[:options]) : default_options
13
13
  end
14
14
  end