avo 2.45.0 → 3.0.0.pre1

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 (415) 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 +9 -9
  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 +11 -10
  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 -35
  167. data/lib/avo/base_resource.rb +107 -95
  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/is_resource_item.rb +24 -36
  175. data/lib/avo/concerns/is_visible.rb +15 -0
  176. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  177. data/lib/avo/configuration/branding.rb +0 -12
  178. data/lib/avo/configuration.rb +8 -45
  179. data/lib/avo/current.rb +5 -0
  180. data/lib/avo/dsl/field_parser.rb +1 -1
  181. data/lib/avo/dynamic_router.rb +6 -2
  182. data/lib/avo/engine.rb +37 -30
  183. data/lib/avo/error_manager.rb +25 -0
  184. data/lib/avo/execution_context.rb +9 -15
  185. data/lib/avo/fields/badge_field.rb +1 -1
  186. data/lib/avo/fields/base_field.rb +72 -123
  187. data/lib/avo/fields/belongs_to_field.rb +14 -25
  188. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  189. data/lib/avo/fields/concerns/has_default.rb +1 -5
  190. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  191. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  192. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  193. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  194. data/lib/avo/fields/concerns/is_required.rb +5 -7
  195. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  196. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  197. data/lib/avo/fields/country_field.rb +4 -0
  198. data/lib/avo/fields/date_field.rb +3 -16
  199. data/lib/avo/fields/date_time_field.rb +1 -5
  200. data/lib/avo/fields/field_manager.rb +45 -0
  201. data/lib/avo/fields/file_field.rb +0 -2
  202. data/lib/avo/fields/files_field.rb +0 -6
  203. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  204. data/lib/avo/fields/has_base_field.rb +11 -14
  205. data/lib/avo/fields/has_many_field.rb +5 -2
  206. data/lib/avo/fields/has_one_field.rb +5 -10
  207. data/lib/avo/fields/heading_field.rb +4 -1
  208. data/lib/avo/fields/hidden_field.rb +1 -1
  209. data/lib/avo/fields/id_field.rb +2 -3
  210. data/lib/avo/fields/password_field.rb +1 -1
  211. data/lib/avo/fields/preview_field.rb +14 -0
  212. data/lib/avo/fields/select_field.rb +12 -8
  213. data/lib/avo/fields/status_field.rb +4 -0
  214. data/lib/avo/filters/base_filter.rb +3 -8
  215. data/lib/avo/grid_collector.rb +7 -9
  216. data/lib/avo/html/builder.rb +5 -8
  217. data/lib/avo/item_grapher.rb +78 -0
  218. data/lib/avo/licensing/h_q.rb +3 -67
  219. data/lib/avo/licensing/license.rb +2 -2
  220. data/lib/avo/licensing/license_manager.rb +1 -1
  221. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  222. data/lib/avo/licensing/pro_license.rb +1 -7
  223. data/lib/avo/plugin.rb +6 -0
  224. data/lib/avo/plugin_manager.rb +58 -0
  225. data/lib/avo/prefixed_test_helpers.rb +20 -0
  226. data/lib/avo/reloader.rb +3 -0
  227. data/lib/avo/resources/controls/actions_list.rb +6 -12
  228. data/lib/avo/resources/controls/attach_button.rb +15 -0
  229. data/lib/avo/resources/controls/back_button.rb +1 -1
  230. data/lib/avo/resources/controls/base_control.rb +15 -49
  231. data/lib/avo/resources/controls/create_button.rb +15 -0
  232. data/lib/avo/resources/controls/delete_button.rb +5 -1
  233. data/lib/avo/resources/controls/detach_button.rb +4 -1
  234. data/lib/avo/resources/controls/edit_button.rb +4 -1
  235. data/lib/avo/resources/controls/order_controls.rb +8 -0
  236. data/lib/avo/resources/controls/save_button.rb +13 -0
  237. data/lib/avo/resources/controls/show_button.rb +15 -0
  238. data/lib/avo/resources/items/holder.rb +76 -0
  239. data/lib/avo/resources/items/item_group.rb +48 -0
  240. data/lib/avo/resources/items/main_panel.rb +2 -0
  241. data/lib/avo/resources/items/panel.rb +2 -0
  242. data/lib/avo/resources/items/sidebar.rb +47 -0
  243. data/lib/avo/resources/items/tab.rb +60 -0
  244. data/lib/avo/resources/items/tab_group.rb +68 -0
  245. data/lib/avo/resources/resource_manager.rb +181 -0
  246. data/lib/avo/services/authorization_service.rb +11 -110
  247. data/lib/avo/services/debug_service.rb +92 -0
  248. data/lib/avo/services/telemetry_service.rb +84 -0
  249. data/lib/avo/test_helpers.rb +362 -0
  250. data/lib/avo/tools/tool_manager.rb +30 -0
  251. data/lib/avo/version.rb +1 -1
  252. data/lib/avo.rb +7 -0
  253. data/lib/generators/avo/eject_generator.rb +0 -1
  254. data/lib/generators/avo/install_generator.rb +1 -11
  255. data/lib/generators/avo/resource_generator.rb +5 -23
  256. data/lib/generators/avo/scope_generator.rb +15 -0
  257. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  258. data/lib/generators/avo/templates/action.tt +1 -1
  259. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  261. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  263. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  265. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  266. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  267. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  268. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  271. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  272. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  273. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  274. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  275. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  280. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  281. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  282. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  283. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  284. data/lib/generators/avo/templates/scope.tt +6 -0
  285. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  286. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  287. data/lib/generators/avo/templates/tool/view.tt +2 -2
  288. data/lib/tasks/avo_tasks.rake +22 -0
  289. metadata +81 -159
  290. data/app/assets/stylesheets/css/tags.css +0 -32
  291. data/app/assets/svgs/map-empty-state.svg +0 -35
  292. data/app/assets/svgs/map-view-type.svg +0 -3
  293. data/app/components/avo/card_component.html.erb +0 -46
  294. data/app/components/avo/card_component.rb +0 -25
  295. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  296. data/app/components/avo/dashboards/divider_component.rb +0 -19
  297. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  298. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  299. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  300. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  301. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  303. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  304. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  305. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  306. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  307. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  309. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  311. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  312. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  313. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  314. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  315. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  316. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  317. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  318. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  319. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  320. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  321. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  322. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  323. data/app/components/avo/index/ordering/base_component.rb +0 -9
  324. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  325. data/app/components/avo/index/ordering/button_component.rb +0 -23
  326. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  327. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  328. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  329. data/app/components/avo/index/resource_map_component.rb +0 -109
  330. data/app/components/avo/row_component.html.erb +0 -3
  331. data/app/components/avo/row_component.rb +0 -12
  332. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  333. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  334. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  335. data/app/controllers/avo/dashboards_controller.rb +0 -22
  336. data/app/controllers/avo/reorder_controller.rb +0 -25
  337. data/app/javascript/js/controllers/base_controller.js +0 -22
  338. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  339. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  340. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  341. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  342. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  343. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  344. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  345. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  346. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  347. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  348. data/app/views/avo/dashboards/show.html.erb +0 -38
  349. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  350. data/app/views/avo/partials/_global_search.html.erb +0 -19
  351. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  352. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  353. data/lib/avo/base_card.rb +0 -161
  354. data/lib/avo/concerns/fetches_things.rb +0 -150
  355. data/lib/avo/concerns/handles_field_args.rb +0 -47
  356. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  357. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  358. data/lib/avo/concerns/pagination.rb +0 -53
  359. data/lib/avo/concerns/policy_helpers.rb +0 -31
  360. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  361. data/lib/avo/concerns/visible_items.rb +0 -51
  362. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  363. data/lib/avo/dashboards/base_divider.rb +0 -35
  364. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  365. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  366. data/lib/avo/dashboards/metric_card.rb +0 -9
  367. data/lib/avo/dashboards/partial_card.rb +0 -7
  368. data/lib/avo/fields/area_field.rb +0 -39
  369. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  370. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  371. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  372. data/lib/avo/fields/location_field.rb +0 -86
  373. data/lib/avo/fields/tags_field.rb +0 -102
  374. data/lib/avo/hosts/association_scope_host.rb +0 -8
  375. data/lib/avo/hosts/base_host.rb +0 -25
  376. data/lib/avo/hosts/card_visibility.rb +0 -20
  377. data/lib/avo/hosts/dashboard_card.rb +0 -22
  378. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  379. data/lib/avo/hosts/ordering.rb +0 -22
  380. data/lib/avo/hosts/record_host.rb +0 -7
  381. data/lib/avo/hosts/resource_record_host.rb +0 -7
  382. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  383. data/lib/avo/hosts/search_scope_host.rb +0 -7
  384. data/lib/avo/hosts/view_record_host.rb +0 -7
  385. data/lib/avo/hosts/visibility_host.rb +0 -12
  386. data/lib/avo/items_holder.rb +0 -96
  387. data/lib/avo/main_panel.rb +0 -3
  388. data/lib/avo/menu/base_item.rb +0 -25
  389. data/lib/avo/menu/builder.rb +0 -82
  390. data/lib/avo/menu/dashboard.rb +0 -22
  391. data/lib/avo/menu/group.rb +0 -2
  392. data/lib/avo/menu/link.rb +0 -6
  393. data/lib/avo/menu/menu.rb +0 -2
  394. data/lib/avo/menu/resource.rb +0 -22
  395. data/lib/avo/menu/section.rb +0 -2
  396. data/lib/avo/panel.rb +0 -24
  397. data/lib/avo/panel_builder.rb +0 -25
  398. data/lib/avo/resources/controls/action.rb +0 -38
  399. data/lib/avo/resources/controls/execution_context.rb +0 -58
  400. data/lib/avo/resources/controls/items_holder.rb +0 -19
  401. data/lib/avo/resources/controls/link_to.rb +0 -27
  402. data/lib/avo/row.rb +0 -26
  403. data/lib/avo/row_builder.rb +0 -24
  404. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  405. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  406. data/lib/avo/sidebar.rb +0 -30
  407. data/lib/avo/sidebar_builder.rb +0 -24
  408. data/lib/avo/tab.rb +0 -72
  409. data/lib/avo/tab_builder.rb +0 -25
  410. data/lib/avo/tab_group.rb +0 -42
  411. data/lib/avo/tab_group_builder.rb +0 -43
  412. data/lib/avo/tools_manager.rb +0 -11
  413. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  414. data/public/avo-assets/avo.base.js +0 -1037
  415. data/public/avo-assets/avo.base.js.map +0 -7
@@ -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,42 +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
85
 
89
86
  @args = args
90
87
 
88
+ @updatable = !readonly
91
89
  @computable = true
92
90
  @computed = block.present?
93
91
  @computed_value = nil
94
92
 
95
- # Set the visibility
96
- show_on args[:show_on] if args[:show_on].present?
97
- hide_on args[:hide_on] if args[:hide_on].present?
98
- only_on args[:only_on] if args[:only_on].present?
99
- except_on args[:except_on] if args[:except_on].present?
93
+ post_initialize if respond_to?(:post_initialize)
100
94
  end
101
95
 
102
- def hydrate(**kwargs)
103
- # List of permitted keyword argument keys as symbols
104
- permited_kwargs_keys = %i[model resource action view panel_name user]
105
-
106
- # Check for unrecognized keys
107
- unrecognized_keys = kwargs.keys - permited_kwargs_keys
108
- raise ArgumentError, "Unrecognized argument(s): #{unrecognized_keys.join(', ')}" if unrecognized_keys.any?
109
-
110
- # Set instance variables with provided values
111
- kwargs.each do |key, value|
112
- instance_variable_set("@#{key}", value)
113
- end
114
-
115
- # Return self for method chaining, if desired
116
- self
96
+ def translation_key
97
+ @translation_key || "avo.field_translations.#{@id}"
117
98
  end
118
99
 
119
- def translation_key
120
- return @translation_key if @translation_key.present?
100
+ def translated_name(default:)
101
+ t(translation_key, count: 1, default: default).capitalize
102
+ end
121
103
 
122
- "avo.field_translations.#{@id}"
104
+ def translated_plural_name(default:)
105
+ t(translation_key, count: 2, default: default).capitalize
123
106
  end
124
107
 
125
108
  # Getting the name of the resource (user/users, post/posts)
@@ -129,8 +112,8 @@ module Avo
129
112
  def name
130
113
  return @name if custom_name?
131
114
 
132
- if translation_key && ::Avo::App.translation_enabled
133
- t(translation_key, count: 1, default: default_name).humanize
115
+ if translation_key
116
+ translated_name default: default_name
134
117
  else
135
118
  default_name
136
119
  end
@@ -139,15 +122,19 @@ module Avo
139
122
  def plural_name
140
123
  default = name.pluralize
141
124
 
142
- if translation_key && ::Avo::App.translation_enabled
143
- t(translation_key, count: 2, default: default).humanize
125
+ if translation_key
126
+ translated_plural_name default: default
144
127
  else
145
128
  default
146
129
  end
147
130
  end
148
131
 
132
+ def table_header_label
133
+ name
134
+ end
135
+
149
136
  def custom_name?
150
- @name.present?
137
+ !@name.nil?
151
138
  end
152
139
 
153
140
  def default_name
@@ -155,21 +142,7 @@ module Avo
155
142
  end
156
143
 
157
144
  def placeholder
158
- if @placeholder.respond_to?(:call)
159
- return Avo::Hosts::ResourceViewRecordHost.new(block: @placeholder, record: @model, resource: @resource, view: @view).handle
160
- end
161
-
162
- @placeholder || name
163
- end
164
-
165
- def visible?
166
- return true if visible.nil?
167
-
168
- if visible.respond_to?(:call)
169
- visible.call resource: @resource
170
- else
171
- visible
172
- end
145
+ Avo::ExecutionContext.new(target: @placeholder || name, record: record, resource: @resource, view: @view).handle
173
146
  end
174
147
 
175
148
  def value(property = nil)
@@ -177,8 +150,8 @@ module Avo
177
150
 
178
151
  property ||= id
179
152
 
180
- # Get model value
181
- 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)
182
155
 
183
156
  # On new views and actions modals we need to prefill the fields with the default value
184
157
  if should_fill_with_default_value? && default.present?
@@ -187,50 +160,21 @@ module Avo
187
160
 
188
161
  # Run computable callback block if present
189
162
  if computable && block.present?
190
- final_value = instance_exec(@model, @resource, @view, self, &block)
163
+ final_value = instance_exec(record, @resource, @view, self, &block)
191
164
  end
192
165
 
193
- if @format_using.present?
194
- # Apply the changes in the
195
- Avo::ExecutionContext.new(
196
- target: @format_using,
197
- model: model,
198
- key: property,
199
- value: final_value,
200
- resource: resource,
201
- view: view,
202
- field: self,
203
- delegate_missing_to: :view_context,
204
- include: self.class.included_modules
205
- ).handle
206
- else
207
- final_value
208
- end
209
- end
210
-
211
- # Fills the model with the received value on create and update actions.
212
- def fill_field(model, key, value, params)
213
- 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?
214
168
 
215
- if @update_using.present?
216
- value = update_using(model, key, value, params)
217
- end
169
+ final_value
170
+ end
218
171
 
219
- model.public_send("#{key}=", value)
172
+ def fill_field(record, key, value, params)
173
+ return record unless record.methods.include? key.to_sym
220
174
 
221
- model
222
- end
175
+ record.send("#{key}=", value)
223
176
 
224
- def update_using(model, key, value, params)
225
- Avo::ExecutionContext.new(
226
- target: @update_using,
227
- model: model,
228
- key: key,
229
- value: value,
230
- resource: resource,
231
- field: self,
232
- include: self.class.included_modules
233
- ).handle
177
+ record
234
178
  end
235
179
 
236
180
  # Try to see if the field has a different database ID than it's name
@@ -256,21 +200,31 @@ module Avo
256
200
  "#{type.camelize}Field"
257
201
  end
258
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
+
259
208
  # Try and build the component class or fallback to a blank one
260
209
  def component_for_view(view = :index)
261
210
  # Use the edit variant for all "update" views
262
211
  view = :edit if view.in? [:new, :create, :update]
263
212
 
264
- component_class = "::Avo::Fields::#{view_component_name}::#{view.to_s.camelize}Component"
213
+ component_class = "#{view_component_namespace}::#{view.to_s.camelize}Component"
265
214
  component_class.constantize
266
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
267
219
  # When returning nil, a race condition happens and throws an error in some environments.
268
220
  # See https://github.com/avo-hq/avo/pull/365
269
221
  ::Avo::BlankFieldComponent
270
222
  end
271
223
 
272
- def model_errors
273
- model.nil? ? {} : model.errors
224
+ def record_errors
225
+ return {} if record.nil?
226
+
227
+ record.errors
274
228
  end
275
229
 
276
230
  def type
@@ -291,23 +245,18 @@ module Avo
291
245
  !visible_in_reflection?
292
246
  end
293
247
 
294
- def updatable
295
- !is_readonly? && visible?
296
- end
297
-
298
- # Used by Avo to fill the record with the default value on :new and :edit views
299
- def assign_value(record:, value:)
300
- id = type == "belongs_to" ? foreign_key : database_id
301
-
302
- if record.send(id).nil?
303
- record.send("#{id}=", value)
304
- end
248
+ def options_for_filter
249
+ options
305
250
  end
306
251
 
307
252
  private
308
253
 
309
254
  def model_or_class(model)
310
- model.instance_of?(String) ? "class" : "model"
255
+ if model.instance_of?(String)
256
+ "class"
257
+ else
258
+ "model"
259
+ end
311
260
  end
312
261
 
313
262
  def is_model?(model)
@@ -57,6 +57,7 @@ module Avo
57
57
  # - is_disabled?
58
58
 
59
59
  class BelongsToField < BaseField
60
+ include Avo::Fields::Concerns::IsSearchable
60
61
  include Avo::Fields::Concerns::UseResource
61
62
 
62
63
  attr_accessor :target
@@ -84,10 +85,6 @@ module Avo
84
85
  @use_resource = args[:use_resource] || nil
85
86
  end
86
87
 
87
- def searchable
88
- @searchable && ::Avo::App.license.has_with_trial(:searchable_associations)
89
- end
90
-
91
88
  def value
92
89
  if is_polymorphic?
93
90
  # Get the value from the pre-filled assoociation record
@@ -118,12 +115,12 @@ module Avo
118
115
 
119
116
  def values_for_type(model = nil)
120
117
  resource = target_resource
121
- resource = App.get_resource_by_model_name model if model.present?
118
+ resource = Avo::App.resources.get_resource_by_model_class model if model.present?
122
119
 
123
120
  query = resource.class.query_scope
124
121
 
125
122
  if attach_scope.present?
126
- query = Avo::Hosts::AssociationScopeHost.new(block: attach_scope, query: query, parent: get_model).handle
123
+ query = Avo::ExecutionContext.new(target: attach_scope, query: query, parent: get_model).handle
127
124
  end
128
125
 
129
126
  query.all.map do |model|
@@ -160,8 +157,8 @@ module Avo
160
157
  def foreign_key
161
158
  return polymorphic_as if polymorphic_as.present?
162
159
 
163
- if @model.present?
164
- get_model_class(@model).reflections[@relation_method].foreign_key
160
+ if @record.present?
161
+ get_model_class(@record).reflections[@relation_method].foreign_key
165
162
  elsif @resource.present? && @resource.model_class.reflections[@relation_method].present?
166
163
  @resource.model_class.reflections[@relation_method].foreign_key
167
164
  end
@@ -200,12 +197,10 @@ module Avo
200
197
  return model unless model.methods.include? key.to_sym
201
198
 
202
199
  if polymorphic_as.present?
203
- valid_model_class = valid_polymorphic_class params["#{polymorphic_as}_type"]
204
-
205
- model.send("#{polymorphic_as}_type=", valid_model_class)
200
+ model.send("#{polymorphic_as}_type=", params["#{polymorphic_as}_type"])
206
201
 
207
202
  # If the type is blank, reset the id too.
208
- if valid_model_class.blank?
203
+ if params["#{polymorphic_as}_type"].blank?
209
204
  model.send("#{polymorphic_as}_id=", nil)
210
205
  else
211
206
  model.send("#{polymorphic_as}_id=", params["#{polymorphic_as}_id"])
@@ -217,12 +212,6 @@ module Avo
217
212
  model
218
213
  end
219
214
 
220
- def valid_polymorphic_class(possible_class)
221
- types.find do |type|
222
- type.to_s == possible_class.to_s
223
- end
224
- end
225
-
226
215
  def database_id
227
216
  # If the field is a polymorphic value, return the polymorphic_type as key and pre-fill the _id in fill_field.
228
217
  return "#{polymorphic_as}_type" if polymorphic_as.present?
@@ -237,7 +226,7 @@ module Avo
237
226
 
238
227
  if is_polymorphic?
239
228
  if value.present?
240
- return App.get_resource_by_model_name(value.class)
229
+ return Avo::App.resources.get_resource_by_model_class(value.class)
241
230
  else
242
231
  return nil
243
232
  end
@@ -245,19 +234,19 @@ module Avo
245
234
 
246
235
  reflection_key = polymorphic_as || id
247
236
 
248
- if @model._reflections[reflection_key.to_s].klass.present?
249
- App.get_resource_by_model_name @model._reflections[reflection_key.to_s].klass.to_s
250
- elsif @model._reflections[reflection_key.to_s].options[:class_name].present?
251
- App.get_resource_by_model_name @model._reflections[reflection_key.to_s].options[:class_name]
237
+ if @record._reflections[reflection_key.to_s].klass.present?
238
+ Avo::App.resources.get_resource_by_model_class @record._reflections[reflection_key.to_s].klass.to_s
239
+ elsif @record._reflections[reflection_key.to_s].options[:class_name].present?
240
+ Avo::App.resources.get_resource_by_model_class @record._reflections[reflection_key.to_s].options[:class_name]
252
241
  else
253
242
  App.get_resource_by_name reflection_key.to_s
254
243
  end
255
244
  end
256
245
 
257
246
  def get_model
258
- return @model if @model.present?
247
+ return @record if @record.present?
259
248
 
260
- @resource.model
249
+ @resource.record
261
250
  rescue
262
251
  nil
263
252
  end