avo 2.48.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 (376) 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 +15 -26
  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/hidden_field/edit_component.html.erb +1 -2
  40. data/app/components/avo/fields/index_component.rb +5 -5
  41. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  42. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  43. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  44. data/app/components/avo/fields/show_component.rb +4 -1
  45. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  46. data/app/components/avo/filters_component.html.erb +9 -3
  47. data/app/components/avo/filters_component.rb +4 -4
  48. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  49. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  50. data/app/components/avo/index/grid_item_component.rb +43 -16
  51. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  52. data/app/components/avo/index/resource_controls_component.rb +124 -17
  53. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  54. data/app/components/avo/index/resource_grid_component.rb +5 -2
  55. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  56. data/app/components/avo/index/resource_map_component.rb +3 -3
  57. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  58. data/app/components/avo/index/resource_table_component.rb +14 -20
  59. data/app/components/avo/index/table_row_component.html.erb +8 -4
  60. data/app/components/avo/index/table_row_component.rb +3 -2
  61. data/app/components/avo/item_switcher_component.rb +2 -2
  62. data/app/components/avo/modal_component.html.erb +7 -12
  63. data/app/components/avo/modal_component.rb +0 -21
  64. data/app/components/avo/paginator_component.html.erb +40 -29
  65. data/app/components/avo/paginator_component.rb +5 -23
  66. data/app/components/avo/panel_component.html.erb +8 -6
  67. data/app/components/avo/referrer_params_component.html.erb +1 -2
  68. data/app/components/avo/resource_component.rb +189 -14
  69. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  70. data/app/components/avo/resource_sidebar_component.rb +1 -1
  71. data/app/components/avo/sidebar/link_component.rb +1 -1
  72. data/app/components/avo/sidebar_component.html.erb +10 -3
  73. data/app/components/avo/sidebar_component.rb +5 -3
  74. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  75. data/app/components/avo/tab_group_component.html.erb +13 -7
  76. data/app/components/avo/tab_group_component.rb +1 -6
  77. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  78. data/app/components/avo/tab_switcher_component.rb +4 -39
  79. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  80. data/app/components/avo/views/resource_edit_component.rb +7 -18
  81. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  82. data/app/components/avo/views/resource_index_component.rb +62 -12
  83. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  84. data/app/components/avo/views/resource_show_component.rb +6 -11
  85. data/app/controllers/avo/actions_controller.rb +27 -24
  86. data/app/controllers/avo/application_controller.rb +105 -151
  87. data/app/controllers/avo/associations_controller.rb +34 -43
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +102 -102
  90. data/app/controllers/avo/debug_controller.rb +17 -5
  91. data/app/controllers/avo/home_controller.rb +1 -1
  92. data/app/controllers/avo/search_controller.rb +30 -51
  93. data/app/controllers/avo/team_users_controller.rb +4 -0
  94. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  95. data/app/helpers/avo/application_helper.rb +15 -9
  96. data/app/helpers/avo/resources_helper.rb +1 -1
  97. data/app/helpers/avo/url_helpers.rb +27 -11
  98. data/app/javascript/avo.base.js +1 -0
  99. data/app/javascript/js/application.js +0 -3
  100. data/app/javascript/js/controllers/action_controller.js +5 -3
  101. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  102. data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
  103. data/app/javascript/js/controllers/filter_controller.js +1 -1
  104. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  105. data/app/javascript/js/controllers/preview_controller.js +24 -0
  106. data/app/javascript/js/controllers/search_controller.js +2 -2
  107. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  108. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  109. data/app/javascript/js/controllers.js +10 -6
  110. data/app/javascript/js/custom-stream-actions.js +15 -0
  111. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  112. data/app/views/avo/actions/show.html.erb +10 -7
  113. data/app/views/avo/associations/new.html.erb +2 -2
  114. data/app/views/avo/base/index.html.erb +3 -2
  115. data/app/views/avo/base/new.html.erb +2 -1
  116. data/app/views/avo/base/preview.html.erb +19 -0
  117. data/app/views/avo/base/show.html.erb +1 -1
  118. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  119. data/app/views/avo/debug/report.html.erb +32 -17
  120. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  121. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  122. data/app/views/avo/partials/_footer.html.erb +1 -1
  123. data/app/views/avo/partials/_javascript.html.erb +5 -0
  124. data/app/views/avo/partials/_logo.html.erb +1 -1
  125. data/app/views/avo/partials/_navbar.html.erb +3 -5
  126. data/app/views/avo/partials/_table_header.html.erb +5 -11
  127. data/app/views/layouts/avo/application.html.erb +4 -2
  128. data/avo.gemspec +7 -7
  129. data/bin/dev +1 -1
  130. data/bin/prod +0 -0
  131. data/config/i18n-tasks.yml +1 -1
  132. data/config/initializers/pagy.rb +0 -2
  133. data/config/master.key +1 -0
  134. data/config/routes.rb +6 -10
  135. data/db/factories.rb +7 -1
  136. data/lib/avo/action_model.rb +20 -0
  137. data/lib/avo/asset_manager.rb +30 -0
  138. data/lib/avo/base_action.rb +57 -42
  139. data/lib/avo/base_resource.rb +264 -227
  140. data/lib/avo/base_resource_tool.rb +9 -16
  141. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  142. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  143. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  144. data/lib/avo/concerns/has_controls.rb +37 -0
  145. data/lib/avo/concerns/has_description.rb +23 -0
  146. data/lib/avo/concerns/has_item_type.rb +42 -0
  147. data/lib/avo/concerns/has_items.rb +325 -0
  148. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  149. data/lib/avo/concerns/is_resource_item.rb +24 -36
  150. data/lib/avo/concerns/is_visible.rb +15 -0
  151. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  152. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  153. data/lib/avo/configuration/branding.rb +0 -12
  154. data/lib/avo/configuration.rb +1 -37
  155. data/lib/avo/current.rb +39 -0
  156. data/lib/avo/dsl/field_parser.rb +1 -1
  157. data/lib/avo/dynamic_router.rb +18 -3
  158. data/lib/avo/engine.rb +35 -30
  159. data/lib/avo/error_manager.rb +25 -0
  160. data/lib/avo/execution_context.rb +10 -14
  161. data/lib/avo/fields/badge_field.rb +1 -1
  162. data/lib/avo/fields/base_field.rb +91 -106
  163. data/lib/avo/fields/belongs_to_field.rb +18 -22
  164. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  165. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  166. data/lib/avo/fields/concerns/has_default.rb +1 -5
  167. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  168. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  169. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  170. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  171. data/lib/avo/fields/concerns/is_required.rb +5 -7
  172. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  173. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  174. data/lib/avo/fields/country_field.rb +4 -0
  175. data/lib/avo/fields/date_time_field.rb +1 -5
  176. data/lib/avo/fields/field_manager.rb +55 -0
  177. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  178. data/lib/avo/fields/has_base_field.rb +12 -15
  179. data/lib/avo/fields/has_many_field.rb +5 -2
  180. data/lib/avo/fields/has_one_field.rb +6 -10
  181. data/lib/avo/fields/heading_field.rb +4 -1
  182. data/lib/avo/fields/hidden_field.rb +1 -1
  183. data/lib/avo/fields/id_field.rb +1 -1
  184. data/lib/avo/fields/location_field.rb +8 -8
  185. data/lib/avo/fields/password_field.rb +1 -1
  186. data/lib/avo/fields/preview_field.rb +14 -0
  187. data/lib/avo/fields/select_field.rb +12 -8
  188. data/lib/avo/fields/status_field.rb +4 -0
  189. data/lib/avo/filters/base_filter.rb +8 -4
  190. data/lib/avo/html/builder.rb +7 -8
  191. data/lib/avo/item_grapher.rb +78 -0
  192. data/lib/avo/licensing/h_q.rb +8 -67
  193. data/lib/avo/licensing/license.rb +1 -1
  194. data/lib/avo/licensing/pro_license.rb +1 -7
  195. data/lib/avo/loaders/fields_loader.rb +7 -1
  196. data/lib/avo/plugin.rb +16 -0
  197. data/lib/avo/plugin_manager.rb +56 -0
  198. data/lib/avo/prefixed_test_helpers.rb +20 -0
  199. data/lib/avo/reloader.rb +3 -0
  200. data/lib/avo/resources/controls/actions_list.rb +7 -12
  201. data/lib/avo/resources/controls/attach_button.rb +15 -0
  202. data/lib/avo/resources/controls/back_button.rb +1 -1
  203. data/lib/avo/resources/controls/base_control.rb +15 -49
  204. data/lib/avo/resources/controls/create_button.rb +15 -0
  205. data/lib/avo/resources/controls/delete_button.rb +5 -1
  206. data/lib/avo/resources/controls/detach_button.rb +4 -1
  207. data/lib/avo/resources/controls/edit_button.rb +4 -1
  208. data/lib/avo/resources/controls/order_controls.rb +8 -0
  209. data/lib/avo/resources/controls/save_button.rb +13 -0
  210. data/lib/avo/resources/controls/show_button.rb +15 -0
  211. data/lib/avo/resources/items/holder.rb +84 -0
  212. data/lib/avo/resources/items/item_group.rb +49 -0
  213. data/lib/avo/resources/items/main_panel.rb +2 -0
  214. data/lib/avo/resources/items/panel.rb +2 -0
  215. data/lib/avo/resources/items/row.rb +54 -0
  216. data/lib/avo/resources/items/sidebar.rb +47 -0
  217. data/lib/avo/resources/items/tab.rb +60 -0
  218. data/lib/avo/resources/items/tab_group.rb +68 -0
  219. data/lib/avo/resources/resource_manager.rb +174 -0
  220. data/lib/avo/services/authorization_service.rb +11 -110
  221. data/lib/avo/services/debug_service.rb +93 -0
  222. data/lib/avo/services/encryption_service.rb +5 -1
  223. data/lib/avo/services/telemetry_service.rb +85 -0
  224. data/lib/avo/test_helpers.rb +362 -0
  225. data/lib/avo/tools/tool_manager.rb +30 -0
  226. data/lib/avo/version.rb +1 -1
  227. data/lib/avo.rb +115 -24
  228. data/lib/generators/avo/action_generator.rb +8 -8
  229. data/lib/generators/avo/card_generator.rb +27 -0
  230. data/lib/generators/avo/filter_generator.rb +8 -8
  231. data/lib/generators/avo/resource_generator.rb +4 -4
  232. data/lib/generators/avo/scope_generator.rb +15 -0
  233. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  234. data/lib/generators/avo/templates/action.tt +8 -6
  235. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  236. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  237. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  238. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  239. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  240. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  241. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  242. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  243. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  244. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  245. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  246. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  247. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  248. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  249. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  250. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  251. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  252. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  253. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  254. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  255. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  256. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  257. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  258. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  259. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  260. data/lib/generators/avo/templates/scope.tt +6 -0
  261. data/lib/generators/avo/templates/tool/view.tt +2 -2
  262. data/lib/tasks/avo_tasks.rake +27 -0
  263. data/public/avo-assets/avo.base.css +1810 -1189
  264. data/public/avo-assets/avo.base.js +217 -307
  265. data/public/avo-assets/avo.base.js.map +3 -3
  266. data/public/avo-assets/avo.css +9744 -0
  267. data/public/avo-assets/avo.js +513 -0
  268. data/public/avo-assets/avo.js.map +7 -0
  269. metadata +97 -139
  270. data/app/assets/stylesheets/css/tags.css +0 -32
  271. data/app/components/avo/card_component.html.erb +0 -46
  272. data/app/components/avo/card_component.rb +0 -25
  273. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  274. data/app/components/avo/dashboards/divider_component.rb +0 -19
  275. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  276. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  277. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  278. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  279. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  280. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  281. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  282. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  283. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  284. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  285. data/app/components/avo/index/ordering/base_component.rb +0 -9
  286. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  287. data/app/components/avo/index/ordering/button_component.rb +0 -23
  288. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  289. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  290. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  291. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  292. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  293. data/app/controllers/avo/dashboards_controller.rb +0 -22
  294. data/app/controllers/avo/reorder_controller.rb +0 -25
  295. data/app/javascript/js/controllers/base_controller.js +0 -22
  296. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  297. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  298. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  299. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  300. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  301. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  302. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  303. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  304. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  305. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  306. data/app/views/avo/dashboards/show.html.erb +0 -38
  307. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  308. data/app/views/avo/partials/_global_search.html.erb +0 -19
  309. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  310. data/lib/avo/app.rb +0 -237
  311. data/lib/avo/base_card.rb +0 -161
  312. data/lib/avo/concerns/fetches_things.rb +0 -150
  313. data/lib/avo/concerns/handles_field_args.rb +0 -47
  314. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  315. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  316. data/lib/avo/concerns/has_fields.rb +0 -334
  317. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  318. data/lib/avo/concerns/pagination.rb +0 -53
  319. data/lib/avo/concerns/policy_helpers.rb +0 -31
  320. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  321. data/lib/avo/concerns/visible_items.rb +0 -51
  322. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  323. data/lib/avo/dashboards/base_divider.rb +0 -35
  324. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  325. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  326. data/lib/avo/dashboards/metric_card.rb +0 -9
  327. data/lib/avo/dashboards/partial_card.rb +0 -7
  328. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  329. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  330. data/lib/avo/fields/tags_field.rb +0 -102
  331. data/lib/avo/grid_collector.rb +0 -42
  332. data/lib/avo/hosts/association_scope_host.rb +0 -8
  333. data/lib/avo/hosts/base_host.rb +0 -25
  334. data/lib/avo/hosts/card_visibility.rb +0 -20
  335. data/lib/avo/hosts/dashboard_card.rb +0 -22
  336. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  337. data/lib/avo/hosts/ordering.rb +0 -22
  338. data/lib/avo/hosts/record_host.rb +0 -7
  339. data/lib/avo/hosts/resource_record_host.rb +0 -7
  340. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  341. data/lib/avo/hosts/search_scope_host.rb +0 -7
  342. data/lib/avo/hosts/view_record_host.rb +0 -7
  343. data/lib/avo/hosts/visibility_host.rb +0 -12
  344. data/lib/avo/items_holder.rb +0 -96
  345. data/lib/avo/main_panel.rb +0 -3
  346. data/lib/avo/menu/base_item.rb +0 -25
  347. data/lib/avo/menu/builder.rb +0 -82
  348. data/lib/avo/menu/dashboard.rb +0 -22
  349. data/lib/avo/menu/group.rb +0 -2
  350. data/lib/avo/menu/link.rb +0 -6
  351. data/lib/avo/menu/menu.rb +0 -2
  352. data/lib/avo/menu/resource.rb +0 -22
  353. data/lib/avo/menu/section.rb +0 -2
  354. data/lib/avo/panel.rb +0 -24
  355. data/lib/avo/panel_builder.rb +0 -25
  356. data/lib/avo/resources/controls/action.rb +0 -38
  357. data/lib/avo/resources/controls/execution_context.rb +0 -58
  358. data/lib/avo/resources/controls/items_holder.rb +0 -19
  359. data/lib/avo/resources/controls/link_to.rb +0 -27
  360. data/lib/avo/row.rb +0 -26
  361. data/lib/avo/row_builder.rb +0 -24
  362. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  363. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  364. data/lib/avo/sidebar.rb +0 -30
  365. data/lib/avo/sidebar_builder.rb +0 -24
  366. data/lib/avo/tab.rb +0 -72
  367. data/lib/avo/tab_builder.rb +0 -25
  368. data/lib/avo/tab_group.rb +0 -42
  369. data/lib/avo/tab_group_builder.rb +0 -43
  370. data/lib/avo/tools_manager.rb +0 -11
  371. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  372. data/lib/generators/avo/card/metric_generator.rb +0 -18
  373. data/lib/generators/avo/card/partial_generator.rb +0 -19
  374. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  375. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  376. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -1,22 +1,37 @@
1
1
  <turbo-frame id="debug-report">
2
- <div class="font-semibold">Debug report <small class="font-normal">(don't post this anywhere public)</small></div>
3
- <div>
4
- <% if defined?(ap) %>
5
- <%== ap Avo::App.debug_report(request) %>
6
- <% else %>
7
- <pre><%== JSON.pretty_generate(Avo::App.debug_report(request)) %></pre>
2
+ <div class="flex gap-2">
3
+ <%= form_with url: avo.avo_private_send_to_hq_path, data: {turbo_frame: :send_to_hq}, class: "w-full" do |f| %>
4
+ <div class="space-y-8 divide-y divide-gray-200">
5
+ <div>
6
+ <div>
7
+ <h3 class="text-lg font-medium leading-6 text-gray-900">Send in a bug report (pro feature)</h3>
8
+ <p class="mt-1 text-sm text-gray-500">If you think there is something wrong with Avo and you'd like to report with some (anonymized) telemetry about the app, please fill in any relevant details and send it in.</p>
9
+ <p class="mt-1 text-sm text-gray-500">Otherwise, please <a href="https://avo.cool/new-issue" target="_blank">create a GitHub issue</a> where everyone can contribute.</p>
10
+ </div>
11
+
12
+ <div class="sm:col-span-6 mt-4">
13
+ <label for="about" class="block text-sm font-medium text-gray-700">Details</label>
14
+ <div class="mt-1">
15
+ <%= f.text_area :body, rows: 3, class: "block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm disabled:bg-gray-100", disabled: !Avo::Current.license.pro? %>
16
+ </div>
17
+ </div>
18
+ <%= f.hidden_field :license_key, value: Avo::Services::DebugService.debug_report(request)[:license_response]["license_key"] %>
19
+ <%= a_button icon: 'heroicons/outline/paper-airplane',
20
+ color: :primary,
21
+ style: :primary,
22
+ class: "mt-4",
23
+ disabled: !Avo::Current.license.pro?,
24
+ type: :submit do %>
25
+ Send to HQ
26
+ <% end %>
27
+ </div>
28
+ </div>
8
29
  <% end %>
9
30
  </div>
10
- <div class="flex justify-end">
11
- <%= a_button icon: 'heroicons/outline/clipboard',
12
- color: :primary,
13
- style: :primary,
14
- data: {
15
- controller: 'copy-to-clipboard',
16
- action: "click->copy-to-clipboard#copy",
17
- text: Avo::App.debug_report(request),
18
- } do %>
19
- Copy debug info
20
- <% end %>
31
+ <div class="text-right">
32
+ <%= turbo_frame_tag :send_to_hq %>
33
+ </div>
34
+ <div class="overflow-auto max-w-full">
35
+
21
36
  </div>
22
37
  </turbo-frame>
@@ -1,7 +1,6 @@
1
1
  <%
2
- license = Avo::App.license
2
+ license = Avo.license
3
3
  information_items = [
4
- 'license',
5
4
  'license_key',
6
5
  'ruby_version',
7
6
  'rails_version',
@@ -14,14 +13,14 @@
14
13
  hq_payload = Avo::Licensing::HQ.new(request).payload
15
14
  %>
16
15
  <div class="flex flex-col">
17
- <%= render Avo::PanelComponent.new(name: 'Debug Avo', description: 'Use this page to debug the Avo license.') do |c| %>
16
+ <%= render Avo::PanelComponent.new(name: 'Avo Status', description: 'Use this page to debug your Avo instance.') do |c| %>
18
17
  <% c.with_tools do %>
19
18
  <% end %>
20
19
  <% c.with_bare_content do %>
21
- <div class="grid gap-4 sm:grid-cols-3">
22
- <div class="relative flex flex-col bg-white rounded shadow-panel p-4 space-y-4 h-full col-span-1">
23
- <div class="flex justify-between w-full">
24
- <div class="font-semibold">License info</div>
20
+ <div class="grid gap-4 grid-cols-2">
21
+ <div class="relative flex flex-col bg-white rounded shadow-panel p-4 space-y-4 h-full">
22
+ <div class="flex justify-between w-full">
23
+ <div class="font-semibold">License info</div>
25
24
  <div class="flex justify-self-end">
26
25
  <%= a_button style: :outline,
27
26
  color: :blue,
@@ -33,10 +32,10 @@
33
32
  Refresh license
34
33
  <% end %>
35
34
  </div>
36
- </div>
35
+ </div>
37
36
  <div class="flex flex-col flex-1">
38
37
  <div>
39
- <div class="text-xl font-semibold"><%= license.name %></div>
38
+ <div class="text-xl font-semibold"><%= render partial: "valid_indicator", locals: {valid: license.valid?} %> <%= license.name %> license </div>
40
39
  <% if license.response['reason'] %>
41
40
  <dl>
42
41
  <dt class="font-semibold text-sm">Error</dt>
@@ -63,17 +62,35 @@
63
62
  (<%= time_ago_in_words license.response['fetched_at'] %> ago)</dd>
64
63
  <% end %>
65
64
  <dt class="font-semibold text-sm">Cache store</dt>
66
- <dd><%= Avo::App.cache_store.class.to_s %> - <%= Avo::App.cache_store.options.inspect %></dd>
67
65
  </dl>
68
66
  </div>
69
67
  </div>
70
68
  </div>
71
69
  </div>
72
- <div class="relative bg-white rounded shadow-panel p-4 space-y-4 col-span-2">
73
- <turbo-frame id="debug-report" src="<%= root_path %>avo_private/debug/report" target="_top" class="block">
74
- Loading...
75
- </turbo-frame>
70
+ <div class="relative flex flex-col bg-white rounded shadow-panel p-4 space-y-4 h-full">
71
+ <div class="flex justify-between w-full">
72
+ <div class="font-semibold">Plugins</div>
73
+ </div>
74
+ <div class="flex flex-col flex-1">
75
+ <div>
76
+ <ul>
77
+ <li>Avo <%= Avo::VERSION %></li>
78
+ <% Avo.plugin_manager.plugins.each do |plugin| %>
79
+ <li><%= plugin.klass.to_s.split("::").first %> <%= plugin.klass.version %></li>
80
+ <% end %>
81
+ </ul>
82
+ </div>
83
+ </div>
76
84
  </div>
85
+ <%= render Avo::PanelComponent.new(title: "Report") do |c| %>
86
+ <% c.with_body do %>
87
+ <div class="p-4">
88
+ <turbo-frame id="debug-report" src="<%= root_path %>avo_private/debug/report" target="_top" class="block">
89
+ Loading...
90
+ </turbo-frame>
91
+ </div>
92
+ <% end %>
93
+ <% end %>
77
94
  </div>
78
95
  <% end %>
79
96
  <% end %>
@@ -5,8 +5,8 @@
5
5
  </a>
6
6
  </div>
7
7
  <% end %>
8
- <% if Avo::App.error_messages.present? %>
9
- <% Avo::App.error_messages.each do |error| %>
8
+ <% if Avo.error_manager.has_errors?.present? %>
9
+ <% Avo.error_manager.all.each do |error| %>
10
10
  <% if error.is_a? Hash %>
11
11
  <%
12
12
  url, message, target = error.values_at :url, :message, :target
@@ -1,3 +1,3 @@
1
1
  <div class="text-center text-sm text-gray-700 <%= 'print:hidden' if Avo.configuration.hide_layout_when_printing %>">
2
- <a href="https://avohq.io/" target="_blank">Avo</a> · &copy; <%= Date.today.year %> AvoHQ · <span title="<%= Avo::App.license.valid ? 'valid' : 'invalid'%> <%= Avo::App.license.id %> license">v<%= Avo::VERSION %></span>
2
+ <a href="https://avohq.io/" target="_blank">Avo</a> · &copy; <%= Date.today.year %> AvoHQ · <span title="<%= Avo.license.valid ? 'valid' : 'invalid'%> <%= Avo.license.id %> license">v<%= Avo::VERSION %></span>
3
3
  </div>
@@ -4,4 +4,9 @@
4
4
  Avo.configuration.root_path = '<%= root_path_without_url %>'
5
5
  Avo.configuration.search_debounce = '<%= Avo.configuration.search_debounce %>'
6
6
  Avo.configuration.cookies_key = '<%= Avo::COOKIES_KEY %>'
7
+ <% if Avo.avo_filters_installed? %>
8
+ Avo.configuration.avo_filters = {
9
+ param_key: '<%= Avo::DynamicFilters.configuration.param_key %>'
10
+ }
11
+ <% end %>
7
12
  <% end %>
@@ -1,4 +1,4 @@
1
- <%= link_to root_path, class: 'logo-placeholder h-full w-full flex justify-start' do %>
1
+ <%= link_to avo.root_path, class: 'logo-placeholder h-full w-full flex justify-start' do %>
2
2
  <%= image_tag Avo.configuration.branding.logo, class: 'hidden sm:block object-contain', title: 'Avo' %>
3
3
  <%= image_tag Avo.configuration.branding.logomark, class: 'sm:hidden object-contain', title: 'Avo' %>
4
4
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <div
2
- class="fixed bg-white p-2 w-full flex flex-shrink-0 items-center z-50 px-4 lg:px-4 border-b space-x-4 lg:space-x-0 h-16 <%= 'print:hidden' if Avo.configuration.hide_layout_when_printing %>"
2
+ class="fixed bg-white p-2 w-full flex flex-shrink-0 items-center z-50 px-4 border-b space-x-4 lg:space-x-0 h-16 <%= 'print:hidden' if Avo.configuration.hide_layout_when_printing %>"
3
3
  v-if="layout !== 'blank'"
4
4
  >
5
5
  <div class="flex items-center space-x-2 w-auto lg:w-64 flex-shrink-0 h-full">
@@ -9,10 +9,8 @@
9
9
  </div>
10
10
  <%= render partial: "avo/partials/logo" %>
11
11
  </div>
12
- <div class="flex-1 flex items-center justify-between lg:justify-start space-x-2 sm:space-x-8 lg:pl-4">
13
- <div class="flex">
14
- <%= render partial: "avo/partials/global_search" if ::Avo::App.license.has_with_trial(:global_search) && ::Avo.configuration.feature_enabled?(:global_search) %>
15
- </div>
12
+ <div class="flex-1 flex items-center justify-between lg:justify-start space-x-2 sm:space-x-8 lg:px-2">
13
+ <%= render Avo::Pro::GlobalSearchComponent.new rescue nil %>
16
14
  <div class="m-0">
17
15
  <%= render partial: "avo/partials/header" %>
18
16
  </div>
@@ -1,4 +1,6 @@
1
- <thead class="bg-white border-b border-gray-200 pb-1">
1
+ <thead
2
+ data-component-name="avo/partials/table_header"
3
+ class="bg-white border-b border-gray-200 pb-1">
2
4
  <% if @resource.record_selector %>
3
5
  <th class="rounded-lg" data-control="item-select-th">
4
6
  <%== item_select_all_input %>
@@ -35,14 +37,6 @@
35
37
  sort_direction = 'desc'
36
38
  end
37
39
  classes = "text-gray-500 tracking-tight leading-tight text-xs font-semibold"
38
- classes += case field.index_text_align.to_sym
39
- when :right
40
- " text-right"
41
- when :center
42
- " text-center"
43
- else
44
- ""
45
- end
46
40
  %>
47
41
  <%= content_tag :th,
48
42
  class: "text-left uppercase px-3 py-3 whitespace-nowrap rounded-l",
@@ -53,12 +47,12 @@
53
47
  } do %>
54
48
  <% if field.sortable %>
55
49
  <%= link_to params.permit!.merge(sort_by: sort_by, sort_direction: sort_direction), class: "flex items-center #{classes} #{'cursor-pointer' if field.sortable}", 'data-turbo-frame': params[:turbo_frame] do %>
56
- <%= field.name %>
50
+ <%= field.table_header_label %>
57
51
  <%= render partial: 'avo/partials/sortable_component', locals: {field: field} %>
58
52
  <% end %>
59
53
  <% else %>
60
54
  <div class="block w-full <%= classes %>">
61
- <%= field.name %>
55
+ <%= field.table_header_label %>
62
56
  </div>
63
57
  <% end %>
64
58
  <% end %>
@@ -9,6 +9,7 @@
9
9
  <%= render partial: 'avo/partials/javascript' %>
10
10
  <%= render partial: 'avo/partials/branding' %>
11
11
  <%= render partial: 'avo/partials/pre_head' %>
12
+ <%= render Avo::AssetManager::StylesheetComponent.new asset_manager: Avo.asset_manager %>
12
13
  <% if Avo::PACKED %>
13
14
  <%= javascript_include_tag "/avo-assets/avo.base", "data-turbo-track": "reload", defer: true %>
14
15
  <%= stylesheet_link_tag "/avo-assets/avo.base", "data-turbo-track": "reload", defer: true %>
@@ -19,6 +20,7 @@
19
20
  <%= javascript_include_tag "hotwire-livereload", defer: true %>
20
21
  <% end %>
21
22
  <% end %>
23
+ <%= render Avo::AssetManager::JavascriptComponent.new asset_manager: Avo.asset_manager %>
22
24
  <%= render partial: 'avo/partials/head' %>
23
25
  </head>
24
26
  <body class="bg-application os-mac">
@@ -58,8 +60,8 @@
58
60
  <%= render partial: "avo/partials/scripts" %>
59
61
  <!-- Avo version: <%= Avo::VERSION %> -->
60
62
  <!-- Environment: <%= Rails.env %> -->
61
- <!-- License ID: <%= Avo::App.license.id %> -->
62
- <!-- License valid?: <%= Avo::App.license.valid ? "valid" : "invalid" %> -->
63
+ <!-- License ID: <%= Avo.license.id %> -->
64
+ <!-- License valid?: <%= Avo.license.valid ? "valid" : "invalid" %> -->
63
65
  </body>
64
66
  </html>
65
67
  <!-- ✨ Built with Avo • https://www.avohq.io/ -->
data/avo.gemspec CHANGED
@@ -1,7 +1,7 @@
1
- $:.push File.expand_path("lib", __dir__)
1
+ # $:.push File.expand_path("lib", __dir__)
2
2
 
3
3
  # Maintain your gem's version:
4
- require "avo/version"
4
+ require_relative "lib/avo/version"
5
5
 
6
6
  # Describe your gem and declare its dependencies:
7
7
  Gem::Specification.new do |spec|
@@ -27,20 +27,20 @@ Gem::Specification.new do |spec|
27
27
  "public gem pushes."
28
28
  end
29
29
 
30
- spec.required_ruby_version = ">= 2.6.0"
30
+ spec.required_ruby_version = ">= 3.0.0"
31
31
  spec.post_install_message = "Thank you for using Avo 💪 Docs are available at https://docs.avohq.io"
32
32
 
33
33
  spec.files = Dir["{bin,app,config,db,lib,public}/**/*", "MIT-LICENSE", "Rakefile", "README.md", "avo.gemspec", "Gemfile", "Gemfile.lock"]
34
34
 
35
- spec.add_dependency "activerecord", ">= 6.0"
36
- spec.add_dependency "actionview", ">= 6.0"
35
+ spec.add_dependency "activerecord", ">= 6.1"
36
+ spec.add_dependency "activesupport", ">= 6.1"
37
+ spec.add_dependency "actionview", ">= 6.1"
37
38
  spec.add_dependency "pagy"
38
39
  spec.add_dependency "zeitwerk", ">= 2.6.2"
39
40
  spec.add_dependency "httparty"
40
41
  spec.add_dependency "active_link_to"
41
- spec.add_dependency "view_component", ">= 2.54.0"
42
+ spec.add_dependency "view_component", ">= 3.0.0"
42
43
  spec.add_dependency "turbo-rails"
43
- spec.add_dependency "turbo_power", "~> 0.5.0"
44
44
  spec.add_dependency "addressable"
45
45
  spec.add_dependency "meta-tags"
46
46
  spec.add_dependency "dry-initializer"
data/bin/dev CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env bash
1
+ #!/usr/bin/env sh
2
2
 
3
3
  PORT="${PORT:-3030}"
4
4
  export PORT
data/bin/prod CHANGED
File without changes
@@ -3,7 +3,7 @@
3
3
  # The "main" locale.
4
4
  base_locale: en
5
5
  ## All available locales are inferred from the data by default. Alternatively, specify them explicitly:
6
- locales: [ar, en, es, fr, nb, nn, pt-BR, pt, ro, tr]
6
+ locales: [en, fr, nb, nn, pt-BR, pt, ro, tr]
7
7
  ## Reporting locale, default: en. Available: en, ru.
8
8
  # internal_locale: en
9
9
 
@@ -1,5 +1,4 @@
1
1
  require "pagy/extras/trim"
2
- require "pagy/extras/countless"
3
2
 
4
3
  # For locales without native pagy i18n support
5
4
  def pagy_locale_path(file_name)
@@ -8,7 +7,6 @@ end
8
7
 
9
8
  extra_locales = [
10
9
  {locale: "en"},
11
- {locale: "es"},
12
10
  {locale: "fr"},
13
11
  {locale: "nb"},
14
12
  {locale: "pt-BR"},
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 Avo::DynamicFilters::Engine, at: "/avo-dynamic_filters" if defined?(Avo::DynamicFilters::Engine)
8
+ mount Avo::Dashboards::Engine, at: "/dashboards" if defined?(Avo::Dashboards::Engine)
9
+ mount Avo::Pro::Engine, at: "/avo/avo-pro" if defined?(Avo::Pro::Engine)
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
@@ -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) }
@@ -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
@@ -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,57 @@
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
17
  class_attribute :turbo
15
18
 
16
- attr_accessor :view
17
19
  attr_accessor :response
18
- attr_accessor :model
20
+ attr_accessor :record
19
21
  attr_accessor :resource
20
22
  attr_accessor :user
21
23
  attr_reader :arguments
22
24
 
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
25
+ delegate :view, to: :class
26
+ # TODO: find a differnet way to delegate this to the uninitialized Current variable
27
+ delegate :context, to: Avo::Current
28
+ def curent_user
29
+ Avo::Current.user
30
+ end
31
+ delegate :params, to: Avo::Current
32
+ delegate :view_context, to: Avo::Current
27
33
  delegate :avo, to: :view_context
28
34
  delegate :main_app, to: :view_context
29
35
 
30
36
  class << self
31
- delegate :context, to: ::Avo::App
37
+ delegate :context, to: ::Avo::Current
32
38
 
33
39
  def form_data_attributes
34
40
  # We can't respond with a file download from Turbo se we disable it on the form
35
41
  if may_download_file
36
- {turbo: turbo || false, remote: false}
42
+ {turbo: turbo || false, remote: false, action_target: :form}
37
43
  else
38
- {turbo: turbo, turbo_frame: :_top}.compact
44
+ {turbo: turbo, turbo_frame: :_top, action_target: :form}.compact
39
45
  end
40
46
  end
41
47
 
42
48
  # 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
49
  def submit_button_data_attributes
44
- attributes = { action_target: "submit" }
45
-
46
50
  if may_download_file
47
- attributes[:action] = "click->modal#delayedClose"
51
+ {action: "click->modal#delayedClose"}
52
+ else
53
+ {}
48
54
  end
49
-
50
- attributes
51
55
  end
52
56
  end
53
57
 
@@ -57,31 +61,47 @@ module Avo
57
61
  self.class.to_s.demodulize.underscore.humanize(keep_id_suffix: true)
58
62
  end
59
63
 
60
- def initialize(model: nil, resource: nil, user: nil, view: nil, arguments: {})
61
- @model = model
62
- @resource = resource
63
- @user = user
64
- @view = view
64
+ def initialize(record: nil, resource: nil, user: nil, view: nil, arguments: {})
65
+ self.class.record = record
66
+ self.class.resource = resource
67
+ self.class.user = user
68
+ self.class.view = view
65
69
  @arguments = arguments
66
70
 
67
71
  self.class.message ||= I18n.t("avo.are_you_sure_you_want_to_run_this_option")
68
72
  self.class.confirm_button_label ||= I18n.t("avo.run")
69
73
  self.class.cancel_button_label ||= I18n.t("avo.cancel")
70
74
 
75
+ self.items_holder = Avo::Resources::Items::Holder.new
76
+ fields
77
+
71
78
  @response ||= {}
72
79
  @response[:messages] = []
73
80
  end
74
81
 
82
+ # Blank method
83
+ def fields
84
+ end
85
+
75
86
  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
87
+ Avo::ExecutionContext.new(target: self.class.message, record: self.class.record, resource: self.class.resource).handle
88
+ end
89
+
90
+ def get_attributes_for_action
91
+ get_fields.map do |field|
92
+ value = field.value || Avo::ExecutionContext.new(
93
+ target: field.default,
94
+ record: self.class.record,
95
+ resource: self.class.resource,
96
+ view: view
97
+ ).handle
98
+
99
+ [field.id, value]
100
+ end.to_h
81
101
  end
82
102
 
83
103
  def handle_action(**args)
84
- models, fields, current_user, resource = args.values_at(:models, :fields, :current_user, :resource)
104
+ records, fields, current_user, resource = args.values_at(:records, :fields, :current_user, :resource)
85
105
  # Fetching the field definitions and not the actual fields (get_fields) because they will break if the user uses a `visible` block and adds a condition using the `params` variable. The params are different in the show method and the handle method.
86
106
  action_fields = get_field_definitions.map { |field| [field.id, field] }.to_h
87
107
 
@@ -111,7 +131,7 @@ module Avo
111
131
  resource: resource
112
132
  }
113
133
 
114
- args[:models] = models unless standalone
134
+ args[:records] = records
115
135
 
116
136
  handle(**args)
117
137
 
@@ -128,12 +148,12 @@ module Avo
128
148
  end
129
149
 
130
150
  # Run the visible block if available
131
- Avo::Hosts::VisibilityHost.new(
132
- block: visible,
151
+ Avo::ExecutionContext.new(
152
+ target: visible,
133
153
  params: params,
134
154
  parent_resource: parent_resource,
135
- resource: @resource,
136
- view: @view,
155
+ resource: self.class.resource,
156
+ view: self.class.view,
137
157
  arguments: arguments
138
158
  ).handle
139
159
  end
@@ -148,12 +168,6 @@ module Avo
148
168
  self
149
169
  end
150
170
 
151
- def fail(text)
152
- Rails.logger.warn "DEPRECATION WARNING: Action fail method is deprecated in favor of error method and will be removed from Avo version 3.0.0"
153
-
154
- error text
155
- end
156
-
157
171
  def error(text)
158
172
  add_message text, :error
159
173
 
@@ -185,9 +199,10 @@ module Avo
185
199
  self
186
200
  end
187
201
 
188
- def redirect_to(path = nil, **args, &block)
202
+ def redirect_to(path = nil, allow_other_host: nil, status: nil, &block)
189
203
  response[:type] = :redirect
190
- response[:redirect_args] = args
204
+ response[:allow_other_host] = allow_other_host
205
+ response[:status] = status
191
206
  response[:path] = if block.present?
192
207
  block
193
208
  else
@@ -212,9 +227,9 @@ module Avo
212
227
  end
213
228
 
214
229
  # We're overriding this method to hydrate with the proper resource attribute.
215
- def hydrate_fields(model: nil, view: nil)
230
+ def hydrate_fields
216
231
  fields.map do |field|
217
- field.hydrate(model: @model, view: @view, resource: resource)
232
+ field.hydrate(record: @record, view: @view, resource: resource)
218
233
  end
219
234
 
220
235
  self