avo 2.45.0 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of avo might be problematic. Click here for more details.

Files changed (371) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +8 -8
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/index_component.rb +5 -5
  40. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  41. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  42. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  43. data/app/components/avo/fields/show_component.rb +4 -1
  44. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  45. data/app/components/avo/filters_component.html.erb +9 -3
  46. data/app/components/avo/filters_component.rb +4 -4
  47. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  48. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  49. data/app/components/avo/index/grid_item_component.rb +43 -16
  50. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  51. data/app/components/avo/index/resource_controls_component.rb +124 -17
  52. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  53. data/app/components/avo/index/resource_grid_component.rb +5 -2
  54. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  55. data/app/components/avo/index/resource_map_component.rb +3 -3
  56. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  57. data/app/components/avo/index/resource_table_component.rb +14 -20
  58. data/app/components/avo/index/table_row_component.html.erb +8 -4
  59. data/app/components/avo/index/table_row_component.rb +3 -2
  60. data/app/components/avo/item_switcher_component.rb +2 -2
  61. data/app/components/avo/modal_component.html.erb +7 -12
  62. data/app/components/avo/modal_component.rb +0 -21
  63. data/app/components/avo/paginator_component.html.erb +40 -29
  64. data/app/components/avo/paginator_component.rb +5 -23
  65. data/app/components/avo/panel_component.html.erb +8 -6
  66. data/app/components/avo/referrer_params_component.html.erb +1 -2
  67. data/app/components/avo/resource_component.rb +189 -14
  68. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  69. data/app/components/avo/resource_sidebar_component.rb +1 -1
  70. data/app/components/avo/sidebar/link_component.rb +1 -1
  71. data/app/components/avo/sidebar_component.html.erb +10 -3
  72. data/app/components/avo/sidebar_component.rb +5 -3
  73. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  74. data/app/components/avo/tab_group_component.html.erb +13 -7
  75. data/app/components/avo/tab_group_component.rb +1 -6
  76. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  77. data/app/components/avo/tab_switcher_component.rb +4 -39
  78. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  79. data/app/components/avo/views/resource_edit_component.rb +7 -18
  80. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  81. data/app/components/avo/views/resource_index_component.rb +62 -12
  82. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  83. data/app/components/avo/views/resource_show_component.rb +6 -11
  84. data/app/controllers/avo/actions_controller.rb +27 -24
  85. data/app/controllers/avo/application_controller.rb +105 -151
  86. data/app/controllers/avo/associations_controller.rb +34 -43
  87. data/app/controllers/avo/attachments_controller.rb +4 -4
  88. data/app/controllers/avo/base_controller.rb +102 -102
  89. data/app/controllers/avo/debug_controller.rb +17 -5
  90. data/app/controllers/avo/home_controller.rb +1 -1
  91. data/app/controllers/avo/search_controller.rb +30 -51
  92. data/app/controllers/avo/team_users_controller.rb +4 -0
  93. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  94. data/app/helpers/avo/application_helper.rb +15 -9
  95. data/app/helpers/avo/resources_helper.rb +1 -1
  96. data/app/helpers/avo/url_helpers.rb +27 -11
  97. data/app/javascript/avo.base.js +1 -0
  98. data/app/javascript/js/application.js +0 -3
  99. data/app/javascript/js/controllers/action_controller.js +5 -3
  100. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  101. data/app/javascript/js/controllers/filter_controller.js +1 -1
  102. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  103. data/app/javascript/js/controllers/preview_controller.js +24 -0
  104. data/app/javascript/js/controllers/search_controller.js +2 -2
  105. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  106. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  107. data/app/javascript/js/controllers.js +10 -6
  108. data/app/javascript/js/custom-stream-actions.js +15 -0
  109. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  110. data/app/views/avo/actions/show.html.erb +9 -6
  111. data/app/views/avo/associations/new.html.erb +2 -2
  112. data/app/views/avo/base/index.html.erb +3 -2
  113. data/app/views/avo/base/new.html.erb +2 -1
  114. data/app/views/avo/base/preview.html.erb +19 -0
  115. data/app/views/avo/base/show.html.erb +1 -1
  116. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  117. data/app/views/avo/debug/report.html.erb +32 -17
  118. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  119. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  120. data/app/views/avo/partials/_footer.html.erb +1 -1
  121. data/app/views/avo/partials/_javascript.html.erb +5 -0
  122. data/app/views/avo/partials/_logo.html.erb +1 -1
  123. data/app/views/avo/partials/_navbar.html.erb +3 -5
  124. data/app/views/avo/partials/_table_header.html.erb +5 -11
  125. data/app/views/layouts/avo/application.html.erb +4 -2
  126. data/avo.gemspec +7 -7
  127. data/bin/dev +1 -1
  128. data/bin/prod +0 -0
  129. data/config/i18n-tasks.yml +1 -1
  130. data/config/initializers/pagy.rb +0 -2
  131. data/config/master.key +1 -0
  132. data/config/routes.rb +6 -10
  133. data/db/factories.rb +7 -1
  134. data/lib/avo/action_model.rb +20 -0
  135. data/lib/avo/asset_manager.rb +30 -0
  136. data/lib/avo/base_action.rb +57 -41
  137. data/lib/avo/base_resource.rb +263 -226
  138. data/lib/avo/base_resource_tool.rb +9 -16
  139. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  140. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  141. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  142. data/lib/avo/concerns/has_controls.rb +37 -0
  143. data/lib/avo/concerns/has_description.rb +23 -0
  144. data/lib/avo/concerns/has_item_type.rb +42 -0
  145. data/lib/avo/concerns/has_items.rb +325 -0
  146. data/lib/avo/concerns/is_resource_item.rb +24 -36
  147. data/lib/avo/concerns/is_visible.rb +15 -0
  148. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  149. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  150. data/lib/avo/configuration/branding.rb +0 -12
  151. data/lib/avo/configuration.rb +1 -37
  152. data/lib/avo/current.rb +39 -0
  153. data/lib/avo/dsl/field_parser.rb +1 -1
  154. data/lib/avo/dynamic_router.rb +18 -3
  155. data/lib/avo/engine.rb +35 -30
  156. data/lib/avo/error_manager.rb +25 -0
  157. data/lib/avo/execution_context.rb +10 -14
  158. data/lib/avo/fields/badge_field.rb +1 -1
  159. data/lib/avo/fields/base_field.rb +91 -105
  160. data/lib/avo/fields/belongs_to_field.rb +18 -22
  161. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  162. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  163. data/lib/avo/fields/concerns/has_default.rb +1 -5
  164. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  165. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  166. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  167. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  168. data/lib/avo/fields/concerns/is_required.rb +5 -7
  169. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  170. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  171. data/lib/avo/fields/country_field.rb +4 -0
  172. data/lib/avo/fields/date_time_field.rb +1 -5
  173. data/lib/avo/fields/field_manager.rb +55 -0
  174. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  175. data/lib/avo/fields/has_base_field.rb +12 -15
  176. data/lib/avo/fields/has_many_field.rb +5 -2
  177. data/lib/avo/fields/has_one_field.rb +6 -10
  178. data/lib/avo/fields/heading_field.rb +4 -1
  179. data/lib/avo/fields/hidden_field.rb +1 -1
  180. data/lib/avo/fields/id_field.rb +1 -1
  181. data/lib/avo/fields/location_field.rb +8 -8
  182. data/lib/avo/fields/password_field.rb +1 -1
  183. data/lib/avo/fields/preview_field.rb +14 -0
  184. data/lib/avo/fields/select_field.rb +12 -8
  185. data/lib/avo/fields/status_field.rb +4 -0
  186. data/lib/avo/filters/base_filter.rb +8 -4
  187. data/lib/avo/html/builder.rb +7 -8
  188. data/lib/avo/item_grapher.rb +78 -0
  189. data/lib/avo/licensing/h_q.rb +7 -66
  190. data/lib/avo/licensing/license.rb +1 -1
  191. data/lib/avo/licensing/pro_license.rb +1 -7
  192. data/lib/avo/loaders/fields_loader.rb +7 -1
  193. data/lib/avo/plugin.rb +16 -0
  194. data/lib/avo/plugin_manager.rb +56 -0
  195. data/lib/avo/prefixed_test_helpers.rb +20 -0
  196. data/lib/avo/reloader.rb +3 -0
  197. data/lib/avo/resources/controls/actions_list.rb +7 -12
  198. data/lib/avo/resources/controls/attach_button.rb +15 -0
  199. data/lib/avo/resources/controls/back_button.rb +1 -1
  200. data/lib/avo/resources/controls/base_control.rb +15 -49
  201. data/lib/avo/resources/controls/create_button.rb +15 -0
  202. data/lib/avo/resources/controls/delete_button.rb +5 -1
  203. data/lib/avo/resources/controls/detach_button.rb +4 -1
  204. data/lib/avo/resources/controls/edit_button.rb +4 -1
  205. data/lib/avo/resources/controls/order_controls.rb +8 -0
  206. data/lib/avo/resources/controls/save_button.rb +13 -0
  207. data/lib/avo/resources/controls/show_button.rb +15 -0
  208. data/lib/avo/resources/items/holder.rb +84 -0
  209. data/lib/avo/resources/items/item_group.rb +49 -0
  210. data/lib/avo/resources/items/main_panel.rb +2 -0
  211. data/lib/avo/resources/items/panel.rb +2 -0
  212. data/lib/avo/resources/items/row.rb +54 -0
  213. data/lib/avo/resources/items/sidebar.rb +47 -0
  214. data/lib/avo/resources/items/tab.rb +60 -0
  215. data/lib/avo/resources/items/tab_group.rb +68 -0
  216. data/lib/avo/resources/resource_manager.rb +174 -0
  217. data/lib/avo/services/authorization_service.rb +11 -110
  218. data/lib/avo/services/debug_service.rb +93 -0
  219. data/lib/avo/services/telemetry_service.rb +85 -0
  220. data/lib/avo/test_helpers.rb +362 -0
  221. data/lib/avo/tools/tool_manager.rb +30 -0
  222. data/lib/avo/version.rb +1 -1
  223. data/lib/avo.rb +115 -24
  224. data/lib/generators/avo/action_generator.rb +8 -8
  225. data/lib/generators/avo/card_generator.rb +27 -0
  226. data/lib/generators/avo/filter_generator.rb +8 -8
  227. data/lib/generators/avo/resource_generator.rb +4 -4
  228. data/lib/generators/avo/scope_generator.rb +15 -0
  229. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  230. data/lib/generators/avo/templates/action.tt +8 -6
  231. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  232. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  233. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  234. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  235. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  236. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  237. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  238. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  239. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  240. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  241. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  242. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  243. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  244. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  245. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  246. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  247. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  248. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  249. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  250. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  251. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  252. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  253. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  254. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  255. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  256. data/lib/generators/avo/templates/scope.tt +6 -0
  257. data/lib/generators/avo/templates/tool/view.tt +2 -2
  258. data/lib/tasks/avo_tasks.rake +27 -0
  259. data/public/avo-assets/avo.base.css +1810 -1189
  260. data/public/avo-assets/avo.base.js +217 -305
  261. data/public/avo-assets/avo.base.js.map +3 -3
  262. data/public/avo-assets/avo.css +9744 -0
  263. data/public/avo-assets/avo.js +513 -0
  264. data/public/avo-assets/avo.js.map +7 -0
  265. metadata +96 -137
  266. data/app/assets/stylesheets/css/tags.css +0 -32
  267. data/app/components/avo/card_component.html.erb +0 -46
  268. data/app/components/avo/card_component.rb +0 -25
  269. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  270. data/app/components/avo/dashboards/divider_component.rb +0 -19
  271. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  272. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  273. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  274. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  275. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  276. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  277. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  278. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  279. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  280. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  281. data/app/components/avo/index/ordering/base_component.rb +0 -9
  282. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  283. data/app/components/avo/index/ordering/button_component.rb +0 -23
  284. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  285. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  286. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  287. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  288. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  289. data/app/controllers/avo/dashboards_controller.rb +0 -22
  290. data/app/controllers/avo/reorder_controller.rb +0 -25
  291. data/app/javascript/js/controllers/base_controller.js +0 -22
  292. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  293. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  294. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  295. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  296. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  297. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  298. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  299. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  300. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  301. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  302. data/app/views/avo/dashboards/show.html.erb +0 -38
  303. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  304. data/app/views/avo/partials/_global_search.html.erb +0 -19
  305. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  306. data/lib/avo/app.rb +0 -237
  307. data/lib/avo/base_card.rb +0 -161
  308. data/lib/avo/concerns/fetches_things.rb +0 -150
  309. data/lib/avo/concerns/handles_field_args.rb +0 -47
  310. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  311. data/lib/avo/concerns/has_fields.rb +0 -334
  312. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  313. data/lib/avo/concerns/pagination.rb +0 -53
  314. data/lib/avo/concerns/policy_helpers.rb +0 -31
  315. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  316. data/lib/avo/concerns/visible_items.rb +0 -51
  317. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  318. data/lib/avo/dashboards/base_divider.rb +0 -35
  319. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  320. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  321. data/lib/avo/dashboards/metric_card.rb +0 -9
  322. data/lib/avo/dashboards/partial_card.rb +0 -7
  323. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  324. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  325. data/lib/avo/fields/tags_field.rb +0 -102
  326. data/lib/avo/grid_collector.rb +0 -42
  327. data/lib/avo/hosts/association_scope_host.rb +0 -8
  328. data/lib/avo/hosts/base_host.rb +0 -25
  329. data/lib/avo/hosts/card_visibility.rb +0 -20
  330. data/lib/avo/hosts/dashboard_card.rb +0 -22
  331. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  332. data/lib/avo/hosts/ordering.rb +0 -22
  333. data/lib/avo/hosts/record_host.rb +0 -7
  334. data/lib/avo/hosts/resource_record_host.rb +0 -7
  335. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  336. data/lib/avo/hosts/search_scope_host.rb +0 -7
  337. data/lib/avo/hosts/view_record_host.rb +0 -7
  338. data/lib/avo/hosts/visibility_host.rb +0 -12
  339. data/lib/avo/items_holder.rb +0 -96
  340. data/lib/avo/main_panel.rb +0 -3
  341. data/lib/avo/menu/base_item.rb +0 -25
  342. data/lib/avo/menu/builder.rb +0 -82
  343. data/lib/avo/menu/dashboard.rb +0 -22
  344. data/lib/avo/menu/group.rb +0 -2
  345. data/lib/avo/menu/link.rb +0 -6
  346. data/lib/avo/menu/menu.rb +0 -2
  347. data/lib/avo/menu/resource.rb +0 -22
  348. data/lib/avo/menu/section.rb +0 -2
  349. data/lib/avo/panel.rb +0 -24
  350. data/lib/avo/panel_builder.rb +0 -25
  351. data/lib/avo/resources/controls/action.rb +0 -38
  352. data/lib/avo/resources/controls/execution_context.rb +0 -58
  353. data/lib/avo/resources/controls/items_holder.rb +0 -19
  354. data/lib/avo/resources/controls/link_to.rb +0 -27
  355. data/lib/avo/row.rb +0 -26
  356. data/lib/avo/row_builder.rb +0 -24
  357. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  358. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  359. data/lib/avo/sidebar.rb +0 -30
  360. data/lib/avo/sidebar_builder.rb +0 -24
  361. data/lib/avo/tab.rb +0 -72
  362. data/lib/avo/tab_builder.rb +0 -25
  363. data/lib/avo/tab_group.rb +0 -42
  364. data/lib/avo/tab_group_builder.rb +0 -43
  365. data/lib/avo/tools_manager.rb +0 -11
  366. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  367. data/lib/generators/avo/card/metric_generator.rb +0 -18
  368. data/lib/generators/avo/card/partial_generator.rb +0 -19
  369. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  370. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  371. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -2,9 +2,9 @@
2
2
 
3
3
  class Avo::ActionsComponent < ViewComponent::Base
4
4
  include Avo::ApplicationHelper
5
- attr_reader :label
5
+ attr_reader :label, :size, :as_row_control
6
6
 
7
- def initialize(actions: [], resource: nil, view: nil, exclude: [], include: [], style: :outline, color: :primary, label: nil)
7
+ def initialize(actions: [], resource: nil, view: nil, exclude: [], include: [], style: :outline, color: :primary, label: nil, size: :md, as_row_control: false)
8
8
  @actions = actions || []
9
9
  @resource = resource
10
10
  @view = view
@@ -13,6 +13,8 @@ class Avo::ActionsComponent < ViewComponent::Base
13
13
  @color = color
14
14
  @style = style
15
15
  @label = label || I18n.t("avo.actions")
16
+ @size = size
17
+ @as_row_control = as_row_control
16
18
  end
17
19
 
18
20
  def render?
@@ -30,20 +32,21 @@ class Avo::ActionsComponent < ViewComponent::Base
30
32
  end
31
33
 
32
34
  # When running an action for one record we should do it on a special path.
33
- # We do that so we get the `model` param inside the action so we can prefill fields.
34
- def action_path(id)
35
- return many_records_path(id) unless @resource.has_model_id?
35
+ # We do that so we get the `record` param inside the action so we can prefill fields.
36
+ def action_path(action)
37
+ return single_record_path(action) if as_row_control
38
+ return many_records_path(action) unless @resource.has_record_id?
36
39
 
37
40
  if on_record_page?
38
- single_record_path id
41
+ single_record_path action
39
42
  else
40
- many_records_path id
43
+ many_records_path action
41
44
  end
42
45
  end
43
46
 
44
47
  # How should the action be displayed by default
45
48
  def is_disabled?(action)
46
- return false if action.standalone
49
+ return false if action.standalone || as_row_control
47
50
 
48
51
  on_index_page?
49
52
  end
@@ -58,17 +61,34 @@ class Avo::ActionsComponent < ViewComponent::Base
58
61
  !on_record_page?
59
62
  end
60
63
 
61
- def single_record_path(id)
62
- Avo::Services::URIService.parse(@resource.record_path)
63
- .append_paths("actions")
64
- .append_query("action_id": id)
65
- .to_s
64
+ def single_record_path(action)
65
+ action_url(action, @resource.record_path)
66
+ end
67
+
68
+ def many_records_path(action)
69
+ action_url(action, @resource.records_path)
66
70
  end
67
71
 
68
- def many_records_path(id)
69
- Avo::Services::URIService.parse(@resource.records_path)
72
+ def action_url(action, path)
73
+ Avo::Services::URIService.parse(path)
70
74
  .append_paths("actions")
71
- .append_query("action_id": id)
72
- .to_s
75
+ .append_query(
76
+ {
77
+ action_id: action.param_id,
78
+ arguments: encrypted_arguments(action)
79
+ }.compact
80
+ ).to_s
81
+ end
82
+
83
+ # Encrypt the arguments so we can pass them as a query param.
84
+ # EncryptionService can generate special characters that can break the URL.
85
+ # We use Base64 to encode the encrypted string so we can safely pass it as a query param and don't break the URL.
86
+ def encrypted_arguments(action)
87
+ return if action.arguments.blank?
88
+
89
+ Base64.encode64 Avo::Services::EncryptionService.encrypt(
90
+ message: action.arguments,
91
+ purpose: :action_arguments
92
+ )
73
93
  end
74
94
  end
@@ -0,0 +1,3 @@
1
+ <% javascripts.each do |path| %>
2
+ <%= javascript_include_tag path, "data-turbo-track": "reload", defer: true %>
3
+ <% end %>
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Avo::AssetManager::JavascriptComponent < ViewComponent::Base
4
+ attr_reader :asset_manager
5
+
6
+ def initialize(asset_manager:)
7
+ @asset_manager = asset_manager
8
+ end
9
+
10
+ def javascripts
11
+ asset_manager.javascripts
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ <% stylesheets.each do |path| %>
2
+ <%= stylesheet_link_tag path, "data-turbo-track": "reload", defer: true %>
3
+ <% end %>
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Avo::AssetManager::StylesheetComponent < ViewComponent::Base
4
+ attr_reader :asset_manager
5
+
6
+ def initialize(asset_manager:)
7
+ @asset_manager = asset_manager
8
+ end
9
+
10
+ def stylesheets
11
+ asset_manager.stylesheets
12
+ end
13
+ end
@@ -4,7 +4,7 @@ class Avo::BaseComponent < ViewComponent::Base
4
4
  include Turbo::FramesHelper
5
5
 
6
6
  def has_with_trial(ability)
7
- ::Avo::App.license.has_with_trial(ability)
7
+ Avo.license.has_with_trial(ability)
8
8
  end
9
9
 
10
10
  private
@@ -16,39 +16,42 @@ class Avo::BaseComponent < ViewComponent::Base
16
16
  nil
17
17
  end
18
18
 
19
- # Fetch the resource and hydrate it with the model
19
+ # Fetch the resource and hydrate it with the record
20
20
  def association_resource
21
- resource = ::Avo::App.get_resource(params[:via_resource_class])
22
- model_class_name = params[:via_relation_class] || resource.model_class
21
+ resource = Avo.resource_manager.get_resource(params[:via_resource_class])
23
22
 
24
- model_klass = ::Avo::BaseResource.valid_model_class model_class_name
23
+ model_class = if params[:via_relation_class].present?
24
+ ::Avo::BaseResource.get_model_by_name params[:via_relation_class]
25
+ else
26
+ resource.model_class
27
+ end
25
28
 
26
- resource = ::Avo::App.get_resource_by_model_name model_klass if resource.blank?
29
+ resource = Avo.resource_manager.get_resource_by_model_class model_class if resource.blank?
27
30
 
28
- model = resource.find_record params[:via_resource_id], query: model_klass, params: params
31
+ record = resource.find_record params[:via_record_id], query: model_class, params: params
29
32
 
30
- resource.dup.hydrate model: model
33
+ resource.new record: record
31
34
  end
32
35
 
33
36
  # Get the resource for the resource using the klass attribute so we get the namespace too
34
37
  def reflection_resource
35
- ::Avo::App.get_resource_by_model_name(@reflection.klass.to_s)
38
+ Avo.resource_manager.get_resource_by_model_class(@reflection.klass.to_s)
36
39
  rescue
37
40
  nil
38
41
  end
39
42
 
40
43
  # Get the resource for the resource using the klass attribute so we get the namespace too
41
44
  def reflection_parent_resource
42
- ::Avo::App.get_resource_by_model_name(@reflection.active_record.to_s)
45
+ Avo.resource_manager.get_resource_by_model_class(@reflection.active_record.to_s)
43
46
  rescue
44
47
  nil
45
48
  end
46
49
 
47
50
  def parent_or_child_resource
48
51
  return @resource unless link_to_child_resource_is_enabled?
49
- return @resource if @resource.model.class.base_class == @resource.model.class
52
+ return @resource if @resource.record.class.base_class == @resource.record.class
50
53
 
51
- ::Avo::App.get_resource_by_model_name(@resource.model.class).dup || @resource
54
+ Avo.resource_manager.get_resource_by_model_class(@resource.record.class) || @resource
52
55
  end
53
56
 
54
57
  def link_to_child_resource_is_enabled?
@@ -40,7 +40,10 @@ class Avo::ButtonComponent < ViewComponent::Base
40
40
  end
41
41
 
42
42
  def button_classes
43
- classes = "button-component inline-flex flex-grow-0 items-center font-semibold leading-6 fill-current whitespace-nowrap transition duration-100 transform transition duration-100 cursor-pointer disabled:cursor-not-allowed disabled:opacity-70 border justify-center active:outline active:outline-1 #{@class}"
43
+ classes = "button-component inline-flex flex-grow-0 items-center font-semibold leading-6 fill-current whitespace-nowrap transition duration-100 transform transition duration-100 cursor-pointer disabled:cursor-not-allowed disabled:opacity-70 justify-center #{@class}"
44
+
45
+ # For non-icon-styled buttons we should not add borders.
46
+ classes += " border active:outline active:outline-1" unless is_icon?
44
47
 
45
48
  classes += " rounded" if @rounded.present?
46
49
  classes += style_classes
@@ -55,18 +58,26 @@ class Avo::ButtonComponent < ViewComponent::Base
55
58
  @is_link
56
59
  end
57
60
 
61
+ def is_icon?
62
+ @style == :icon
63
+ end
64
+
65
+ def is_not_icon?
66
+ !is_icon?
67
+ end
68
+
58
69
  def full_content
59
70
  result = ""
60
71
  icon_classes = @icon_class
61
72
  # space out the icon from the text if text is present
62
- icon_classes += " mr-1" if content.present?
73
+ icon_classes += " mr-1" if content.present? && is_not_icon?
63
74
  # add the icon height
64
75
  icon_classes += icon_size_classes
65
76
 
66
77
  # Add the icon
67
78
  result += helpers.svg(@icon, class: icon_classes) if @icon.present?
68
79
 
69
- if content.present?
80
+ if is_not_icon? && content.present?
70
81
  result += "<span>#{content}</span>"
71
82
  end
72
83
 
@@ -102,6 +113,8 @@ class Avo::ButtonComponent < ViewComponent::Base
102
113
  private
103
114
 
104
115
  def vertical_padding_classes
116
+ return " py-0" if is_icon?
117
+
105
118
  case @size.to_sym
106
119
  when :xs
107
120
  " py-0"
@@ -119,6 +132,7 @@ class Avo::ButtonComponent < ViewComponent::Base
119
132
  end
120
133
 
121
134
  def horizontal_padding_classes
135
+ return " px-0" if is_icon?
122
136
  return " px-1" if @compact
123
137
 
124
138
  case @size.to_sym
@@ -154,6 +168,8 @@ class Avo::ButtonComponent < ViewComponent::Base
154
168
  " bg-white text-#{@color}-500 border-#{@color}-500 hover:bg-#{@color}-100 active:bg-#{@color}-100 active:border-#{@color}-500 active:outline-#{@color}-500"
155
169
  when :text
156
170
  " text-#{@color}-500 active:outline-#{@color}-500 hover:bg-gray-100 border-transparent"
171
+ when :icon
172
+ " text-#{@color}-600"
157
173
  else
158
174
  ""
159
175
  end
@@ -161,6 +177,7 @@ class Avo::ButtonComponent < ViewComponent::Base
161
177
 
162
178
  def icon_size_classes
163
179
  icon_classes = ""
180
+ return icon_classes if is_icon?
164
181
 
165
182
  case @size
166
183
  when :xs
@@ -21,6 +21,6 @@ class Avo::EmptyStateComponent < ViewComponent::Base
21
21
  private
22
22
 
23
23
  def locale_message
24
- helpers.t by_association ? 'avo.no_related_item_found' : 'avo.no_item_found'
24
+ helpers.t by_association ? "avo.no_related_item_found" : "avo.no_item_found"
25
25
  end
26
26
  end
@@ -2,7 +2,7 @@
2
2
  class: classes,
3
3
  style: style,
4
4
  data: data do %>
5
- <div class="h-full <% if stacked? %> md:pt-4 <% else %> md:pt-0 md:h-14 <% end %> pt-4 flex self-start items-center flex-shrink-0 <%= @field.get_html(:classes, view: view, element: :label) %> w-48 <% if compact? %> md:w-48 xl:w-64 <% else %> md:w-64 <% end %> px-6 uppercase font-semibold text-gray-500 text-sm" data-slot="label">
5
+ <div class="h-full <% if stacked? %> md:pt-4 <% else %> md:pt-0 <% if short? %> md:h-10 <% else %> md:h-14 <% end %> <% end %> pt-4 flex self-start items-center flex-shrink-0 <%= @field.get_html(:classes, view: view, element: :label) %> w-48 <% if compact? %> md:w-48 xl:w-64 <% else %> md:w-64 <% end %> px-6 uppercase font-semibold text-gray-500 text-sm" data-slot="label">
6
6
  <% if form.present? %>
7
7
  <%= form.label field.id, label %>
8
8
  <% else %>
@@ -19,6 +19,7 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
19
19
  full_width: false,
20
20
  label: nil, # do we really need it?
21
21
  resource: nil,
22
+ short: false,
22
23
  stacked: nil,
23
24
  style: "",
24
25
  view: :show,
@@ -35,6 +36,7 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
35
36
  @full_width = full_width
36
37
  @label = label
37
38
  @resource = resource
39
+ @short = short
38
40
  @stacked = stacked
39
41
  @style = style
40
42
  @view = view
@@ -61,17 +63,11 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
61
63
  end
62
64
 
63
65
  def help
64
- help_value = @help || @field.help
65
-
66
- if help_value.respond_to?(:call)
67
- return Avo::Hosts::ResourceViewRecordHost.new(block: help_value, record: record, resource: resource, view: view).handle
68
- end
69
-
70
- help_value
66
+ Avo::ExecutionContext.new(target: @help || @field.help, record: record, resource: resource, view: view).handle
71
67
  end
72
68
 
73
69
  def record
74
- resource.present? ? resource.model : nil
70
+ resource.present? ? resource.record : nil
75
71
  end
76
72
 
77
73
  def data
@@ -112,6 +108,10 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
112
108
  @compact
113
109
  end
114
110
 
111
+ def short?
112
+ @short
113
+ end
114
+
115
115
  def full_width?
116
116
  @full_width
117
117
  end
@@ -1,7 +1,7 @@
1
1
  <%= field_wrapper **field_wrapper_args do %>
2
- <%= @form.text_field @field.id,
2
+ <%= @form.text_field field.id,
3
3
  value: field.value.to_s,
4
4
  class: classes("w-full"),
5
- placeholder: @field.placeholder,
5
+ placeholder: field.placeholder,
6
6
  disabled: disabled? %>
7
7
  <% end %>
@@ -1,137 +1,115 @@
1
- <div data-controller="reload-belongs-to-field"
2
- data-action="turbo:before-stream-render@document->reload-belongs-to-field#beforeStreamRender"
3
- data-reload-belongs-to-field-polymorphic-value="<%= is_polymorphic? %>"
4
- data-reload-belongs-to-field-searchable-value="<%= @field.searchable %>"
5
- data-reload-belongs-to-field-relation-name-value="<%= @field.id %>"
6
- data-reload-belongs-to-field-target-name-value="<%= form.object_name %>[<%= @field.id_input_foreign_key %>]"
7
- >
8
- <% if is_polymorphic? %>
9
- <%
10
- # Set the model keys so we can pass them over
11
- model_keys = @field.types.map do |type|
12
- resource = Avo::App.get_resource_by_model_name(type.to_s)
13
- [type.to_s, resource.model_key]
14
- end.to_h
15
- %>
16
- <div class="divide-y"
17
- data-controller="belongs-to-field"
18
- data-searchable="<%= @field.searchable %>"
19
- data-association="<%= @field.id %>"
20
- data-association-class="<%= @field&.target_resource&.model_class || nil %>"
21
- >
22
- <%= field_wrapper **field_wrapper_args, help: @field.polymorphic_help || '' do %>
23
- <%= @form.select @field.type_input_foreign_key, @field.types.map { |type| [::Avo::App.get_resource_by_model_name(type.to_s).name, type.to_s] },
24
- {
25
- value: @field.value,
26
- include_blank: @field.placeholder,
1
+ <% if is_polymorphic? %>
2
+ <%
3
+ # Set the model keys so we can pass them over
4
+ model_keys = @field.types.map do |type|
5
+ resource = Avo.resource_manager.get_resource_by_model_class(type.to_s)
6
+ [type.to_s, resource.model_key]
7
+ end.to_h
8
+ %>
9
+ <div class="divide-y"
10
+ data-controller="belongs-to-field"
11
+ data-searchable="<%= @field.is_searchable? %>"
12
+ data-association="<%= @field.id %>"
13
+ data-association-class="<%= @field&.target_resource&.model_class || nil %>"
14
+ >
15
+ <%= field_wrapper **field_wrapper_args, help: @field.polymorphic_help || '' do %>
16
+ <%= @form.select @field.type_input_foreign_key, @field.types.map { |type| [Avo.resource_manager.get_resource_by_model_class(type.to_s).name, type.to_s] },
17
+ {
18
+ value: @field.value,
19
+ include_blank: @field.placeholder,
20
+ },
21
+ {
22
+ class: classes("w-full"),
23
+ data: {
24
+ **@field.get_html(:data, view: view, element: :input),
25
+ action: "change->belongs-to-field#changeType #{field_html_action}",
26
+ 'belongs-to-field-target': "select",
27
27
  },
28
- {
29
- class: classes("w-full"),
30
- data: {
31
- **@field.get_html(:data, view: view, element: :input),
32
- action: "change->belongs-to-field#changeType #{field_html_action}",
33
- 'belongs-to-field-target': "select",
34
- },
35
- disabled: disabled
36
- }
37
- %>
38
- <%
39
- # If the select field is disabled, no value will be sent. It's how HTML works.
40
- # Thus the extra hidden field to actually send the related id to the server.
41
- if disabled %>
42
- <%= @form.hidden_field @field.type_input_foreign_key %>
43
- <% end %>
44
- <% end %>
45
- <% @field.types.each do |type| %>
46
- <div class="hidden"
47
- data-belongs-to-field-target="type"
48
- data-type="<%= type %>"
49
- >
50
- <%= field_wrapper **field_wrapper_args, label: ::Avo::App.get_resource_by_model_name(type.to_s).name do %>
51
- <div class="flex flex-col gap-1">
52
- <% if @field.searchable %>
53
- <%= render Avo::Fields::BelongsToField::AutocompleteComponent.new form: @form,
54
- disabled: disabled,
55
- field: @field,
56
- foreign_key: @field.id_input_foreign_key,
57
- model_key: model_keys[type.to_s],
58
- polymorphic_record: polymorphic_record,
59
- resource: @resource,
60
- style: @field.get_html(:style, view: view, element: :input),
61
- type: type,
62
- classes: classes("w-full"),
63
- view: view
64
- %>
65
- <% else %>
66
- <%= @form.select @field.id_input_foreign_key,
67
- options_for_select(@field.values_for_type(type), @resource.present? && @resource.model.present? ? @resource.model[@field.id_input_foreign_key] : nil),
68
- {
69
- value: @resource.model[@field.id_input_foreign_key].to_s,
70
- include_blank: @field.placeholder,
71
- },
72
- {
73
- class: classes("w-full"),
74
- data: @field.get_html(:data, view: view, element: :input),
75
- disabled: disabled
76
- }
77
- %>
78
- <%
79
- # If the select field is disabled, no value will be sent. It's how HTML works.
80
- # Thus the extra hidden field to actually send the related id to the server.
81
- if disabled %>
82
- <%= @form.hidden_field @field.id_input_foreign_key %>
83
- <% end %>
84
- <% end %>
85
- <% create_href = create_path(::Avo::App.get_resource_by_model_name(type.to_s)) %>
86
- <% if !disabled && create_href.present? %>
87
- <%= link_to t("avo.create_new_item", item: type.to_s.downcase),
88
- create_href,
89
- class: "text-sm"
90
- %>
91
- <% end %>
92
- </div>
93
- <% end %>
94
- </div>
28
+ disabled: disabled
29
+ }
30
+ %>
31
+ <%
32
+ # If the select field is disabled, no value will be sent. It's how HTML works.
33
+ # Thus the extra hidden field to actually send the related id to the server.
34
+ if disabled %>
35
+ <%= @form.hidden_field @field.type_input_foreign_key %>
95
36
  <% end %>
96
- </div>
97
- <% else %>
98
- <%= field_wrapper **field_wrapper_args do %>
99
- <div class="flex flex-col gap-1">
100
- <% if @field.searchable %>
101
- <%= render Avo::Fields::BelongsToField::AutocompleteComponent.new form: @form,
102
- field: @field,
103
- model_key: @field.target_resource&.model_key,
104
- foreign_key: @field.id_input_foreign_key,
105
- resource: @resource,
106
- disabled: disabled,
107
- classes: classes("w-full"),
108
- view: view,
109
- style: @field.get_html(:style, view: view, element: :input)
37
+ <% end %>
38
+ <% @field.types.each do |type| %>
39
+ <div class="hidden"
40
+ data-belongs-to-field-target="type"
41
+ data-type="<%= type %>"
42
+ >
43
+ <%= field_wrapper **field_wrapper_args, label: Avo.resource_manager.get_resource_by_model_class(type.to_s).name do %>
44
+ <% if @field.is_searchable? %>
45
+ <%= render Avo::Pro::SearchableAssociations::AutocompleteComponent.new form: @form,
46
+ disabled: disabled,
47
+ field: @field,
48
+ foreign_key: @field.id_input_foreign_key,
49
+ model_key: model_keys[type.to_s],
50
+ polymorphic_record: polymorphic_record,
51
+ resource: @resource,
52
+ style: @field.get_html(:style, view: view, element: :input),
53
+ type: type,
54
+ classes: classes("w-full"),
55
+ view: view
110
56
  %>
111
- <% else %>
112
- <%= @form.select @field.id_input_foreign_key, @field.options,
57
+ <% else %>
58
+ <%= @form.select @field.id_input_foreign_key,
59
+ options_for_select(@field.values_for_type(type), @resource.present? && @resource.record.present? ? @resource.record[@field.id_input_foreign_key] : nil),
113
60
  {
61
+ value: @resource.record[@field.id_input_foreign_key].to_s,
114
62
  include_blank: @field.placeholder,
115
- value: @field.value
116
63
  },
117
64
  {
118
65
  class: classes("w-full"),
119
66
  data: @field.get_html(:data, view: view, element: :input),
120
- disabled: disabled,
121
- style: @field.get_html(:style, view: view, element: :input)
67
+ disabled: disabled
122
68
  }
123
69
  %>
124
- <%
70
+ <%
125
71
  # If the select field is disabled, no value will be sent. It's how HTML works.
126
72
  # Thus the extra hidden field to actually send the related id to the server.
127
73
  if disabled %>
128
- <%= @form.hidden_field @field.id_input_foreign_key %>
74
+ <%= @form.hidden_field @field.id_input_foreign_key %>
75
+ <% end %>
129
76
  <% end %>
130
77
  <% end %>
131
- <% if !disabled && create_path.present? %>
132
- <%= link_to t("avo.create_new_item", item: @field.name.downcase), create_path, class: "text-sm" %>
133
- <% end %>
134
78
  </div>
135
79
  <% end %>
80
+ </div>
81
+ <% else %>
82
+ <%= field_wrapper **field_wrapper_args do %>
83
+ <% if @field.is_searchable? %>
84
+ <%= render Avo::Pro::SearchableAssociations::AutocompleteComponent.new form: @form,
85
+ field: @field,
86
+ model_key: @field.target_resource&.model_key,
87
+ foreign_key: @field.id_input_foreign_key,
88
+ resource: @resource,
89
+ disabled: disabled,
90
+ classes: classes("w-full"),
91
+ view: view,
92
+ style: @field.get_html(:style, view: view, element: :input)
93
+ %>
94
+ <% else %>
95
+ <%= @form.select @field.id_input_foreign_key, @field.options,
96
+ {
97
+ include_blank: @field.placeholder,
98
+ value: @field.value
99
+ },
100
+ {
101
+ class: classes("w-full"),
102
+ data: @field.get_html(:data, view: view, element: :input),
103
+ disabled: disabled,
104
+ style: @field.get_html(:style, view: view, element: :input)
105
+ }
106
+ %>
107
+ <%
108
+ # If the select field is disabled, no value will be sent. It's how HTML works.
109
+ # Thus the extra hidden field to actually send the related id to the server.
110
+ if disabled %>
111
+ <%= @form.hidden_field @field.id_input_foreign_key %>
112
+ <% end %>
113
+ <% end %>
136
114
  <% end %>
137
- </div>
115
+ <% end %>
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Fields::BelongsToField::EditComponent < Avo::Fields::EditComponent
4
- def initialize(**args)
5
- super(**args)
4
+ def initialize(...)
5
+ super(...)
6
6
 
7
7
  @polymorphic_record = nil
8
8
  end
@@ -28,16 +28,16 @@ class Avo::Fields::BelongsToField::EditComponent < Avo::Fields::EditComponent
28
28
 
29
29
  # Get the polymorphic class
30
30
  def polymorphic_class
31
- @resource.model["#{@field.foreign_key}_type"]
31
+ @resource.record["#{@field.foreign_key}_type"]
32
32
  end
33
33
 
34
34
  def polymorphic_resource
35
- ::Avo::App.get_resource_by_model_name(polymorphic_class)
35
+ Avo.resource_manager.get_resource_by_model_class(polymorphic_class)
36
36
  end
37
37
 
38
38
  # Get the polymorphic id
39
39
  def polymorphic_id
40
- @resource.model["#{@field.foreign_key}_id"]
40
+ @resource.record["#{@field.foreign_key}_id"]
41
41
  end
42
42
 
43
43
  # Get the actual resource
@@ -57,20 +57,9 @@ class Avo::Fields::BelongsToField::EditComponent < Avo::Fields::EditComponent
57
57
  @field.get_html(:data, view: view, element: :input).fetch(:action, nil)
58
58
  end
59
59
 
60
- def create_path(target_resource = nil)
61
- return nil if @resource.blank?
62
-
63
- helpers.new_resource_path(**{
64
- via_relation: @field.id.to_s,
65
- resource: target_resource || @field.target_resource,
66
- via_resource_id: resource.model.to_param,
67
- via_belongs_to_resource_class: resource.class.name
68
- }.compact)
69
- end
70
-
71
60
  private
72
61
 
73
62
  def visit_through_association?
74
- @field.target_resource.class.to_s == params[:via_resource_class].to_s
63
+ @field.target_resource.to_s == params[:via_resource_class].to_s
75
64
  end
76
65
  end
@@ -1,4 +1,4 @@
1
1
  <%= index_field_wrapper **field_wrapper_args do %>
2
- <%= link_to @field.label, helpers.resource_view_path(model: @field.value, resource: @field.target_resource)
2
+ <%= link_to @field.label, helpers.resource_view_path(record: @field.value, resource: @field.target_resource)
3
3
  %>
4
4
  <% end %>
@@ -3,10 +3,10 @@
3
3
  class Avo::Fields::BelongsToField::ShowComponent < Avo::Fields::ShowComponent
4
4
  def resource_view_path
5
5
  helpers.resource_view_path(
6
- model: @field.value,
6
+ record: @field.value,
7
7
  resource: @field.target_resource,
8
8
  via_resource_class: @resource.class.to_s,
9
- via_resource_id: @resource.model.to_param
9
+ via_record_id: @resource.record.to_param
10
10
  )
11
11
  end
12
12
  end
@@ -3,7 +3,7 @@
3
3
  <%= @form.check_box @field.id,
4
4
  value: @field.value,
5
5
  checked: @field.value,
6
- class: "text-lg h-4 w-4 checked:bg-primary-400 focus:checked:!bg-primary-400 #{@field.get_html(:classes, view: view, element: :input)}",
6
+ class: "text-lg h-4 w-4 checked:bg-primary-400 focus:checked:!bg-primary-400 rounded #{@field.get_html(:classes, view: view, element: :input)}",
7
7
  data: @field.get_html(:data, view: view, element: :input),
8
8
  disabled: disabled?,
9
9
  style: @field.get_html(:style, view: view, element: :input)