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

Files changed (407) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +28 -26
  3. data/Gemfile.lock +231 -161
  4. data/README.md +19 -27
  5. data/Rakefile +2 -0
  6. data/app/assets/stylesheets/avo.base.css +1 -1
  7. data/app/assets/svgs/font.svg +1 -0
  8. data/app/assets/svgs/triangle-up.svg +1 -0
  9. data/app/components/avo/actions_component.html.erb +19 -5
  10. data/app/components/avo/actions_component.rb +39 -19
  11. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  12. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  14. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  15. data/app/components/avo/base_component.rb +15 -12
  16. data/app/components/avo/button_component.rb +20 -3
  17. data/app/components/avo/empty_state_component.rb +1 -1
  18. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  19. data/app/components/avo/field_wrapper_component.rb +9 -15
  20. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  21. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +75 -79
  22. data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
  23. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  24. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  25. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  26. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  27. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  28. data/app/components/avo/fields/common/badge_viewer_component.rb +1 -1
  29. data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
  30. data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
  31. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  32. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
  33. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  34. data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
  35. data/app/components/avo/fields/common/heading_component.html.erb +3 -8
  36. data/app/components/avo/fields/common/heading_component.rb +1 -3
  37. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  38. data/app/components/avo/fields/common/key_value_component.rb +2 -2
  39. data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
  40. data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
  41. data/app/components/avo/fields/edit_component.rb +2 -2
  42. data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
  43. data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
  44. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  45. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  46. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  47. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  48. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  49. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
  51. data/app/components/avo/fields/index_component.rb +6 -6
  52. data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
  53. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  54. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  55. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  56. data/app/components/avo/fields/show_component.rb +5 -2
  57. data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
  58. data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
  59. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  60. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  61. data/app/components/avo/filters_component.html.erb +9 -3
  62. data/app/components/avo/filters_component.rb +4 -4
  63. data/app/components/avo/index/field_wrapper_component.rb +1 -13
  64. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  65. data/app/components/avo/index/grid_item_component.rb +43 -16
  66. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  67. data/app/components/avo/index/resource_controls_component.rb +125 -18
  68. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  69. data/app/components/avo/index/resource_grid_component.rb +5 -2
  70. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  71. data/app/components/avo/index/resource_map_component.rb +3 -3
  72. data/app/components/avo/index/resource_table_component.html.erb +3 -2
  73. data/app/components/avo/index/resource_table_component.rb +8 -7
  74. data/app/components/avo/index/table_row_component.html.erb +9 -5
  75. data/app/components/avo/index/table_row_component.rb +3 -2
  76. data/app/components/avo/items/panel_component.html.erb +25 -0
  77. data/app/components/avo/items/panel_component.rb +43 -0
  78. data/app/components/avo/items/switcher_component.html.erb +17 -0
  79. data/app/components/avo/items/switcher_component.rb +79 -0
  80. data/app/components/avo/items/visible_items_component.html.erb +10 -0
  81. data/app/components/avo/items/visible_items_component.rb +11 -0
  82. data/app/components/avo/modal_component.html.erb +3 -4
  83. data/app/components/avo/paginator_component.html.erb +1 -1
  84. data/app/components/avo/paginator_component.rb +6 -6
  85. data/app/components/avo/panel_component.html.erb +7 -5
  86. data/app/components/avo/referrer_params_component.html.erb +1 -1
  87. data/app/components/avo/resource_component.rb +205 -26
  88. data/app/components/avo/resource_sidebar_component.html.erb +15 -18
  89. data/app/components/avo/resource_sidebar_component.rb +5 -3
  90. data/app/components/avo/sidebar/link_component.rb +1 -1
  91. data/app/components/avo/sidebar_component.html.erb +10 -3
  92. data/app/components/avo/sidebar_component.rb +5 -3
  93. data/app/components/avo/sidebar_profile_component.html.erb +18 -12
  94. data/app/components/avo/tab_group_component.html.erb +14 -8
  95. data/app/components/avo/tab_group_component.rb +1 -6
  96. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  97. data/app/components/avo/tab_switcher_component.rb +6 -41
  98. data/app/components/avo/views/resource_edit_component.html.erb +23 -86
  99. data/app/components/avo/views/resource_edit_component.rb +20 -19
  100. data/app/components/avo/views/resource_index_component.html.erb +42 -47
  101. data/app/components/avo/views/resource_index_component.rb +76 -13
  102. data/app/components/avo/views/resource_show_component.html.erb +16 -177
  103. data/app/components/avo/views/resource_show_component.rb +16 -10
  104. data/app/controllers/avo/actions_controller.rb +29 -31
  105. data/app/controllers/avo/application_controller.rb +119 -180
  106. data/app/controllers/avo/associations_controller.rb +34 -43
  107. data/app/controllers/avo/attachments_controller.rb +4 -4
  108. data/app/controllers/avo/base_controller.rb +139 -91
  109. data/app/controllers/avo/debug_controller.rb +17 -5
  110. data/app/controllers/avo/home_controller.rb +1 -1
  111. data/app/controllers/avo/search_controller.rb +56 -50
  112. data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
  113. data/app/helpers/avo/application_helper.rb +18 -8
  114. data/app/helpers/avo/resources_helper.rb +1 -1
  115. data/app/helpers/avo/url_helpers.rb +28 -12
  116. data/app/javascript/avo.base.js +1 -0
  117. data/app/javascript/js/controllers/action_controller.js +5 -3
  118. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  119. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
  120. data/app/javascript/js/controllers/filter_controller.js +1 -1
  121. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  122. data/app/javascript/js/controllers/preview_controller.js +24 -0
  123. data/app/javascript/js/controllers/search_controller.js +4 -2
  124. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  125. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  126. data/app/javascript/js/controllers.js +11 -5
  127. data/app/javascript/js/custom-stream-actions.js +15 -0
  128. data/app/views/avo/actions/show.html.erb +9 -5
  129. data/app/views/avo/associations/new.html.erb +2 -2
  130. data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
  131. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
  132. data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
  133. data/app/views/avo/base/edit.html.erb +1 -1
  134. data/app/views/avo/base/index.html.erb +4 -3
  135. data/app/views/avo/base/new.html.erb +2 -1
  136. data/app/views/avo/base/preview.html.erb +19 -0
  137. data/app/views/avo/base/show.html.erb +2 -2
  138. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  139. data/app/views/avo/debug/report.html.erb +32 -17
  140. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  141. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  142. data/app/views/avo/partials/_footer.html.erb +1 -1
  143. data/app/views/avo/partials/_javascript.html.erb +5 -0
  144. data/app/views/avo/partials/_logo.html.erb +1 -1
  145. data/app/views/avo/partials/_navbar.html.erb +3 -5
  146. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  147. data/app/views/avo/partials/_table_header.html.erb +5 -11
  148. data/app/views/layouts/avo/application.html.erb +5 -4
  149. data/avo.gemspec +10 -8
  150. data/bin/dev +3 -1
  151. data/bin/prod +0 -0
  152. data/config/master.key +1 -0
  153. data/config/routes.rb +7 -10
  154. data/db/factories.rb +6 -0
  155. data/lib/avo/asset_manager.rb +30 -0
  156. data/lib/avo/base_action.rb +82 -66
  157. data/lib/avo/base_resource.rb +285 -225
  158. data/lib/avo/base_resource_tool.rb +9 -16
  159. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  160. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  161. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  162. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  163. data/lib/avo/concerns/has_controls.rb +37 -0
  164. data/lib/avo/concerns/has_description.rb +23 -0
  165. data/lib/avo/concerns/has_helpers.rb +18 -0
  166. data/lib/avo/concerns/has_item_type.rb +42 -0
  167. data/lib/avo/concerns/has_items.rb +339 -0
  168. data/lib/avo/concerns/hydration.rb +17 -0
  169. data/lib/avo/concerns/is_resource_item.rb +16 -36
  170. data/lib/avo/concerns/is_visible.rb +15 -0
  171. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  172. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  173. data/lib/avo/concerns/visible_items.rb +7 -38
  174. data/lib/avo/configuration/branding.rb +0 -12
  175. data/lib/avo/configuration.rb +28 -11
  176. data/lib/avo/current.rb +39 -0
  177. data/lib/avo/dsl/field_parser.rb +3 -3
  178. data/lib/avo/dynamic_router.rb +18 -3
  179. data/lib/avo/engine.rb +35 -30
  180. data/lib/avo/error_manager.rb +25 -0
  181. data/lib/avo/execution_context.rb +14 -15
  182. data/lib/avo/fields/base_field.rb +84 -121
  183. data/lib/avo/fields/belongs_to_field.rb +19 -23
  184. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  185. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  186. data/lib/avo/fields/concerns/has_default.rb +1 -5
  187. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  188. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  189. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  190. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  191. data/lib/avo/fields/concerns/is_required.rb +5 -7
  192. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  193. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  194. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  195. data/lib/avo/fields/country_field.rb +4 -0
  196. data/lib/avo/fields/date_time_field.rb +1 -5
  197. data/lib/avo/fields/external_image_field.rb +2 -2
  198. data/lib/avo/fields/field_manager.rb +55 -0
  199. data/lib/avo/fields/file_field.rb +2 -2
  200. data/lib/avo/fields/gravatar_field.rb +2 -2
  201. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  202. data/lib/avo/fields/has_base_field.rb +21 -17
  203. data/lib/avo/fields/has_many_field.rb +5 -2
  204. data/lib/avo/fields/has_one_field.rb +8 -12
  205. data/lib/avo/fields/heading_field.rb +9 -14
  206. data/lib/avo/fields/hidden_field.rb +1 -1
  207. data/lib/avo/fields/id_field.rb +3 -3
  208. data/lib/avo/fields/location_field.rb +10 -10
  209. data/lib/avo/fields/password_field.rb +1 -1
  210. data/lib/avo/fields/preview_field.rb +14 -0
  211. data/lib/avo/fields/select_field.rb +12 -8
  212. data/lib/avo/fields/status_field.rb +7 -1
  213. data/lib/avo/fields/text_field.rb +2 -2
  214. data/lib/avo/filters/base_filter.rb +9 -4
  215. data/lib/avo/html/builder.rb +8 -8
  216. data/lib/avo/item_grapher.rb +78 -0
  217. data/lib/avo/licensing/h_q.rb +11 -73
  218. data/lib/avo/licensing/license.rb +5 -1
  219. data/lib/avo/licensing/license_manager.rb +1 -1
  220. data/lib/avo/licensing/pro_license.rb +1 -7
  221. data/lib/avo/loaders/fields_loader.rb +7 -1
  222. data/lib/avo/plugin.rb +36 -0
  223. data/lib/avo/plugin_manager.rb +56 -0
  224. data/lib/avo/prefixed_test_helpers.rb +20 -0
  225. data/lib/avo/reloader.rb +3 -0
  226. data/lib/avo/resources/controls/actions_list.rb +7 -12
  227. data/lib/avo/resources/controls/attach_button.rb +15 -0
  228. data/lib/avo/resources/controls/back_button.rb +1 -1
  229. data/lib/avo/resources/controls/base_control.rb +15 -49
  230. data/lib/avo/resources/controls/create_button.rb +15 -0
  231. data/lib/avo/resources/controls/delete_button.rb +5 -1
  232. data/lib/avo/resources/controls/detach_button.rb +4 -1
  233. data/lib/avo/resources/controls/edit_button.rb +4 -1
  234. data/lib/avo/resources/controls/order_controls.rb +8 -0
  235. data/lib/avo/resources/controls/save_button.rb +13 -0
  236. data/lib/avo/resources/controls/show_button.rb +15 -0
  237. data/lib/avo/resources/items/holder.rb +96 -0
  238. data/lib/avo/resources/items/item_group.rb +44 -0
  239. data/lib/avo/resources/items/main_panel.rb +12 -0
  240. data/lib/avo/resources/items/panel.rb +2 -0
  241. data/lib/avo/resources/items/row.rb +42 -0
  242. data/lib/avo/resources/items/sidebar.rb +46 -0
  243. data/lib/avo/resources/items/tab.rb +54 -0
  244. data/lib/avo/resources/items/tab_group.rb +62 -0
  245. data/lib/avo/resources/resource_manager.rb +179 -0
  246. data/lib/avo/services/authorization_service.rb +11 -110
  247. data/lib/avo/services/debug_service.rb +93 -0
  248. data/lib/avo/services/encryption_service.rb +8 -12
  249. data/lib/avo/services/telemetry_service.rb +85 -0
  250. data/lib/avo/test_helpers.rb +362 -0
  251. data/lib/avo/tools/tool_manager.rb +30 -0
  252. data/lib/avo/version.rb +1 -1
  253. data/lib/avo/view_inquirer.rb +36 -0
  254. data/lib/avo.rb +109 -24
  255. data/lib/generators/avo/action_generator.rb +8 -8
  256. data/lib/generators/avo/card_generator.rb +27 -0
  257. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  258. data/lib/generators/avo/controller_generator.rb +3 -0
  259. data/lib/generators/avo/eject_generator.rb +180 -15
  260. data/lib/generators/avo/field_generator.rb +49 -2
  261. data/lib/generators/avo/filter_generator.rb +8 -8
  262. data/lib/generators/avo/js/install_generator.rb +2 -2
  263. data/lib/generators/avo/resource_generator.rb +12 -9
  264. data/lib/generators/avo/scope_generator.rb +15 -0
  265. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  266. data/lib/generators/avo/templates/action.tt +8 -6
  267. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  268. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  269. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  270. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  271. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  272. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  273. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  274. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  275. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  276. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  277. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  278. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  279. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  280. data/lib/generators/avo/templates/locales/avo.ar.yml +2 -1
  281. data/lib/generators/avo/templates/locales/avo.en.yml +4 -3
  282. data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
  283. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
  284. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
  285. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
  286. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
  287. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
  288. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -5
  289. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -0
  290. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  291. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  292. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  293. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  294. data/lib/generators/avo/templates/scope.tt +6 -0
  295. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  296. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  297. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  298. data/lib/tasks/avo_tasks.rake +72 -4
  299. data/public/avo-assets/avo.base.css +1893 -1187
  300. data/public/avo-assets/avo.base.js +217 -305
  301. data/public/avo-assets/avo.base.js.map +3 -3
  302. data/public/avo-assets/avo.css +9744 -0
  303. data/public/avo-assets/avo.js +513 -0
  304. data/public/avo-assets/avo.js.map +7 -0
  305. data/tailwind.custom.js +47 -0
  306. data/tailwind.preset.js +152 -0
  307. metadata +104 -113
  308. data/app/components/avo/card_component.html.erb +0 -46
  309. data/app/components/avo/card_component.rb +0 -25
  310. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  311. data/app/components/avo/dashboards/divider_component.rb +0 -19
  312. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  313. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  314. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  315. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  317. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  318. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  319. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  320. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  321. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  322. data/app/components/avo/index/ordering/base_component.rb +0 -9
  323. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  324. data/app/components/avo/index/ordering/button_component.rb +0 -23
  325. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  326. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  327. data/app/components/avo/item_switcher_component.html.erb +0 -27
  328. data/app/components/avo/item_switcher_component.rb +0 -48
  329. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  330. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  331. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  332. data/app/controllers/avo/dashboards_controller.rb +0 -22
  333. data/app/controllers/avo/reorder_controller.rb +0 -25
  334. data/app/javascript/js/controllers/base_controller.js +0 -22
  335. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  336. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  337. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  338. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  339. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  340. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  341. data/app/views/avo/dashboards/show.html.erb +0 -38
  342. data/app/views/avo/partials/_global_search.html.erb +0 -19
  343. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  344. data/lib/avo/app.rb +0 -237
  345. data/lib/avo/base_card.rb +0 -161
  346. data/lib/avo/concerns/fetches_things.rb +0 -150
  347. data/lib/avo/concerns/handles_field_args.rb +0 -47
  348. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  349. data/lib/avo/concerns/has_fields.rb +0 -334
  350. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  351. data/lib/avo/concerns/policy_helpers.rb +0 -31
  352. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  353. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  354. data/lib/avo/dashboards/base_divider.rb +0 -35
  355. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  356. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  357. data/lib/avo/dashboards/metric_card.rb +0 -9
  358. data/lib/avo/dashboards/partial_card.rb +0 -7
  359. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  360. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  361. data/lib/avo/fields/tags_field.rb +0 -102
  362. data/lib/avo/grid_collector.rb +0 -42
  363. data/lib/avo/hosts/association_scope_host.rb +0 -8
  364. data/lib/avo/hosts/base_host.rb +0 -25
  365. data/lib/avo/hosts/card_visibility.rb +0 -20
  366. data/lib/avo/hosts/dashboard_card.rb +0 -22
  367. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  368. data/lib/avo/hosts/ordering.rb +0 -22
  369. data/lib/avo/hosts/record_host.rb +0 -7
  370. data/lib/avo/hosts/resource_record_host.rb +0 -7
  371. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  372. data/lib/avo/hosts/search_scope_host.rb +0 -7
  373. data/lib/avo/hosts/view_record_host.rb +0 -7
  374. data/lib/avo/hosts/visibility_host.rb +0 -12
  375. data/lib/avo/items_holder.rb +0 -96
  376. data/lib/avo/main_panel.rb +0 -3
  377. data/lib/avo/menu/base_item.rb +0 -25
  378. data/lib/avo/menu/builder.rb +0 -82
  379. data/lib/avo/menu/dashboard.rb +0 -22
  380. data/lib/avo/menu/group.rb +0 -2
  381. data/lib/avo/menu/link.rb +0 -6
  382. data/lib/avo/menu/menu.rb +0 -2
  383. data/lib/avo/menu/resource.rb +0 -22
  384. data/lib/avo/menu/section.rb +0 -2
  385. data/lib/avo/panel.rb +0 -24
  386. data/lib/avo/panel_builder.rb +0 -25
  387. data/lib/avo/resources/controls/action.rb +0 -38
  388. data/lib/avo/resources/controls/execution_context.rb +0 -58
  389. data/lib/avo/resources/controls/items_holder.rb +0 -19
  390. data/lib/avo/resources/controls/link_to.rb +0 -27
  391. data/lib/avo/row.rb +0 -26
  392. data/lib/avo/row_builder.rb +0 -24
  393. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  394. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  395. data/lib/avo/sidebar.rb +0 -30
  396. data/lib/avo/sidebar_builder.rb +0 -24
  397. data/lib/avo/tab.rb +0 -72
  398. data/lib/avo/tab_builder.rb +0 -25
  399. data/lib/avo/tab_group.rb +0 -42
  400. data/lib/avo/tab_group_builder.rb +0 -43
  401. data/lib/avo/tools_manager.rb +0 -11
  402. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  403. data/lib/generators/avo/card/metric_generator.rb +0 -18
  404. data/lib/generators/avo/card/partial_generator.rb +0 -19
  405. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  406. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  407. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -0,0 +1,15 @@
1
+ # Adds the ability to set the visibility of an item in the execution context.
2
+ module Avo
3
+ module Concerns
4
+ module IsVisible
5
+ attr_accessor :visible
6
+
7
+ def visible?
8
+ # Default to true
9
+ return true if visible.nil?
10
+
11
+ Avo::ExecutionContext.new(target: visible, resource: @resource).handle
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,8 +4,6 @@ module Avo
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  class_methods do
7
- attr_reader :model_class
8
-
9
7
  # Cast the model class to a constantized version and memoize it like that
10
8
  def model_class=(value)
11
9
  @model_class = case value
@@ -0,0 +1,132 @@
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
+ hide_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
+ display = views_and_groups & [:display]
117
+
118
+ if forms.present?
119
+ views_and_groups -= forms
120
+ views_and_groups += [:new, :edit]
121
+ end
122
+
123
+ if display.present?
124
+ views_and_groups -= display
125
+ views_and_groups += [:index, :show]
126
+ end
127
+
128
+ views_and_groups.flatten.uniq
129
+ end
130
+ end
131
+ end
132
+ end
@@ -3,48 +3,17 @@ module Avo
3
3
  module Concerns
4
4
  module VisibleItems
5
5
  extend ActiveSupport::Concern
6
- def items
7
- if items_holder.present?
8
- items_holder.items
9
- else
10
- []
11
- end
12
- end
13
-
14
- def visible_items
15
- items
16
- .map do |item|
17
- if item.respond_to? :hydrate
18
- item.hydrate(view: view)
19
- end
20
-
21
- item
22
- end
23
- .map do |item|
24
- visible(item) ? item : nil
25
- end
26
- .compact
27
- end
28
-
29
- def visible(item)
30
- return item.visible? unless item.is_field?
31
6
 
32
- return false if item.respond_to?(:authorized?) && item.resource.present? && !item.authorized?
33
-
34
- item.visible? && item.visible_on?(view)
7
+ included do
8
+ include Avo::Concerns::Hydration
35
9
  end
36
10
 
37
11
  def visible?
38
- any_item_visible = visible_items.any?
39
- return any_item_visible unless respond_to?(:visible_on?)
40
-
41
- visible_on?(view) && any_item_visible
42
- end
43
-
44
- def hydrate(view: nil)
45
- @view = view
46
-
47
- self
12
+ if respond_to?(:visible_on?)
13
+ visible_on?(view) && visible_items.any?
14
+ else
15
+ visible_items.any?
16
+ end
48
17
  end
49
18
  end
50
19
  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
 
@@ -13,7 +13,6 @@ module Avo
13
13
  attr_accessor :locale
14
14
  attr_accessor :currency
15
15
  attr_accessor :default_view_type
16
- attr_accessor :license
17
16
  attr_accessor :license_key
18
17
  attr_accessor :authorization_methods
19
18
  attr_accessor :authenticate
@@ -38,13 +37,14 @@ 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
- attr_accessor :resource_default_view
40
+ attr_reader :resource_default_view
43
41
  attr_accessor :authorization_client
44
42
  attr_accessor :field_wrapper_layout
45
43
  attr_accessor :sign_out_path_name
46
44
  attr_accessor :resources
47
45
  attr_accessor :prefix_path
46
+ attr_accessor :resource_parent_controller
47
+ attr_accessor :mount_avo_engines
48
48
 
49
49
  def initialize
50
50
  @root_path = "/avo"
@@ -56,7 +56,6 @@ module Avo
56
56
  @locale = nil
57
57
  @currency = "USD"
58
58
  @default_view_type = :table
59
- @license = "community"
60
59
  @license_key = nil
61
60
  @current_user = proc {}
62
61
  @authenticate = proc {}
@@ -91,12 +90,12 @@ module Avo
91
90
  @main_menu = nil
92
91
  @profile_menu = nil
93
92
  @model_resource_mapping = {}
94
- @tabs_style = :tabs
95
- @resource_default_view = :show
93
+ @resource_default_view = Avo::ViewInquirer.new("show")
96
94
  @authorization_client = :pundit
97
95
  @field_wrapper_layout = :inline
98
96
  @resources = nil
99
- @prefix_path = nil
97
+ @resource_parent_controller = "Avo::ResourcesController"
98
+ @mount_avo_engines = true
100
99
  @cache_store = computed_cache_store
101
100
  end
102
101
 
@@ -143,13 +142,31 @@ module Avo
143
142
  end
144
143
 
145
144
  def app_name
146
- if @app_name.respond_to? :call
147
- Avo::Hosts::BaseHost.new(block: @app_name).handle
148
- else
149
- @app_name
145
+ Avo::ExecutionContext.new(target: @app_name).handle
146
+ end
147
+
148
+ def license=(value)
149
+ if Rails.env.development?
150
+ puts "[Avo DEPRECATION WARNING]: The `config.license` configuration option is no longer supported and will be removed in future versions. Please discontinue its use and solely utilize the `license_key` instead."
150
151
  end
151
152
  end
152
153
 
154
+ def license
155
+ gems = Gem::Specification.map {|gem| gem.name}
156
+
157
+ @license ||= if gems.include?("avo-advanced")
158
+ "advanced"
159
+ elsif gems.include?("avo-pro")
160
+ "pro"
161
+ elsif gems.include?("avo")
162
+ "community"
163
+ end
164
+ end
165
+
166
+ def resource_default_view=(view)
167
+ @resource_default_view = Avo::ViewInquirer.new(view.to_s)
168
+ end
169
+
153
170
  def cache_store
154
171
  Avo::ExecutionContext.new(
155
172
  target: @cache_store,
@@ -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
+ attribute :locale
28
+
29
+ # Protect from error #<RuntimeError: Missing rack.input> when request is ActionDispatch::Request.empty
30
+ def params
31
+ request.params
32
+ rescue
33
+ {}
34
+ end
35
+
36
+ def request
37
+ view_context&.request || ActionDispatch::Request.empty
38
+ end
39
+ end
@@ -10,7 +10,7 @@ module Avo
10
10
 
11
11
  def initialize(id:, order_index: 0, **args, &block)
12
12
  @id = id
13
- @as = args.fetch(:as, nil)
13
+ @as = args.fetch(:as, :text)
14
14
  @order_index = order_index
15
15
  @args = args
16
16
  @block = block
@@ -47,7 +47,7 @@ module Avo
47
47
  else
48
48
  # The symbol can be transformed to a class and found.
49
49
  class_name = as.to_s.camelize
50
- field_class = "#{class_name}Field"
50
+ field_class = "Avo::Fields::#{class_name}Field"
51
51
 
52
52
  # Discover & load custom field classes
53
53
  if Object.const_defined? field_class
@@ -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
@@ -1,6 +1,8 @@
1
1
  module Avo
2
2
  class ExecutionContext
3
- attr_accessor :target, :context, :params, :view_context, :current_user, :request, :include, :main_app, :avo
3
+ include Avo::Concerns::HasHelpers
4
+
5
+ attr_accessor :target, :context, :params, :view_context, :current_user, :request, :include, :main_app, :avo, :locale
4
6
 
5
7
  def initialize(**args)
6
8
  # Extend the class with custom modules if required.
@@ -10,13 +12,6 @@ module Avo
10
12
  end
11
13
  end
12
14
 
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
15
  # If target doesn't respond to call, we don't need to initialize the others attr_accessors.
21
16
  return unless (@target = args[:target]).respond_to? :call
22
17
 
@@ -26,15 +21,19 @@ module Avo
26
21
  end
27
22
 
28
23
  # 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
24
+ @context ||= Avo::Current.context
25
+ @current_user ||= Avo::Current.user
26
+ @params ||= Avo::Current.params
27
+ @request ||= Avo::Current.request
28
+ @view_context ||= Avo::Current.view_context
29
+ @locale ||= Avo::Current.locale
30
+ @main_app ||= @view_context&.main_app
31
+ @avo ||= @view_context&.avo
36
32
  end
37
33
 
34
+ delegate :result, to: :card
35
+ delegate :authorize, to: Avo::Services::AuthorizationService
36
+
38
37
  # Return target if target is not callable, otherwise, execute target on this instance context
39
38
  def handle
40
39
  target.respond_to?(:call) ? instance_exec(&target) : target