avo 2.46.0 → 3.0.0.pre2

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

Potentially problematic release.


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

Files changed (417) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +12 -23
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +12 -11
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -36
  167. data/lib/avo/base_resource.rb +108 -96
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  175. data/lib/avo/concerns/is_resource_item.rb +24 -36
  176. data/lib/avo/concerns/is_visible.rb +15 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +8 -45
  180. data/lib/avo/current.rb +5 -0
  181. data/lib/avo/dsl/field_parser.rb +1 -1
  182. data/lib/avo/dynamic_router.rb +6 -2
  183. data/lib/avo/engine.rb +37 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +9 -15
  186. data/lib/avo/fields/badge_field.rb +1 -1
  187. data/lib/avo/fields/base_field.rb +72 -124
  188. data/lib/avo/fields/belongs_to_field.rb +14 -25
  189. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  190. data/lib/avo/fields/concerns/has_default.rb +1 -5
  191. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  192. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  193. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  194. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  195. data/lib/avo/fields/concerns/is_required.rb +5 -7
  196. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/country_field.rb +4 -0
  199. data/lib/avo/fields/date_field.rb +3 -16
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/field_manager.rb +45 -0
  202. data/lib/avo/fields/file_field.rb +0 -2
  203. data/lib/avo/fields/files_field.rb +0 -6
  204. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  205. data/lib/avo/fields/has_base_field.rb +11 -14
  206. data/lib/avo/fields/has_many_field.rb +5 -2
  207. data/lib/avo/fields/has_one_field.rb +5 -10
  208. data/lib/avo/fields/heading_field.rb +4 -1
  209. data/lib/avo/fields/hidden_field.rb +1 -1
  210. data/lib/avo/fields/id_field.rb +2 -3
  211. data/lib/avo/fields/password_field.rb +1 -1
  212. data/lib/avo/fields/preview_field.rb +14 -0
  213. data/lib/avo/fields/select_field.rb +12 -8
  214. data/lib/avo/fields/status_field.rb +4 -0
  215. data/lib/avo/filters/base_filter.rb +3 -8
  216. data/lib/avo/grid_collector.rb +7 -9
  217. data/lib/avo/html/builder.rb +5 -8
  218. data/lib/avo/item_grapher.rb +78 -0
  219. data/lib/avo/licensing/h_q.rb +4 -68
  220. data/lib/avo/licensing/license.rb +2 -2
  221. data/lib/avo/licensing/license_manager.rb +1 -1
  222. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  223. data/lib/avo/licensing/pro_license.rb +1 -7
  224. data/lib/avo/plugin.rb +6 -0
  225. data/lib/avo/plugin_manager.rb +58 -0
  226. data/lib/avo/prefixed_test_helpers.rb +20 -0
  227. data/lib/avo/reloader.rb +3 -0
  228. data/lib/avo/resources/controls/actions_list.rb +6 -12
  229. data/lib/avo/resources/controls/attach_button.rb +15 -0
  230. data/lib/avo/resources/controls/back_button.rb +1 -1
  231. data/lib/avo/resources/controls/base_control.rb +15 -49
  232. data/lib/avo/resources/controls/create_button.rb +15 -0
  233. data/lib/avo/resources/controls/delete_button.rb +5 -1
  234. data/lib/avo/resources/controls/detach_button.rb +4 -1
  235. data/lib/avo/resources/controls/edit_button.rb +4 -1
  236. data/lib/avo/resources/controls/order_controls.rb +8 -0
  237. data/lib/avo/resources/controls/save_button.rb +13 -0
  238. data/lib/avo/resources/controls/show_button.rb +15 -0
  239. data/lib/avo/resources/items/holder.rb +76 -0
  240. data/lib/avo/resources/items/item_group.rb +48 -0
  241. data/lib/avo/resources/items/main_panel.rb +2 -0
  242. data/lib/avo/resources/items/panel.rb +2 -0
  243. data/lib/avo/resources/items/sidebar.rb +47 -0
  244. data/lib/avo/resources/items/tab.rb +60 -0
  245. data/lib/avo/resources/items/tab_group.rb +68 -0
  246. data/lib/avo/resources/resource_manager.rb +181 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +92 -0
  249. data/lib/avo/services/telemetry_service.rb +84 -0
  250. data/lib/avo/test_helpers.rb +362 -0
  251. data/lib/avo/tools/tool_manager.rb +30 -0
  252. data/lib/avo/version.rb +1 -1
  253. data/lib/avo.rb +7 -0
  254. data/lib/generators/avo/eject_generator.rb +0 -1
  255. data/lib/generators/avo/install_generator.rb +1 -11
  256. data/lib/generators/avo/resource_generator.rb +5 -23
  257. data/lib/generators/avo/scope_generator.rb +15 -0
  258. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  259. data/lib/generators/avo/templates/action.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  261. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  263. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  265. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  266. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  267. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  268. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  271. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  272. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  273. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  274. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  275. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  280. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  281. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  282. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  283. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  284. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  285. data/lib/generators/avo/templates/scope.tt +6 -0
  286. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  287. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  288. data/lib/generators/avo/templates/tool/view.tt +2 -2
  289. data/lib/tasks/avo_tasks.rake +22 -0
  290. metadata +82 -161
  291. data/app/assets/stylesheets/css/tags.css +0 -32
  292. data/app/assets/svgs/map-empty-state.svg +0 -35
  293. data/app/assets/svgs/map-view-type.svg +0 -3
  294. data/app/components/avo/card_component.html.erb +0 -46
  295. data/app/components/avo/card_component.rb +0 -25
  296. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  297. data/app/components/avo/dashboards/divider_component.rb +0 -19
  298. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  299. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  300. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  301. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  303. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  304. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  305. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  306. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  307. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  309. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  311. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  312. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  313. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  314. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  315. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  317. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  318. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  319. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  320. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  321. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  322. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  323. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  324. data/app/components/avo/index/ordering/base_component.rb +0 -9
  325. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  326. data/app/components/avo/index/ordering/button_component.rb +0 -23
  327. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  328. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  329. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  330. data/app/components/avo/index/resource_map_component.rb +0 -109
  331. data/app/components/avo/row_component.html.erb +0 -3
  332. data/app/components/avo/row_component.rb +0 -12
  333. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  334. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  335. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  336. data/app/controllers/avo/dashboards_controller.rb +0 -22
  337. data/app/controllers/avo/reorder_controller.rb +0 -25
  338. data/app/javascript/js/controllers/base_controller.js +0 -22
  339. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  340. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  341. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  342. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  343. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  344. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  345. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  346. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  347. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  348. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  349. data/app/views/avo/dashboards/show.html.erb +0 -38
  350. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  351. data/app/views/avo/partials/_global_search.html.erb +0 -19
  352. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  353. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  354. data/lib/avo/base_card.rb +0 -161
  355. data/lib/avo/concerns/fetches_things.rb +0 -150
  356. data/lib/avo/concerns/handles_field_args.rb +0 -47
  357. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  358. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  359. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  360. data/lib/avo/concerns/pagination.rb +0 -53
  361. data/lib/avo/concerns/policy_helpers.rb +0 -31
  362. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  363. data/lib/avo/concerns/visible_items.rb +0 -51
  364. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  365. data/lib/avo/dashboards/base_divider.rb +0 -35
  366. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  367. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  368. data/lib/avo/dashboards/metric_card.rb +0 -9
  369. data/lib/avo/dashboards/partial_card.rb +0 -7
  370. data/lib/avo/fields/area_field.rb +0 -39
  371. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  372. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  373. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  374. data/lib/avo/fields/location_field.rb +0 -86
  375. data/lib/avo/fields/tags_field.rb +0 -102
  376. data/lib/avo/hosts/association_scope_host.rb +0 -8
  377. data/lib/avo/hosts/base_host.rb +0 -25
  378. data/lib/avo/hosts/card_visibility.rb +0 -20
  379. data/lib/avo/hosts/dashboard_card.rb +0 -22
  380. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  381. data/lib/avo/hosts/ordering.rb +0 -22
  382. data/lib/avo/hosts/record_host.rb +0 -7
  383. data/lib/avo/hosts/resource_record_host.rb +0 -7
  384. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  385. data/lib/avo/hosts/search_scope_host.rb +0 -7
  386. data/lib/avo/hosts/view_record_host.rb +0 -7
  387. data/lib/avo/hosts/visibility_host.rb +0 -12
  388. data/lib/avo/items_holder.rb +0 -96
  389. data/lib/avo/main_panel.rb +0 -3
  390. data/lib/avo/menu/base_item.rb +0 -25
  391. data/lib/avo/menu/builder.rb +0 -82
  392. data/lib/avo/menu/dashboard.rb +0 -22
  393. data/lib/avo/menu/group.rb +0 -2
  394. data/lib/avo/menu/link.rb +0 -6
  395. data/lib/avo/menu/menu.rb +0 -2
  396. data/lib/avo/menu/resource.rb +0 -22
  397. data/lib/avo/menu/section.rb +0 -2
  398. data/lib/avo/panel.rb +0 -24
  399. data/lib/avo/panel_builder.rb +0 -25
  400. data/lib/avo/resources/controls/action.rb +0 -38
  401. data/lib/avo/resources/controls/execution_context.rb +0 -58
  402. data/lib/avo/resources/controls/items_holder.rb +0 -19
  403. data/lib/avo/resources/controls/link_to.rb +0 -27
  404. data/lib/avo/row.rb +0 -26
  405. data/lib/avo/row_builder.rb +0 -24
  406. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  407. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  408. data/lib/avo/sidebar.rb +0 -30
  409. data/lib/avo/sidebar_builder.rb +0 -24
  410. data/lib/avo/tab.rb +0 -72
  411. data/lib/avo/tab_builder.rb +0 -25
  412. data/lib/avo/tab_group.rb +0 -42
  413. data/lib/avo/tab_group_builder.rb +0 -43
  414. data/lib/avo/tools_manager.rb +0 -11
  415. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  416. data/public/avo-assets/avo.base.js +0 -1037
  417. data/public/avo-assets/avo.base.js.map +0 -7
@@ -2,10 +2,8 @@ module Avo
2
2
  class Configuration
3
3
  include ResourceConfiguration
4
4
 
5
- attr_writer :app_name
6
- attr_writer :branding
7
5
  attr_writer :root_path
8
- attr_writer :cache_store
6
+ attr_accessor :app_name
9
7
  attr_accessor :timezone
10
8
  attr_accessor :per_page
11
9
  attr_accessor :per_page_steps
@@ -38,13 +36,12 @@ module Avo
38
36
  attr_accessor :main_menu
39
37
  attr_accessor :profile_menu
40
38
  attr_accessor :model_resource_mapping
41
- attr_accessor :tabs_style
42
39
  attr_accessor :resource_default_view
43
40
  attr_accessor :authorization_client
44
41
  attr_accessor :field_wrapper_layout
45
42
  attr_accessor :sign_out_path_name
46
43
  attr_accessor :resources
47
- attr_accessor :prefix_path
44
+ attr_writer :branding
48
45
 
49
46
  def initialize
50
47
  @root_path = "/avo"
@@ -91,13 +88,10 @@ module Avo
91
88
  @main_menu = nil
92
89
  @profile_menu = nil
93
90
  @model_resource_mapping = {}
94
- @tabs_style = :tabs
95
91
  @resource_default_view = :show
96
92
  @authorization_client = :pundit
97
93
  @field_wrapper_layout = :inline
98
94
  @resources = nil
99
- @prefix_path = nil
100
- @cache_store = computed_cache_store
101
95
  end
102
96
 
103
97
  def current_user_method(&block)
@@ -121,8 +115,8 @@ module Avo
121
115
  end
122
116
 
123
117
  def namespace
124
- if Avo.configuration.root_path.present?
125
- Avo.configuration.root_path.delete "/"
118
+ if computed_root_path.present?
119
+ computed_root_path.delete "/"
126
120
  else
127
121
  root_path.delete "/"
128
122
  end
@@ -134,6 +128,10 @@ module Avo
134
128
  @root_path
135
129
  end
136
130
 
131
+ def computed_root_path
132
+ Avo.configuration.root_path
133
+ end
134
+
137
135
  def feature_enabled?(feature)
138
136
  !@disabled_features.map(&:to_sym).include?(feature.to_sym)
139
137
  end
@@ -141,41 +139,6 @@ module Avo
141
139
  def branding
142
140
  Avo::Configuration::Branding.new(**@branding || {})
143
141
  end
144
-
145
- def app_name
146
- if @app_name.respond_to? :call
147
- Avo::Hosts::BaseHost.new(block: @app_name).handle
148
- else
149
- @app_name
150
- end
151
- end
152
-
153
- def cache_store
154
- Avo::ExecutionContext.new(
155
- target: @cache_store,
156
- production_rejected_cache_stores: %w[ActiveSupport::Cache::MemoryStore ActiveSupport::Cache::NullStore]
157
- ).handle
158
- end
159
-
160
- # When not in production or test we'll just use the MemoryStore which is good enough.
161
- # When running in production we'll use Rails.cache if it's not ActiveSupport::Cache::MemoryStore or ActiveSupport::Cache::NullStore.
162
- # If it's one of rejected cache stores, we'll use the FileStore.
163
- # We decided against the MemoryStore in production because it will not be shared between multiple processes (when using Puma).
164
- def computed_cache_store
165
- -> {
166
- if Rails.env.production?
167
- if Rails.cache.class.to_s.in?(production_rejected_cache_stores)
168
- ActiveSupport::Cache.lookup_store(:file_store, Rails.root.join("tmp", "cache"))
169
- else
170
- Rails.cache
171
- end
172
- elsif Rails.env.test?
173
- Rails.cache
174
- else
175
- ActiveSupport::Cache.lookup_store(:memory_store)
176
- end
177
- }
178
- end
179
142
  end
180
143
 
181
144
  def self.configuration
@@ -0,0 +1,5 @@
1
+ class Avo::Current < ActiveSupport::CurrentAttributes
2
+ attribute :app
3
+ attribute :license
4
+ attribute :params, :request, :context, :current_user, :view_context
5
+ end
@@ -72,7 +72,7 @@ module Avo
72
72
  end
73
73
 
74
74
  def field_class_from_symbol(symbol)
75
- matched_field = Avo::App.fields.find do |field|
75
+ matched_field = Avo::App.fields.all.find do |field|
76
76
  field[:name].to_s == symbol.to_s
77
77
  end
78
78
 
@@ -9,7 +9,7 @@ module Avo
9
9
  Avo::App.eager_load(:resources) unless Rails.application.config.eager_load
10
10
  end
11
11
 
12
- Avo::App.fetch_resources
12
+ Avo::Resources::ResourceManager.fetch_resources
13
13
  .select do |resource|
14
14
  resource != :BaseResource
15
15
  end
@@ -17,7 +17,11 @@ module Avo
17
17
  resource.is_a? Class
18
18
  end
19
19
  .map do |resource|
20
- resources resource.new.route_key
20
+ resources resource.new.route_key do
21
+ member do
22
+ get :preview
23
+ end
24
+ end
21
25
  end
22
26
  end
23
27
  end
data/lib/avo/engine.rb CHANGED
@@ -7,34 +7,59 @@ Gem.loaded_specs["avo"].dependencies.each do |d|
7
7
  require "action_view/railtie"
8
8
  when "activestorage"
9
9
  require "active_storage/engine"
10
- when "actiontext"
11
- require "action_text/engine"
12
10
  else
13
11
  require d.name
14
12
  end
15
13
  end
16
14
 
15
+ # In development we should load the engine so we get the autoload for components
16
+ if ENV["RAILS_ENV"] === "development"
17
+ require "view_component/engine"
18
+ end
19
+
17
20
  module Avo
18
21
  class Engine < ::Rails::Engine
19
22
  isolate_namespace Avo
20
23
 
21
24
  config.after_initialize do
25
+ # Reset before reloads in development
26
+ ::Avo.asset_manager.reset
27
+
28
+ # Boot Avo
29
+ ::Avo::App.boot
30
+ ::Avo.plugin_manager.boot_plugins
31
+
32
+ # After deploy we want to make sure the license response is being cleared.
33
+ # We need a fresh license response.
34
+ # This is disabled in development because the initialization process might be triggered more than once.
35
+ unless Rails.env.development?
36
+ begin
37
+ Licensing::HQ.new.clear_response
38
+ rescue => exception
39
+ Avo.logger.info "Failed to clear Avo HQ response: #{exception.message}"
40
+ end
41
+ end
42
+ end
43
+
44
+ # Ensure we reboot the app when something changes
45
+ config.to_prepare do
22
46
  # Boot Avo
23
47
  ::Avo::App.boot
24
48
  end
25
49
 
26
50
  initializer "avo.autoload" do |app|
27
- Avo::ENTITIES.values.each do |path_params|
28
- path = Rails.root.join(*path_params)
51
+ # This undoes Rails' previous nested directories behavior in the `app` dir.
52
+ # More on this: https://github.com/fxn/zeitwerk/issues/250
53
+ avo_directory = Rails.root.join("app", "avo").to_s
54
+ ActiveSupport::Dependencies.autoload_paths.delete(avo_directory)
29
55
 
30
- if File.directory? path.to_s
31
- Rails.autoloaders.main.push_dir path.to_s
32
- end
56
+ if Dir.exist?(avo_directory)
57
+ Rails.autoloaders.main.push_dir(avo_directory, namespace: Avo)
58
+ app.config.watchable_dirs[avo_directory] = [:rb]
33
59
  end
34
60
  end
35
61
 
36
62
  initializer "avo.init_fields" do |app|
37
- # Init the fields
38
63
  ::Avo::App.init_fields
39
64
  end
40
65
 
@@ -46,17 +71,16 @@ module Avo
46
71
  end
47
72
  end
48
73
 
49
- initializer "debug_exception_response_format" do |app|
50
- app.config.debug_exception_response_format = :api
51
- # app.config.logger = ::Logger.new(STDOUT)
52
- end
53
-
54
74
  initializer "avo.test_buddy" do |app|
55
75
  if Avo::IN_DEVELOPMENT
56
76
  Rails.autoloaders.main.push_dir Avo::Engine.root.join("spec", "helpers")
57
77
  end
58
78
  end
59
79
 
80
+ initializer "debug_exception_response_format" do |app|
81
+ app.config.debug_exception_response_format = :api
82
+ end
83
+
60
84
  config.app_middleware.use(
61
85
  Rack::Static,
62
86
  urls: ["/avo-assets"],
@@ -71,22 +95,5 @@ module Avo
71
95
  Rails::Generators.configure! app.config.generators
72
96
  require_relative "../generators/model_generator"
73
97
  end
74
-
75
- initializer "avo.locales" do |app|
76
- I18n.load_path += Dir[Avo::Engine.root.join("lib", "generators", "avo", "templates", "locales", "*.{rb,yml}")]
77
- end
78
-
79
- # After deploy we want to make sure the license response is being cleared.
80
- # We need a fresh license response.
81
- # This is disabled in development because the initialization process might be triggered more than once.
82
- config.after_initialize do
83
- unless Rails.env.development?
84
- begin
85
- Licensing::HQ.new.clear_response
86
- rescue => exception
87
- puts "Failed to clear Avo HQ response: #{exception.message}"
88
- end
89
- end
90
- end
91
98
  end
92
99
  end
@@ -0,0 +1,25 @@
1
+ module Avo
2
+ class ErrorManager
3
+ class << self
4
+ def build
5
+ new
6
+ end
7
+ end
8
+
9
+ attr_reader :errors
10
+
11
+ alias_method :all, :errors
12
+
13
+ def initialize
14
+ @errors = []
15
+ end
16
+
17
+ def add(error)
18
+ errors << error
19
+ end
20
+
21
+ def has_errors?
22
+ errors.present?
23
+ end
24
+ end
25
+ end
@@ -1,6 +1,6 @@
1
1
  module Avo
2
2
  class ExecutionContext
3
- attr_accessor :target, :context, :params, :view_context, :current_user, :request, :include, :main_app, :avo
3
+ attr_accessor :target, :context, :params, :view_context, :current_user, :request, :include
4
4
 
5
5
  def initialize(**args)
6
6
  # Extend the class with custom modules if required.
@@ -10,13 +10,6 @@ module Avo
10
10
  end
11
11
  end
12
12
 
13
- # If you want this block to behave like a view you can delegate the missing methods to the view_context
14
- #
15
- # Ex: Avo::ExecutionContext.new(target: ..., delegate_missing_to: :view_context).handle
16
- if args[:delegate_missing_to].present?
17
- self.class.send(:delegate_missing_to, args[:delegate_missing_to])
18
- end
19
-
20
13
  # If target doesn't respond to call, we don't need to initialize the others attr_accessors.
21
14
  return unless (@target = args[:target]).respond_to? :call
22
15
 
@@ -26,15 +19,16 @@ module Avo
26
19
  end
27
20
 
28
21
  # Set defaults on not initialized accessors
29
- @context ||= Avo::App.context
30
- @params ||= Avo::App.params
31
- @view_context ||= Avo::App.view_context
32
- @current_user ||= Avo::App.current_user
33
- @request ||= view_context&.request
34
- @main_app ||= view_context&.main_app
35
- @avo ||= view_context&.avo
22
+ @context ||= Avo::Current.context
23
+ @current_user ||= Avo::Current.current_user
24
+ @params ||= Avo::Current.params
25
+ @request ||= Avo::Current.request
26
+ @view_context ||= Avo::Current.view_context
36
27
  end
37
28
 
29
+ delegate :result, to: :card
30
+ delegate :authorize, to: Avo::Services::AuthorizationService
31
+
38
32
  # Return target if target is not callable, otherwise, execute target on this instance context
39
33
  def handle
40
34
  target.respond_to?(:call) ? instance_exec(&target) : target
@@ -8,7 +8,7 @@ module Avo
8
8
 
9
9
  hide_on [:edit, :new]
10
10
 
11
- default_options = {info: :info, success: :success, danger: :danger, warning: :warning, neutral: :neutral}
11
+ default_options = {info: :info, success: :success, danger: :danger, warning: :warning}
12
12
  @options = args[:options].present? ? default_options.merge(args[:options]) : default_options
13
13
  end
14
14
  end
@@ -2,21 +2,24 @@ module Avo
2
2
  module Fields
3
3
  class BaseField
4
4
  extend ActiveSupport::DescendantsTracker
5
- extend Avo::Fields::FieldExtensions::HasFieldName
6
5
 
7
- include Avo::Concerns::IsResourceItem
8
- include Avo::Concerns::HandlesFieldArgs
9
-
10
- include ActionView::Helpers::UrlHelper
11
- include Avo::Fields::FieldExtensions::VisibleInDifferentViews
12
-
13
- include Avo::Concerns::HasHTMLAttributes
14
- include Avo::Fields::Concerns::IsRequired
6
+ prepend Avo::Concerns::HasItemType
7
+ prepend Avo::Concerns::IsResourceItem
8
+ include Avo::Concerns::IsVisible
9
+ include Avo::Concerns::VisibleInDifferentViews
10
+ include Avo::Fields::Concerns::HasFieldName
11
+ include Avo::Fields::Concerns::HasDefault
12
+ include Avo::Fields::Concerns::HasHTMLAttributes
13
+ include Avo::Fields::Concerns::HandlesFieldArgs
15
14
  include Avo::Fields::Concerns::IsReadonly
16
15
  include Avo::Fields::Concerns::IsDisabled
17
- include Avo::Fields::Concerns::HasDefault
16
+ include Avo::Fields::Concerns::IsRequired
17
+
18
+ include ActionView::Helpers::UrlHelper
18
19
 
19
- delegate :view_context, to: ::Avo::App
20
+ delegate :app, to: ::Avo::Current
21
+ delegate :view_context, to: :app
22
+ delegate :context, to: :app
20
23
  delegate :simple_format, :content_tag, to: :view_context
21
24
  delegate :main_app, to: :view_context
22
25
  delegate :avo, to: :view_context
@@ -30,35 +33,30 @@ module Avo
30
33
  attr_reader :nullable
31
34
  attr_reader :null_values
32
35
  attr_reader :format_using
33
- attr_reader :autocomplete
34
36
  attr_reader :help
35
37
  attr_reader :default
36
- attr_reader :visible
37
38
  attr_reader :as_label
38
39
  attr_reader :as_avatar
39
40
  attr_reader :as_description
40
41
  attr_reader :index_text_align
41
42
  attr_reader :stacked
43
+ attr_reader :for_presentation_only
42
44
 
43
45
  # Private options
46
+ attr_reader :updatable
44
47
  attr_reader :computable # if allowed to be computable
45
48
  attr_reader :computed # if block is present
46
49
  attr_reader :computed_value # the value after computation
47
50
 
48
51
  # Hydrated payload
49
- attr_reader :model
50
- attr_reader :view
51
- attr_reader :resource
52
- attr_reader :action
53
- attr_reader :user
54
- attr_reader :panel_name
52
+ attr_accessor :record
53
+ attr_accessor :action
54
+ attr_accessor :user
55
+ attr_accessor :panel_name
55
56
 
56
57
  class_attribute :field_name_attribute
57
- class_attribute :item_type, default: :field
58
58
 
59
59
  def initialize(id, **args, &block)
60
- super(id, **args, &block)
61
-
62
60
  @id = id
63
61
  @name = args[:name]
64
62
  @translation_key = args[:translation_key]
@@ -70,12 +68,10 @@ module Avo
70
68
  @nullable = args[:nullable] || false
71
69
  @null_values = args[:null_values] || [nil, ""]
72
70
  @format_using = args[:format_using] || nil
73
- @update_using = args[:update_using] || nil
74
71
  @placeholder = args[:placeholder]
75
- @autocomplete = args[:autocomplete] || nil
76
72
  @help = args[:help] || nil
77
73
  @default = args[:default] || nil
78
- @visible = args[:visible]
74
+ @visible = args[:visible] || true
79
75
  @as_label = args[:as_label] || false
80
76
  @as_avatar = args[:as_avatar] || false
81
77
  @as_description = args[:as_description] || false
@@ -84,43 +80,29 @@ module Avo
84
80
  @view = args[:view] || nil
85
81
  @value = args[:value] || nil
86
82
  @stacked = args[:stacked] || nil
83
+ @for_presentation_only = args[:for_presentation_only] || false
87
84
  @resource = args[:resource]
88
- @action = args[:action]
89
85
 
90
86
  @args = args
91
87
 
88
+ @updatable = !readonly
92
89
  @computable = true
93
90
  @computed = block.present?
94
91
  @computed_value = nil
95
92
 
96
- # Set the visibility
97
- show_on args[:show_on] if args[:show_on].present?
98
- hide_on args[:hide_on] if args[:hide_on].present?
99
- only_on args[:only_on] if args[:only_on].present?
100
- except_on args[:except_on] if args[:except_on].present?
93
+ post_initialize if respond_to?(:post_initialize)
101
94
  end
102
95
 
103
- def hydrate(**kwargs)
104
- # List of permitted keyword argument keys as symbols
105
- permited_kwargs_keys = %i[model resource action view panel_name user]
106
-
107
- # Check for unrecognized keys
108
- unrecognized_keys = kwargs.keys - permited_kwargs_keys
109
- raise ArgumentError, "Unrecognized argument(s): #{unrecognized_keys.join(', ')}" if unrecognized_keys.any?
110
-
111
- # Set instance variables with provided values
112
- kwargs.each do |key, value|
113
- instance_variable_set("@#{key}", value)
114
- end
115
-
116
- # Return self for method chaining, if desired
117
- self
96
+ def translation_key
97
+ @translation_key || "avo.field_translations.#{@id}"
118
98
  end
119
99
 
120
- def translation_key
121
- return @translation_key if @translation_key.present?
100
+ def translated_name(default:)
101
+ t(translation_key, count: 1, default: default).capitalize
102
+ end
122
103
 
123
- "avo.field_translations.#{@id}"
104
+ def translated_plural_name(default:)
105
+ t(translation_key, count: 2, default: default).capitalize
124
106
  end
125
107
 
126
108
  # Getting the name of the resource (user/users, post/posts)
@@ -130,8 +112,8 @@ module Avo
130
112
  def name
131
113
  return @name if custom_name?
132
114
 
133
- if translation_key && ::Avo::App.translation_enabled
134
- t(translation_key, count: 1, default: default_name).humanize
115
+ if translation_key
116
+ translated_name default: default_name
135
117
  else
136
118
  default_name
137
119
  end
@@ -140,15 +122,19 @@ module Avo
140
122
  def plural_name
141
123
  default = name.pluralize
142
124
 
143
- if translation_key && ::Avo::App.translation_enabled
144
- t(translation_key, count: 2, default: default).humanize
125
+ if translation_key
126
+ translated_plural_name default: default
145
127
  else
146
128
  default
147
129
  end
148
130
  end
149
131
 
132
+ def table_header_label
133
+ name
134
+ end
135
+
150
136
  def custom_name?
151
- @name.present?
137
+ !@name.nil?
152
138
  end
153
139
 
154
140
  def default_name
@@ -156,21 +142,7 @@ module Avo
156
142
  end
157
143
 
158
144
  def placeholder
159
- if @placeholder.respond_to?(:call)
160
- return Avo::Hosts::ResourceViewRecordHost.new(block: @placeholder, record: @model, resource: @resource, view: @view).handle
161
- end
162
-
163
- @placeholder || name
164
- end
165
-
166
- def visible?
167
- return true if visible.nil?
168
-
169
- if visible.respond_to?(:call)
170
- visible.call resource: @resource
171
- else
172
- visible
173
- end
145
+ Avo::ExecutionContext.new(target: @placeholder || name, record: record, resource: @resource, view: @view).handle
174
146
  end
175
147
 
176
148
  def value(property = nil)
@@ -178,8 +150,8 @@ module Avo
178
150
 
179
151
  property ||= id
180
152
 
181
- # Get model value
182
- final_value = @model.send(property) if is_model?(@model) && @model.respond_to?(property)
153
+ # Get record value
154
+ final_value = record.send(property) if is_model?(record) && record.respond_to?(property)
183
155
 
184
156
  # On new views and actions modals we need to prefill the fields with the default value
185
157
  if should_fill_with_default_value? && default.present?
@@ -188,50 +160,21 @@ module Avo
188
160
 
189
161
  # Run computable callback block if present
190
162
  if computable && block.present?
191
- final_value = instance_exec(@model, @resource, @view, self, &block)
163
+ final_value = instance_exec(record, @resource, @view, self, &block)
192
164
  end
193
165
 
194
- if @format_using.present?
195
- # Apply the changes in the
196
- Avo::ExecutionContext.new(
197
- target: @format_using,
198
- model: model,
199
- key: property,
200
- value: final_value,
201
- resource: resource,
202
- view: view,
203
- field: self,
204
- delegate_missing_to: :view_context,
205
- include: self.class.included_modules
206
- ).handle
207
- else
208
- final_value
209
- end
210
- end
211
-
212
- # Fills the model with the received value on create and update actions.
213
- def fill_field(model, key, value, params)
214
- return model unless model.methods.include? key.to_sym
166
+ # Run the value through resolver if present
167
+ final_value = instance_exec(final_value, &@format_using) if @format_using.present?
215
168
 
216
- if @update_using.present?
217
- value = update_using(model, key, value, params)
218
- end
169
+ final_value
170
+ end
219
171
 
220
- model.public_send("#{key}=", value)
172
+ def fill_field(record, key, value, params)
173
+ return record unless record.methods.include? key.to_sym
221
174
 
222
- model
223
- end
175
+ record.send("#{key}=", value)
224
176
 
225
- def update_using(model, key, value, params)
226
- Avo::ExecutionContext.new(
227
- target: @update_using,
228
- model: model,
229
- key: key,
230
- value: value,
231
- resource: resource,
232
- field: self,
233
- include: self.class.included_modules
234
- ).handle
177
+ record
235
178
  end
236
179
 
237
180
  # Try to see if the field has a different database ID than it's name
@@ -257,21 +200,31 @@ module Avo
257
200
  "#{type.camelize}Field"
258
201
  end
259
202
 
203
+ # For custom components the namespace will be different than Avo::Fields so we should take that into account.
204
+ def view_component_namespace
205
+ "#{self.class.to_s.deconstantize}::#{view_component_name}"
206
+ end
207
+
260
208
  # Try and build the component class or fallback to a blank one
261
209
  def component_for_view(view = :index)
262
210
  # Use the edit variant for all "update" views
263
211
  view = :edit if view.in? [:new, :create, :update]
264
212
 
265
- component_class = "::Avo::Fields::#{view_component_name}::#{view.to_s.camelize}Component"
213
+ component_class = "#{view_component_namespace}::#{view.to_s.camelize}Component"
266
214
  component_class.constantize
267
215
  rescue
216
+ unless Rails.env.test?
217
+ Avo.logger.info "Failed to find component for the `#{self.class}` field on the `#{view}` view."
218
+ end
268
219
  # When returning nil, a race condition happens and throws an error in some environments.
269
220
  # See https://github.com/avo-hq/avo/pull/365
270
221
  ::Avo::BlankFieldComponent
271
222
  end
272
223
 
273
- def model_errors
274
- model.nil? ? {} : model.errors
224
+ def record_errors
225
+ return {} if record.nil?
226
+
227
+ record.errors
275
228
  end
276
229
 
277
230
  def type
@@ -292,23 +245,18 @@ module Avo
292
245
  !visible_in_reflection?
293
246
  end
294
247
 
295
- def updatable
296
- !is_readonly? && visible?
297
- end
298
-
299
- # Used by Avo to fill the record with the default value on :new and :edit views
300
- def assign_value(record:, value:)
301
- id = type == "belongs_to" ? foreign_key : database_id
302
-
303
- if record.send(id).nil?
304
- record.send("#{id}=", value)
305
- end
248
+ def options_for_filter
249
+ options
306
250
  end
307
251
 
308
252
  private
309
253
 
310
254
  def model_or_class(model)
311
- model.instance_of?(String) ? "class" : "model"
255
+ if model.instance_of?(String)
256
+ "class"
257
+ else
258
+ "model"
259
+ end
312
260
  end
313
261
 
314
262
  def is_model?(model)