avo 2.46.0 → 3.0.0.pre2

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 (417) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +12 -23
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +12 -11
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -36
  167. data/lib/avo/base_resource.rb +108 -96
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  175. data/lib/avo/concerns/is_resource_item.rb +24 -36
  176. data/lib/avo/concerns/is_visible.rb +15 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +8 -45
  180. data/lib/avo/current.rb +5 -0
  181. data/lib/avo/dsl/field_parser.rb +1 -1
  182. data/lib/avo/dynamic_router.rb +6 -2
  183. data/lib/avo/engine.rb +37 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +9 -15
  186. data/lib/avo/fields/badge_field.rb +1 -1
  187. data/lib/avo/fields/base_field.rb +72 -124
  188. data/lib/avo/fields/belongs_to_field.rb +14 -25
  189. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  190. data/lib/avo/fields/concerns/has_default.rb +1 -5
  191. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  192. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  193. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  194. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  195. data/lib/avo/fields/concerns/is_required.rb +5 -7
  196. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/country_field.rb +4 -0
  199. data/lib/avo/fields/date_field.rb +3 -16
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/field_manager.rb +45 -0
  202. data/lib/avo/fields/file_field.rb +0 -2
  203. data/lib/avo/fields/files_field.rb +0 -6
  204. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  205. data/lib/avo/fields/has_base_field.rb +11 -14
  206. data/lib/avo/fields/has_many_field.rb +5 -2
  207. data/lib/avo/fields/has_one_field.rb +5 -10
  208. data/lib/avo/fields/heading_field.rb +4 -1
  209. data/lib/avo/fields/hidden_field.rb +1 -1
  210. data/lib/avo/fields/id_field.rb +2 -3
  211. data/lib/avo/fields/password_field.rb +1 -1
  212. data/lib/avo/fields/preview_field.rb +14 -0
  213. data/lib/avo/fields/select_field.rb +12 -8
  214. data/lib/avo/fields/status_field.rb +4 -0
  215. data/lib/avo/filters/base_filter.rb +3 -8
  216. data/lib/avo/grid_collector.rb +7 -9
  217. data/lib/avo/html/builder.rb +5 -8
  218. data/lib/avo/item_grapher.rb +78 -0
  219. data/lib/avo/licensing/h_q.rb +4 -68
  220. data/lib/avo/licensing/license.rb +2 -2
  221. data/lib/avo/licensing/license_manager.rb +1 -1
  222. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  223. data/lib/avo/licensing/pro_license.rb +1 -7
  224. data/lib/avo/plugin.rb +6 -0
  225. data/lib/avo/plugin_manager.rb +58 -0
  226. data/lib/avo/prefixed_test_helpers.rb +20 -0
  227. data/lib/avo/reloader.rb +3 -0
  228. data/lib/avo/resources/controls/actions_list.rb +6 -12
  229. data/lib/avo/resources/controls/attach_button.rb +15 -0
  230. data/lib/avo/resources/controls/back_button.rb +1 -1
  231. data/lib/avo/resources/controls/base_control.rb +15 -49
  232. data/lib/avo/resources/controls/create_button.rb +15 -0
  233. data/lib/avo/resources/controls/delete_button.rb +5 -1
  234. data/lib/avo/resources/controls/detach_button.rb +4 -1
  235. data/lib/avo/resources/controls/edit_button.rb +4 -1
  236. data/lib/avo/resources/controls/order_controls.rb +8 -0
  237. data/lib/avo/resources/controls/save_button.rb +13 -0
  238. data/lib/avo/resources/controls/show_button.rb +15 -0
  239. data/lib/avo/resources/items/holder.rb +76 -0
  240. data/lib/avo/resources/items/item_group.rb +48 -0
  241. data/lib/avo/resources/items/main_panel.rb +2 -0
  242. data/lib/avo/resources/items/panel.rb +2 -0
  243. data/lib/avo/resources/items/sidebar.rb +47 -0
  244. data/lib/avo/resources/items/tab.rb +60 -0
  245. data/lib/avo/resources/items/tab_group.rb +68 -0
  246. data/lib/avo/resources/resource_manager.rb +181 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +92 -0
  249. data/lib/avo/services/telemetry_service.rb +84 -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.rb +7 -0
  254. data/lib/generators/avo/eject_generator.rb +0 -1
  255. data/lib/generators/avo/install_generator.rb +1 -11
  256. data/lib/generators/avo/resource_generator.rb +5 -23
  257. data/lib/generators/avo/scope_generator.rb +15 -0
  258. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  259. data/lib/generators/avo/templates/action.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  261. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  263. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  265. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  266. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  267. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  268. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  271. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  272. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  273. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  274. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  275. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  280. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  281. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  282. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  283. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  284. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  285. data/lib/generators/avo/templates/scope.tt +6 -0
  286. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  287. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  288. data/lib/generators/avo/templates/tool/view.tt +2 -2
  289. data/lib/tasks/avo_tasks.rake +22 -0
  290. metadata +82 -161
  291. data/app/assets/stylesheets/css/tags.css +0 -32
  292. data/app/assets/svgs/map-empty-state.svg +0 -35
  293. data/app/assets/svgs/map-view-type.svg +0 -3
  294. data/app/components/avo/card_component.html.erb +0 -46
  295. data/app/components/avo/card_component.rb +0 -25
  296. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  297. data/app/components/avo/dashboards/divider_component.rb +0 -19
  298. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  299. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  300. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  301. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  303. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  304. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  305. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  306. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  307. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  309. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  311. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  312. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  313. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  314. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  315. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  317. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  318. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  319. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  320. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  321. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  322. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  323. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  324. data/app/components/avo/index/ordering/base_component.rb +0 -9
  325. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  326. data/app/components/avo/index/ordering/button_component.rb +0 -23
  327. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  328. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  329. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  330. data/app/components/avo/index/resource_map_component.rb +0 -109
  331. data/app/components/avo/row_component.html.erb +0 -3
  332. data/app/components/avo/row_component.rb +0 -12
  333. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  334. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  335. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  336. data/app/controllers/avo/dashboards_controller.rb +0 -22
  337. data/app/controllers/avo/reorder_controller.rb +0 -25
  338. data/app/javascript/js/controllers/base_controller.js +0 -22
  339. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  340. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  341. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  342. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  343. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  344. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  345. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  346. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  347. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  348. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  349. data/app/views/avo/dashboards/show.html.erb +0 -38
  350. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  351. data/app/views/avo/partials/_global_search.html.erb +0 -19
  352. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  353. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  354. data/lib/avo/base_card.rb +0 -161
  355. data/lib/avo/concerns/fetches_things.rb +0 -150
  356. data/lib/avo/concerns/handles_field_args.rb +0 -47
  357. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  358. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  359. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  360. data/lib/avo/concerns/pagination.rb +0 -53
  361. data/lib/avo/concerns/policy_helpers.rb +0 -31
  362. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  363. data/lib/avo/concerns/visible_items.rb +0 -51
  364. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  365. data/lib/avo/dashboards/base_divider.rb +0 -35
  366. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  367. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  368. data/lib/avo/dashboards/metric_card.rb +0 -9
  369. data/lib/avo/dashboards/partial_card.rb +0 -7
  370. data/lib/avo/fields/area_field.rb +0 -39
  371. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  372. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  373. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  374. data/lib/avo/fields/location_field.rb +0 -86
  375. data/lib/avo/fields/tags_field.rb +0 -102
  376. data/lib/avo/hosts/association_scope_host.rb +0 -8
  377. data/lib/avo/hosts/base_host.rb +0 -25
  378. data/lib/avo/hosts/card_visibility.rb +0 -20
  379. data/lib/avo/hosts/dashboard_card.rb +0 -22
  380. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  381. data/lib/avo/hosts/ordering.rb +0 -22
  382. data/lib/avo/hosts/record_host.rb +0 -7
  383. data/lib/avo/hosts/resource_record_host.rb +0 -7
  384. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  385. data/lib/avo/hosts/search_scope_host.rb +0 -7
  386. data/lib/avo/hosts/view_record_host.rb +0 -7
  387. data/lib/avo/hosts/visibility_host.rb +0 -12
  388. data/lib/avo/items_holder.rb +0 -96
  389. data/lib/avo/main_panel.rb +0 -3
  390. data/lib/avo/menu/base_item.rb +0 -25
  391. data/lib/avo/menu/builder.rb +0 -82
  392. data/lib/avo/menu/dashboard.rb +0 -22
  393. data/lib/avo/menu/group.rb +0 -2
  394. data/lib/avo/menu/link.rb +0 -6
  395. data/lib/avo/menu/menu.rb +0 -2
  396. data/lib/avo/menu/resource.rb +0 -22
  397. data/lib/avo/menu/section.rb +0 -2
  398. data/lib/avo/panel.rb +0 -24
  399. data/lib/avo/panel_builder.rb +0 -25
  400. data/lib/avo/resources/controls/action.rb +0 -38
  401. data/lib/avo/resources/controls/execution_context.rb +0 -58
  402. data/lib/avo/resources/controls/items_holder.rb +0 -19
  403. data/lib/avo/resources/controls/link_to.rb +0 -27
  404. data/lib/avo/row.rb +0 -26
  405. data/lib/avo/row_builder.rb +0 -24
  406. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  407. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  408. data/lib/avo/sidebar.rb +0 -30
  409. data/lib/avo/sidebar_builder.rb +0 -24
  410. data/lib/avo/tab.rb +0 -72
  411. data/lib/avo/tab_builder.rb +0 -25
  412. data/lib/avo/tab_group.rb +0 -42
  413. data/lib/avo/tab_group_builder.rb +0 -43
  414. data/lib/avo/tools_manager.rb +0 -11
  415. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  416. data/public/avo-assets/avo.base.js +0 -1037
  417. data/public/avo-assets/avo.base.js.map +0 -7
data/config/master.key ADDED
@@ -0,0 +1 @@
1
+ 2aeb23d82b909d9c6b5abb62f7058c2a
data/config/routes.rb CHANGED
@@ -4,11 +4,11 @@ Avo::Engine.routes.draw do
4
4
  get "resources", to: redirect(Avo.configuration.root_path)
5
5
  get "dashboards", to: redirect(Avo.configuration.root_path)
6
6
 
7
- post "/rails/active_storage/direct_uploads", to: "/active_storage/direct_uploads#create"
7
+ mount AvoFilters::Engine, at: "/avo_filters" if defined?(AvoFilters)
8
+ mount AvoDashboards::Engine, at: "/dashboards" if defined?(AvoDashboards::Engine)
9
+ mount AvoPro::Engine, at: "/avo_pro" if defined?(AvoPro)
8
10
 
9
- resources :dashboards do
10
- resources :cards, controller: "dashboards/cards"
11
- end
11
+ post "/rails/active_storage/direct_uploads", to: "/active_storage/direct_uploads#create"
12
12
 
13
13
  scope "avo_api", as: "avo_api" do
14
14
  get "/search", to: "search#index"
@@ -16,11 +16,6 @@ Avo::Engine.routes.draw do
16
16
  post "/resources/:resource_name/:id/attachments/", to: "attachments#create"
17
17
  end
18
18
 
19
- # Records ordering
20
- scope "reorder", as: "reorder" do
21
- patch "/:resource_name/:id", to: "reorder#order", as: "order"
22
- end
23
-
24
19
  get "failed_to_load", to: "home#failed_to_load"
25
20
 
26
21
  scope "resources", as: "resources" do
@@ -28,8 +23,8 @@ Avo::Engine.routes.draw do
28
23
  delete "/:resource_name/:id/active_storage_attachments/:attachment_name/:attachment_id", to: "attachments#destroy"
29
24
 
30
25
  # Actions
31
- get "/:resource_name(/:id)/actions/(:action_id)", to: "actions#show"
32
- post "/:resource_name(/:id)/actions/(:action_id)", to: "actions#handle"
26
+ get "/:resource_name(/:id)/actions/:action_id", to: "actions#show"
27
+ post "/:resource_name(/:id)/actions/:action_id", to: "actions#handle"
33
28
 
34
29
  # Generate resource routes as below:
35
30
  # resources :posts
@@ -44,7 +39,8 @@ Avo::Engine.routes.draw do
44
39
  end
45
40
 
46
41
  scope "/avo_private", as: "avo_private" do
47
- get "/debug", to: "debug#index", as: "debug_index"
42
+ get "/status", to: "debug#status", as: "status"
43
+ post "/status/send_to_hq", to: "debug#send_to_hq", as: "send_to_hq"
48
44
  get "/debug/report", to: "debug#report", as: "debug_report"
49
45
  post "/debug/refresh_license", to: "debug#refresh_license"
50
46
  end
data/db/factories.rb CHANGED
@@ -9,6 +9,12 @@ FactoryBot.define do
9
9
  custom_css { ".header {\n color: red;\n}" }
10
10
  end
11
11
 
12
+ trait :with_post do
13
+ after(:create) do |user|
14
+ create(:post, user_id: user.id)
15
+ end
16
+ end
17
+
12
18
  factory :team do
13
19
  name { Faker::Company.name }
14
20
  description { Faker::Lorem.paragraph(sentence_count: 4) }
@@ -32,7 +38,7 @@ FactoryBot.define do
32
38
  factory :project do
33
39
  name { Faker::App.name }
34
40
  status { ['closed', :rejected, :failed, 'loading', :running, :waiting].sample }
35
- stage { ["Discovery", "Idea", "Done", "On hold", "Cancelled", "Drafting"].sample }
41
+ stage { ["Discovery", "Idea", "Done", "On hold", "Cancelled"].sample }
36
42
  budget { Faker::Number.decimal(l_digits: 4) }
37
43
  country { Faker::Address.country_code }
38
44
  description { Faker::Markdown.sandwich(sentences: 5) }
@@ -42,20 +48,6 @@ FactoryBot.define do
42
48
  progress { Faker::Number.between(from: 0, to: 100) }
43
49
  end
44
50
 
45
- trait :with_files do
46
- after(:create) do |project|
47
- ["watch.jpg", "dummy-video.mp4"].each do |filename|
48
- file = Rails.root.join("db", "seed_files", filename)
49
- project.files.attach(io: file.open, filename: filename)
50
- end
51
-
52
- ["dummy-file.txt", "dummy-audio.mp3"].each do |filename|
53
- file = Avo::Engine.root.join("spec", "dummy", filename)
54
- project.files.attach(io: file.open, filename: filename)
55
- end
56
- end
57
- end
58
-
59
51
  factory :comment do
60
52
  body { Faker::Lorem.paragraphs(number: rand(4...10)).join(" ") }
61
53
  posted_at { Time.now - rand(10...365).days }
@@ -104,8 +96,6 @@ FactoryBot.define do
104
96
  factory :city do
105
97
  name { Faker::Address.city }
106
98
  population { rand(10000..999000) }
107
- latitude { Faker::Address.latitude }
108
- longitude { Faker::Address.longitude }
109
99
  is_capital { [true, false].sample }
110
100
  features { Faker::Address.community }
111
101
  metadata { Faker::Address.community }
@@ -113,7 +103,6 @@ FactoryBot.define do
113
103
  description { Faker::Address.community }
114
104
  status { ["open", "closed"].sample }
115
105
  tiny_description { Faker::Address.community }
116
- city_center_area { [[[10.0, 11.2], [10.5, 11.9], [10.8, 12.0], [10.0, 11.2]]].to_json }
117
106
  end
118
107
 
119
108
  factory :product do
@@ -0,0 +1,20 @@
1
+ module Avo
2
+ class ActionModel
3
+ include ActiveModel::Model
4
+
5
+ # This class augments a model the action form declaration.
6
+ def initialize(attributes = {})
7
+ set_attr_accessors attributes
8
+
9
+ super(attributes)
10
+ end
11
+
12
+ private
13
+
14
+ def set_attr_accessors(attributes)
15
+ attributes.each do |k, v|
16
+ self.class.class_eval { attr_accessor k }
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/avo/app.rb CHANGED
@@ -1,20 +1,19 @@
1
1
  module Avo
2
2
  class App
3
- include Avo::Concerns::FetchesThings
4
-
5
- class_attribute :resources, default: []
6
- class_attribute :dashboards, default: []
3
+ class_attribute :field_manager
7
4
  class_attribute :cache_store, default: nil
8
- class_attribute :fields, default: []
9
- class_attribute :request, default: nil
10
- class_attribute :context, default: nil
11
- class_attribute :license, default: nil
12
- class_attribute :current_user, default: nil
13
- class_attribute :root_path, default: nil
14
- class_attribute :view_context, default: nil
15
- class_attribute :params, default: {}
16
- class_attribute :translation_enabled, default: false
17
- class_attribute :error_messages
5
+ class_attribute :logger
6
+
7
+ include ActiveModel::Model
8
+
9
+ attr_accessor :request, :context, :current_user, :view_context
10
+ attr_accessor :cache_store
11
+ attr_accessor :resource_manager
12
+ attr_accessor :dashboard_manager
13
+ attr_accessor :tool_manager
14
+ attr_accessor :error_manager
15
+
16
+ delegate :params, to: :request
18
17
 
19
18
  class << self
20
19
  def eager_load(entity)
@@ -29,151 +28,79 @@ module Avo
29
28
  end
30
29
 
31
30
  def boot
31
+ init_logger
32
32
  init_fields
33
-
34
- self.cache_store = Avo.configuration.cache_store
33
+ init_cache_store
35
34
  end
36
35
 
37
- # Generate a dynamic root path using the URIService
38
- def root_path(paths: [], query: {}, **args)
39
- Avo::Services::URIService.parse(view_context.avo.root_url.to_s)
40
- .append_paths(paths)
41
- .append_query(query)
42
- .to_s
36
+ def init_cache_store
37
+ # The cache store should be set when the app boots up.
38
+ if Rails.cache.instance_of?(ActiveSupport::Cache::NullStore)
39
+ self.cache_store ||= ActiveSupport::Cache::MemoryStore.new
40
+ else
41
+ self.cache_store = Rails.cache
42
+ end
43
43
  end
44
44
 
45
- def init(request:, context:, current_user:, view_context:, params:)
46
- self.error_messages = []
47
- self.context = context
48
- self.current_user = current_user
49
- self.params = params
50
- self.request = request
51
- self.view_context = view_context
52
-
53
- self.license = Licensing::LicenseManager.new(Licensing::HQ.new(request).response).license
54
- self.translation_enabled = license.has(:localization)
55
-
56
- # Set the current host for ActiveStorage
57
- begin
58
- if defined?(ActiveStorage::Current)
59
- if Rails::VERSION::MAJOR === 6
60
- ActiveStorage::Current.host = request.base_url
61
- elsif Rails::VERSION::MAJOR === 7
62
- ActiveStorage::Current.url_options = {protocol: request.protocol, host: request.host, port: request.port}
63
- end
45
+ def init_logger
46
+ file_logger = ActiveSupport::Logger.new(Rails.root.join("log", "avo.log"))
47
+
48
+ file_logger.datetime_format = "%Y-%m-%d %H:%M:%S"
49
+ file_logger.formatter = proc do |severity, time, progname, msg|
50
+ "[Avo] #{time}: #{msg}\n".tap do |i|
51
+ puts i
64
52
  end
65
- rescue => exception
66
- Rails.logger.debug "[Avo] Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
67
53
  end
68
54
 
69
- check_bad_resources
70
- init_resources
71
- init_dashboards if license.has_with_trial(:dashboards)
55
+ self.logger = file_logger
72
56
  end
73
57
 
74
- # This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
75
- # so later we can instantiate them on our resources.
76
- #
77
- # If the field has their `def_method` set up it will follow that convention, if not it will snake_case the name:
78
- #
79
- # Avo::Fields::TextField -> text
80
- # Avo::Fields::DateTimeField -> date_time
81
58
  def init_fields
82
- Avo::Fields::BaseField.descendants.each do |class_name|
83
- next if class_name.to_s == "BaseField"
59
+ self.field_manager = Avo::Fields::FieldManager.build
60
+ end
84
61
 
85
- if class_name.to_s.end_with? "Field"
86
- load_field class_name.get_field_name, class_name
87
- end
88
- end
62
+ def fields
63
+ field_manager
89
64
  end
90
65
 
91
- def load_field(method_name, klass)
92
- fields.push(
93
- name: method_name,
94
- class: klass
95
- )
66
+ def build(request:, context:, current_user:, view_context:)
67
+ @app || new(request: request, context: context, current_user: current_user, view_context: view_context)
96
68
  end
97
69
 
98
- def check_bad_resources
99
- resources.each do |resource|
100
- has_model = resource.model_class.present?
70
+ def license
71
+ Current.license
72
+ end
101
73
 
102
- unless has_model
103
- possible_model = resource.class.to_s.gsub "Resource", ""
74
+ def instance
75
+ Current.app
76
+ end
104
77
 
105
- Avo::App.error_messages.push({
106
- url: "https://docs.avohq.io/2.0/resources.html#custom-model-class",
107
- target: "_blank",
108
- message: "#{resource.class.to_s} does not have a valid model assigned. It failed to find the #{possible_model} model. \n\r Please create that model or assign one using self.model_class = YOUR_MODEL"
109
- })
110
- end
111
- end
78
+ def resources
79
+ Current.app.resource_manager
112
80
  end
113
81
 
114
- # Fetches the resources available to the application.
115
- # We have two ways of doing that.
116
- #
117
- # 1. Through eager loading.
118
- # We automatically eager load the resources directory and fetch the descendants from the scanned files.
119
- # This is the simple way to get started.
120
- #
121
- # 2. Manually, declared by the user.
122
- # We have this option to load the resources because when they are loaded automatically through eager loading,
123
- # those Resource classes and their methods may trigger loading other classes. And that may disrupt Rails booting process.
124
- # Ex: AdminResource may use self.model_class = User. That will trigger Ruby to load the User class and itself load
125
- # other classes in a chain reaction.
126
- # The scenario that comes up most often is when Rails boots, the routes are being computed which eager loads the resource files.
127
- # At that boot time some migration might have not been run yet, but Rails tries to access them through model associations,
128
- # and they are not available.
129
- #
130
- # To enable this feature add a `resources` array config in your Avo initializer.
131
- # config.resources = [
132
- # "UserResource",
133
- # "FishResource",
134
- # ]
135
- def fetch_resources
136
- resources = if Avo.configuration.resources.nil?
137
- BaseResource.descendants
138
- else
139
- Avo.configuration.resources
140
- end
82
+ def dashboards
83
+ Current.app.dashboard_manager
84
+ end
141
85
 
142
- resources.map do |resource|
143
- if resource.is_a?(Class)
144
- resource
145
- else
146
- resource.to_s.safe_constantize
147
- end
148
- end
86
+ def tools
87
+ Current.app.tool_manager
149
88
  end
150
89
 
151
- def init_resources
152
- self.resources = fetch_resources
153
- .select do |resource|
154
- # Remove the BaseResource. We only need the descendants
155
- resource != BaseResource
156
- end
157
- .uniq do |klass|
158
- # On invalid resource configuration the resource classes get duplicated in `ObjectSpace`
159
- # We need to de-duplicate them
160
- klass.name
161
- end
162
- .map do |resource|
163
- resource.new if resource.is_a? Class
164
- end
90
+ def errors
91
+ Current.app.error_manager
165
92
  end
166
93
 
167
- def init_dashboards
168
- eager_load :dashboards unless Rails.application.config.eager_load
94
+ # Renerate a dynamic root path using the URIService
95
+ def root_path(paths: [], query: {}, **args)
96
+ Avo::Services::URIService.parse(Avo::Current.view_context.avo.root_url.to_s)
97
+ .append_paths(paths)
98
+ .append_query(query)
99
+ .to_s
100
+ end
169
101
 
170
- self.dashboards = Dashboards::BaseDashboard.descendants
171
- .select do |dashboard|
172
- dashboard != Dashboards::BaseDashboard
173
- end
174
- .uniq do |dashboard|
175
- dashboard.id
176
- end
102
+ def mount_path
103
+ Avo::Engine.routes.find_script_name({})
177
104
  end
178
105
 
179
106
  def has_main_menu?
@@ -191,47 +118,48 @@ module Avo
191
118
  end
192
119
 
193
120
  def main_menu
121
+ return unless Avo.plugin_manager.installed?(:avo_menu)
122
+
194
123
  # Return empty menu if the app doesn't have the profile menu configured
195
- return Avo::Menu::Builder.new.build unless has_main_menu?
124
+ return AvoMenu::Builder.new.build unless has_main_menu?
196
125
 
197
- Avo::Menu::Builder.parse_menu(&Avo.configuration.main_menu)
126
+ AvoMenu::Builder.parse_menu(&Avo.configuration.main_menu)
198
127
  end
199
128
 
200
129
  def profile_menu
130
+ return unless Avo.plugin_manager.installed?(:avo_menu)
131
+
201
132
  # Return empty menu if the app doesn't have the profile menu configured
202
- return Avo::Menu::Builder.new.build unless has_profile_menu?
133
+ return AvoMenu::Builder.new.build unless has_profile_menu?
203
134
 
204
- Avo::Menu::Builder.parse_menu(&Avo.configuration.profile_menu)
135
+ AvoMenu::Builder.parse_menu(&Avo.configuration.profile_menu)
205
136
  end
137
+ end
206
138
 
207
- def debug_report(request = nil)
208
- payload = {}
209
-
210
- hq = Avo::Licensing::HQ.new(request)
139
+ def init
140
+ self.error_manager = Avo::ErrorManager.build
141
+ self.resource_manager = Avo::Resources::ResourceManager.build
142
+ self.tool_manager = Avo::Tools::ToolManager.build
143
+ end
211
144
 
212
- payload[:license_id] = Avo::App&.license&.id
213
- payload[:license_valid] = Avo::App&.license&.valid?
214
- payload[:license_payload] = Avo::App&.license&.payload
215
- payload[:license_response] = Avo::App&.license&.response
216
- payload[:hq_payload] = hq&.payload
217
- payload[:thread_count] = get_thread_count
218
- payload[:license_abilities] = Avo::App&.license&.abilities
219
- payload[:cache_store] = self.cache_store&.class&.to_s
220
- payload[:avo_metadata] = hq&.avo_metadata
221
- payload[:app_timezone] = Time.current.zone
222
- payload[:cache_key] = Avo::Licensing::HQ.cache_key
223
- payload[:cache_key_contents] = hq&.cached_response
145
+ # Renerate a dynamic root path using the URIService
146
+ def root_path(paths: [], query: {}, **args)
147
+ Avo::Services::URIService.parse(view_context.avo.root_url.to_s)
148
+ .append_paths(paths)
149
+ .append_query(query)
150
+ .to_s
151
+ end
224
152
 
225
- payload
226
- rescue => e
227
- e
228
- end
153
+ def mount_path
154
+ Avo::Engine.routes.find_script_name({})
155
+ end
229
156
 
230
- def get_thread_count
231
- Thread.list.select {|thread| thread.status == "run"}.count
232
- rescue => e
233
- e
234
- end
157
+ def app_status
158
+ Current.license.valid?
235
159
  end
236
160
  end
161
+
162
+ def self.logger
163
+ Avo::App.logger
164
+ end
237
165
  end
@@ -0,0 +1,30 @@
1
+ module Avo
2
+ class AssetManager
3
+ include ActionView::Helpers::AssetTagHelper
4
+
5
+ attr_reader :stylesheets
6
+ attr_reader :javascripts
7
+
8
+ def initialize
9
+ @stylesheets = []
10
+ @javascripts = []
11
+ end
12
+
13
+ def reset
14
+ @stylesheets = []
15
+ @javascripts = []
16
+ end
17
+
18
+ def add_stylesheet(path)
19
+ @stylesheets.push path
20
+ end
21
+
22
+ def add_javascript(path)
23
+ @javascripts.push path
24
+ end
25
+ end
26
+
27
+ def self.asset_manager
28
+ @manager ||= AssetManager.new
29
+ end
30
+ end
@@ -1,53 +1,54 @@
1
1
  module Avo
2
2
  class BaseAction
3
- include Avo::Concerns::HasFields
4
- include Avo::Concerns::HasActionStimulusControllers
3
+ include Avo::Concerns::HasItems
5
4
 
6
5
  class_attribute :name, default: nil
7
6
  class_attribute :message
8
7
  class_attribute :confirm_button_label
9
8
  class_attribute :cancel_button_label
10
9
  class_attribute :no_confirmation, default: false
10
+ class_attribute :record
11
+ class_attribute :view
12
+ class_attribute :user
13
+ class_attribute :resource
11
14
  class_attribute :standalone, default: false
12
15
  class_attribute :visible
13
16
  class_attribute :may_download_file, default: false
14
- class_attribute :turbo
15
17
 
16
- attr_accessor :view
17
18
  attr_accessor :response
18
- attr_accessor :model
19
+ attr_accessor :record
19
20
  attr_accessor :resource
20
21
  attr_accessor :user
21
22
  attr_reader :arguments
22
23
 
23
- delegate :context, to: ::Avo::App
24
- delegate :current_user, to: ::Avo::App
25
- delegate :params, to: ::Avo::App
26
- delegate :view_context, to: ::Avo::App
24
+ delegate :view, to: :class
25
+ # TODO: find a differnet way to delegate this to the uninitialized Current variable
26
+ delegate :context, to: Avo::Current
27
+ delegate :current_user, to: Avo::Current
28
+ delegate :params, to: Avo::Current
29
+ delegate :view_context, to: Avo::Current
27
30
  delegate :avo, to: :view_context
28
31
  delegate :main_app, to: :view_context
29
32
 
30
33
  class << self
31
- delegate :context, to: ::Avo::App
34
+ delegate :context, to: ::Avo::Current
32
35
 
33
36
  def form_data_attributes
34
37
  # We can't respond with a file download from Turbo se we disable it on the form
35
38
  if may_download_file
36
- {turbo: turbo || false, remote: false}
39
+ {turbo: false, remote: false, action_target: :form}
37
40
  else
38
- {turbo: turbo, turbo_frame: :_top}.compact
41
+ {turbo_frame: :_top, action_target: :form}
39
42
  end
40
43
  end
41
44
 
42
45
  # We can't respond with a file download from Turbo se we disable close the modal manually after a while (it's a hack, we know)
43
46
  def submit_button_data_attributes
44
- attributes = { action_target: "submit" }
45
-
46
47
  if may_download_file
47
- attributes[:action] = "click->modal#delayedClose"
48
+ {action: "click->modal#delayedClose"}
49
+ else
50
+ {}
48
51
  end
49
-
50
- attributes
51
52
  end
52
53
  end
53
54
 
@@ -57,11 +58,11 @@ module Avo
57
58
  self.class.to_s.demodulize.underscore.humanize(keep_id_suffix: true)
58
59
  end
59
60
 
60
- def initialize(model: nil, resource: nil, user: nil, view: nil, arguments: {})
61
- @model = model
62
- @resource = resource
63
- @user = user
64
- @view = view
61
+ def initialize(record: nil, resource: nil, user: nil, view: nil, arguments: {})
62
+ self.class.record = record if record.present?
63
+ self.class.resource = resource if resource.present?
64
+ self.class.user = user if user.present?
65
+ self.class.view = view if view.present?
65
66
  @arguments = arguments
66
67
 
67
68
  self.class.message ||= I18n.t("avo.are_you_sure_you_want_to_run_this_option")
@@ -73,11 +74,13 @@ module Avo
73
74
  end
74
75
 
75
76
  def get_message
76
- if self.class.message.respond_to? :call
77
- Avo::Hosts::ResourceRecordHost.new(block: self.class.message, record: @model, resource: @resource).handle
78
- else
79
- self.class.message
80
- end
77
+ Avo::ExecutionContext.new(target: self.class.message, record: self.class.record, resource: self.class.resource).handle
78
+ end
79
+
80
+ def get_attributes_for_action
81
+ get_fields.map do |field|
82
+ [field.id, field.value || field.default]
83
+ end.to_h
81
84
  end
82
85
 
83
86
  def handle_action(**args)
@@ -128,18 +131,18 @@ module Avo
128
131
  end
129
132
 
130
133
  # Run the visible block if available
131
- Avo::Hosts::VisibilityHost.new(
132
- block: visible,
134
+ Avo::ExecutionContext.new(
135
+ target: visible,
133
136
  params: params,
134
137
  parent_resource: parent_resource,
135
- resource: @resource,
136
- view: @view,
138
+ resource: self.class.resource,
139
+ view: self.class.view,
137
140
  arguments: arguments
138
141
  ).handle
139
142
  end
140
143
 
141
144
  def param_id
142
- self.class.to_s
145
+ self.class.to_s.demodulize.underscore.tr "/", "_"
143
146
  end
144
147
 
145
148
  def succeed(text)
@@ -185,9 +188,8 @@ module Avo
185
188
  self
186
189
  end
187
190
 
188
- def redirect_to(path = nil, **args, &block)
191
+ def redirect_to(path = nil, &block)
189
192
  response[:type] = :redirect
190
- response[:redirect_args] = args
191
193
  response[:path] = if block.present?
192
194
  block
193
195
  else
@@ -212,9 +214,9 @@ module Avo
212
214
  end
213
215
 
214
216
  # We're overriding this method to hydrate with the proper resource attribute.
215
- def hydrate_fields(model: nil, view: nil)
217
+ def hydrate_fields
216
218
  fields.map do |field|
217
- field.hydrate(model: @model, view: @view, resource: resource)
219
+ field.hydrate(record: @record, view: @view, resource: resource)
218
220
  end
219
221
 
220
222
  self