avo 2.49.0 → 3.0.0.beta1

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

Potentially problematic release.


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

Files changed (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +15 -26
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
  40. data/app/components/avo/fields/index_component.rb +5 -5
  41. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  42. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  43. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  44. data/app/components/avo/fields/show_component.rb +4 -1
  45. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  46. data/app/components/avo/filters_component.html.erb +9 -3
  47. data/app/components/avo/filters_component.rb +4 -4
  48. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  49. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  50. data/app/components/avo/index/grid_item_component.rb +43 -16
  51. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  52. data/app/components/avo/index/resource_controls_component.rb +124 -17
  53. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  54. data/app/components/avo/index/resource_grid_component.rb +5 -2
  55. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  56. data/app/components/avo/index/resource_map_component.rb +3 -3
  57. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  58. data/app/components/avo/index/resource_table_component.rb +14 -20
  59. data/app/components/avo/index/table_row_component.html.erb +8 -4
  60. data/app/components/avo/index/table_row_component.rb +3 -2
  61. data/app/components/avo/item_switcher_component.rb +2 -2
  62. data/app/components/avo/modal_component.html.erb +7 -12
  63. data/app/components/avo/modal_component.rb +0 -21
  64. data/app/components/avo/paginator_component.html.erb +40 -29
  65. data/app/components/avo/paginator_component.rb +5 -23
  66. data/app/components/avo/panel_component.html.erb +8 -6
  67. data/app/components/avo/referrer_params_component.html.erb +1 -2
  68. data/app/components/avo/resource_component.rb +189 -14
  69. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  70. data/app/components/avo/resource_sidebar_component.rb +1 -1
  71. data/app/components/avo/sidebar/link_component.rb +1 -1
  72. data/app/components/avo/sidebar_component.html.erb +10 -3
  73. data/app/components/avo/sidebar_component.rb +5 -3
  74. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  75. data/app/components/avo/tab_group_component.html.erb +13 -7
  76. data/app/components/avo/tab_group_component.rb +1 -6
  77. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  78. data/app/components/avo/tab_switcher_component.rb +4 -39
  79. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  80. data/app/components/avo/views/resource_edit_component.rb +7 -18
  81. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  82. data/app/components/avo/views/resource_index_component.rb +62 -12
  83. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  84. data/app/components/avo/views/resource_show_component.rb +6 -11
  85. data/app/controllers/avo/actions_controller.rb +27 -24
  86. data/app/controllers/avo/application_controller.rb +105 -151
  87. data/app/controllers/avo/associations_controller.rb +34 -43
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +102 -102
  90. data/app/controllers/avo/debug_controller.rb +17 -5
  91. data/app/controllers/avo/home_controller.rb +1 -1
  92. data/app/controllers/avo/search_controller.rb +30 -51
  93. data/app/controllers/avo/team_users_controller.rb +4 -0
  94. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  95. data/app/helpers/avo/application_helper.rb +15 -9
  96. data/app/helpers/avo/resources_helper.rb +1 -1
  97. data/app/helpers/avo/url_helpers.rb +27 -11
  98. data/app/javascript/avo.base.js +1 -0
  99. data/app/javascript/js/application.js +0 -3
  100. data/app/javascript/js/controllers/action_controller.js +5 -3
  101. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  102. data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
  103. data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
  104. data/app/javascript/js/controllers/filter_controller.js +1 -1
  105. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  106. data/app/javascript/js/controllers/preview_controller.js +24 -0
  107. data/app/javascript/js/controllers/search_controller.js +2 -2
  108. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  109. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  110. data/app/javascript/js/controllers.js +10 -6
  111. data/app/javascript/js/custom-stream-actions.js +15 -0
  112. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  113. data/app/views/avo/actions/show.html.erb +10 -7
  114. data/app/views/avo/associations/new.html.erb +2 -2
  115. data/app/views/avo/base/index.html.erb +3 -2
  116. data/app/views/avo/base/new.html.erb +2 -1
  117. data/app/views/avo/base/preview.html.erb +19 -0
  118. data/app/views/avo/base/show.html.erb +1 -1
  119. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  120. data/app/views/avo/debug/report.html.erb +32 -17
  121. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  122. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  123. data/app/views/avo/partials/_footer.html.erb +1 -1
  124. data/app/views/avo/partials/_javascript.html.erb +5 -0
  125. data/app/views/avo/partials/_logo.html.erb +1 -1
  126. data/app/views/avo/partials/_navbar.html.erb +3 -5
  127. data/app/views/avo/partials/_table_header.html.erb +5 -11
  128. data/app/views/layouts/avo/application.html.erb +4 -2
  129. data/avo.gemspec +11 -12
  130. data/bin/dev +1 -1
  131. data/bin/prod +0 -0
  132. data/config/i18n-tasks.yml +1 -1
  133. data/config/initializers/pagy.rb +0 -2
  134. data/config/master.key +1 -0
  135. data/config/routes.rb +6 -10
  136. data/db/factories.rb +7 -1
  137. data/lib/avo/action_model.rb +20 -0
  138. data/lib/avo/asset_manager.rb +30 -0
  139. data/lib/avo/base_action.rb +57 -42
  140. data/lib/avo/base_resource.rb +264 -227
  141. data/lib/avo/base_resource_tool.rb +9 -16
  142. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  143. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  144. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  145. data/lib/avo/concerns/has_controls.rb +37 -0
  146. data/lib/avo/concerns/has_description.rb +23 -0
  147. data/lib/avo/concerns/has_item_type.rb +42 -0
  148. data/lib/avo/concerns/has_items.rb +325 -0
  149. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  150. data/lib/avo/concerns/is_resource_item.rb +24 -36
  151. data/lib/avo/concerns/is_visible.rb +15 -0
  152. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  153. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  154. data/lib/avo/configuration/branding.rb +0 -12
  155. data/lib/avo/configuration.rb +1 -37
  156. data/lib/avo/current.rb +39 -0
  157. data/lib/avo/dsl/field_parser.rb +1 -1
  158. data/lib/avo/dynamic_router.rb +18 -3
  159. data/lib/avo/engine.rb +35 -30
  160. data/lib/avo/error_manager.rb +25 -0
  161. data/lib/avo/execution_context.rb +10 -14
  162. data/lib/avo/fields/badge_field.rb +1 -1
  163. data/lib/avo/fields/base_field.rb +91 -106
  164. data/lib/avo/fields/belongs_to_field.rb +18 -22
  165. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  166. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  167. data/lib/avo/fields/concerns/has_default.rb +1 -5
  168. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  169. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  170. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  171. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  172. data/lib/avo/fields/concerns/is_required.rb +5 -7
  173. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  174. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  175. data/lib/avo/fields/country_field.rb +4 -0
  176. data/lib/avo/fields/date_time_field.rb +3 -14
  177. data/lib/avo/fields/field_manager.rb +55 -0
  178. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  179. data/lib/avo/fields/has_base_field.rb +12 -15
  180. data/lib/avo/fields/has_many_field.rb +5 -2
  181. data/lib/avo/fields/has_one_field.rb +6 -10
  182. data/lib/avo/fields/heading_field.rb +4 -1
  183. data/lib/avo/fields/hidden_field.rb +1 -1
  184. data/lib/avo/fields/id_field.rb +1 -1
  185. data/lib/avo/fields/location_field.rb +8 -8
  186. data/lib/avo/fields/password_field.rb +1 -1
  187. data/lib/avo/fields/preview_field.rb +14 -0
  188. data/lib/avo/fields/select_field.rb +12 -8
  189. data/lib/avo/fields/status_field.rb +4 -0
  190. data/lib/avo/filters/base_filter.rb +8 -4
  191. data/lib/avo/html/builder.rb +7 -8
  192. data/lib/avo/item_grapher.rb +78 -0
  193. data/lib/avo/licensing/h_q.rb +8 -67
  194. data/lib/avo/licensing/license.rb +1 -1
  195. data/lib/avo/licensing/pro_license.rb +1 -7
  196. data/lib/avo/loaders/fields_loader.rb +7 -1
  197. data/lib/avo/plugin.rb +16 -0
  198. data/lib/avo/plugin_manager.rb +56 -0
  199. data/lib/avo/prefixed_test_helpers.rb +20 -0
  200. data/lib/avo/reloader.rb +3 -0
  201. data/lib/avo/resources/controls/actions_list.rb +7 -12
  202. data/lib/avo/resources/controls/attach_button.rb +15 -0
  203. data/lib/avo/resources/controls/back_button.rb +1 -1
  204. data/lib/avo/resources/controls/base_control.rb +15 -49
  205. data/lib/avo/resources/controls/create_button.rb +15 -0
  206. data/lib/avo/resources/controls/delete_button.rb +5 -1
  207. data/lib/avo/resources/controls/detach_button.rb +4 -1
  208. data/lib/avo/resources/controls/edit_button.rb +4 -1
  209. data/lib/avo/resources/controls/order_controls.rb +8 -0
  210. data/lib/avo/resources/controls/save_button.rb +13 -0
  211. data/lib/avo/resources/controls/show_button.rb +15 -0
  212. data/lib/avo/resources/items/holder.rb +84 -0
  213. data/lib/avo/resources/items/item_group.rb +49 -0
  214. data/lib/avo/resources/items/main_panel.rb +2 -0
  215. data/lib/avo/resources/items/panel.rb +2 -0
  216. data/lib/avo/resources/items/row.rb +54 -0
  217. data/lib/avo/resources/items/sidebar.rb +47 -0
  218. data/lib/avo/resources/items/tab.rb +60 -0
  219. data/lib/avo/resources/items/tab_group.rb +68 -0
  220. data/lib/avo/resources/resource_manager.rb +174 -0
  221. data/lib/avo/services/authorization_service.rb +11 -110
  222. data/lib/avo/services/debug_service.rb +93 -0
  223. data/lib/avo/services/encryption_service.rb +5 -1
  224. data/lib/avo/services/telemetry_service.rb +85 -0
  225. data/lib/avo/test_helpers.rb +362 -0
  226. data/lib/avo/tools/tool_manager.rb +30 -0
  227. data/lib/avo/version.rb +1 -1
  228. data/lib/avo.rb +115 -24
  229. data/lib/generators/avo/action_generator.rb +8 -8
  230. data/lib/generators/avo/card_generator.rb +27 -0
  231. data/lib/generators/avo/filter_generator.rb +8 -8
  232. data/lib/generators/avo/resource_generator.rb +4 -4
  233. data/lib/generators/avo/scope_generator.rb +15 -0
  234. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  235. data/lib/generators/avo/templates/action.tt +8 -6
  236. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  237. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  238. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  239. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  240. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  241. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  242. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  243. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  244. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  245. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  246. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  247. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  248. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  249. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  250. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  251. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  252. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  253. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  254. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  255. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  256. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  257. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  258. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  259. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  260. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  261. data/lib/generators/avo/templates/scope.tt +6 -0
  262. data/lib/generators/avo/templates/tool/view.tt +2 -2
  263. data/lib/tasks/avo_tasks.rake +27 -0
  264. data/public/avo-assets/avo.base.css +1810 -1189
  265. data/public/avo-assets/avo.base.js +217 -307
  266. data/public/avo-assets/avo.base.js.map +3 -3
  267. data/public/avo-assets/avo.css +9744 -0
  268. data/public/avo-assets/avo.js +513 -0
  269. data/public/avo-assets/avo.js.map +7 -0
  270. metadata +102 -146
  271. data/app/assets/stylesheets/css/tags.css +0 -32
  272. data/app/components/avo/card_component.html.erb +0 -46
  273. data/app/components/avo/card_component.rb +0 -25
  274. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  275. data/app/components/avo/dashboards/divider_component.rb +0 -19
  276. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  277. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  278. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  279. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  280. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  281. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  282. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  283. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  284. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  285. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  286. data/app/components/avo/index/ordering/base_component.rb +0 -9
  287. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  288. data/app/components/avo/index/ordering/button_component.rb +0 -23
  289. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  290. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  291. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  292. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  293. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  294. data/app/controllers/avo/dashboards_controller.rb +0 -22
  295. data/app/controllers/avo/reorder_controller.rb +0 -25
  296. data/app/javascript/js/controllers/base_controller.js +0 -22
  297. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  298. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  299. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  300. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  301. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  302. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  303. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  304. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  305. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  306. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  307. data/app/views/avo/dashboards/show.html.erb +0 -38
  308. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  309. data/app/views/avo/partials/_global_search.html.erb +0 -19
  310. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  311. data/lib/avo/app.rb +0 -237
  312. data/lib/avo/base_card.rb +0 -161
  313. data/lib/avo/concerns/fetches_things.rb +0 -150
  314. data/lib/avo/concerns/handles_field_args.rb +0 -47
  315. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  316. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  317. data/lib/avo/concerns/has_fields.rb +0 -334
  318. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  319. data/lib/avo/concerns/pagination.rb +0 -53
  320. data/lib/avo/concerns/policy_helpers.rb +0 -31
  321. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  322. data/lib/avo/concerns/visible_items.rb +0 -51
  323. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  324. data/lib/avo/dashboards/base_divider.rb +0 -35
  325. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  326. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  327. data/lib/avo/dashboards/metric_card.rb +0 -9
  328. data/lib/avo/dashboards/partial_card.rb +0 -7
  329. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  330. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  331. data/lib/avo/fields/tags_field.rb +0 -102
  332. data/lib/avo/grid_collector.rb +0 -42
  333. data/lib/avo/hosts/association_scope_host.rb +0 -8
  334. data/lib/avo/hosts/base_host.rb +0 -25
  335. data/lib/avo/hosts/card_visibility.rb +0 -20
  336. data/lib/avo/hosts/dashboard_card.rb +0 -22
  337. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  338. data/lib/avo/hosts/ordering.rb +0 -22
  339. data/lib/avo/hosts/record_host.rb +0 -7
  340. data/lib/avo/hosts/resource_record_host.rb +0 -7
  341. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  342. data/lib/avo/hosts/search_scope_host.rb +0 -7
  343. data/lib/avo/hosts/view_record_host.rb +0 -7
  344. data/lib/avo/hosts/visibility_host.rb +0 -12
  345. data/lib/avo/items_holder.rb +0 -96
  346. data/lib/avo/main_panel.rb +0 -3
  347. data/lib/avo/menu/base_item.rb +0 -25
  348. data/lib/avo/menu/builder.rb +0 -82
  349. data/lib/avo/menu/dashboard.rb +0 -22
  350. data/lib/avo/menu/group.rb +0 -2
  351. data/lib/avo/menu/link.rb +0 -6
  352. data/lib/avo/menu/menu.rb +0 -2
  353. data/lib/avo/menu/resource.rb +0 -22
  354. data/lib/avo/menu/section.rb +0 -2
  355. data/lib/avo/panel.rb +0 -24
  356. data/lib/avo/panel_builder.rb +0 -25
  357. data/lib/avo/resources/controls/action.rb +0 -38
  358. data/lib/avo/resources/controls/execution_context.rb +0 -58
  359. data/lib/avo/resources/controls/items_holder.rb +0 -19
  360. data/lib/avo/resources/controls/link_to.rb +0 -27
  361. data/lib/avo/row.rb +0 -26
  362. data/lib/avo/row_builder.rb +0 -24
  363. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  364. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  365. data/lib/avo/sidebar.rb +0 -30
  366. data/lib/avo/sidebar_builder.rb +0 -24
  367. data/lib/avo/tab.rb +0 -72
  368. data/lib/avo/tab_builder.rb +0 -25
  369. data/lib/avo/tab_group.rb +0 -42
  370. data/lib/avo/tab_group_builder.rb +0 -43
  371. data/lib/avo/tools_manager.rb +0 -11
  372. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  373. data/lib/generators/avo/card/metric_generator.rb +0 -18
  374. data/lib/generators/avo/card/partial_generator.rb +0 -19
  375. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  376. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  377. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -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
@@ -33,12 +36,9 @@ module Avo
33
36
  attr_reader :autocomplete
34
37
  attr_reader :help
35
38
  attr_reader :default
36
- attr_reader :visible
37
- attr_reader :as_label
38
39
  attr_reader :as_avatar
39
- attr_reader :as_description
40
- attr_reader :index_text_align
41
40
  attr_reader :stacked
41
+ attr_reader :for_presentation_only
42
42
 
43
43
  # Private options
44
44
  attr_reader :computable # if allowed to be computable
@@ -46,19 +46,14 @@ module Avo
46
46
  attr_reader :computed_value # the value after computation
47
47
 
48
48
  # 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
49
+ attr_accessor :record
50
+ attr_accessor :action
51
+ attr_accessor :user
52
+ attr_accessor :panel_name
55
53
 
56
54
  class_attribute :field_name_attribute
57
- class_attribute :item_type, default: :field
58
55
 
59
56
  def initialize(id, **args, &block)
60
- super(id, **args, &block)
61
-
62
57
  @id = id
63
58
  @name = args[:name]
64
59
  @translation_key = args[:translation_key]
@@ -76,16 +71,13 @@ module Avo
76
71
  @help = args[:help] || nil
77
72
  @default = args[:default] || nil
78
73
  @visible = args[:visible]
79
- @as_label = args[:as_label] || false
80
74
  @as_avatar = args[:as_avatar] || false
81
- @as_description = args[:as_description] || false
82
- @index_text_align = args[:index_text_align] || :left
83
75
  @html = args[:html] || nil
84
76
  @view = args[:view] || nil
85
77
  @value = args[:value] || nil
86
78
  @stacked = args[:stacked] || nil
79
+ @for_presentation_only = args[:for_presentation_only] || false
87
80
  @resource = args[:resource]
88
- @action = args[:action]
89
81
 
90
82
  @args = args
91
83
 
@@ -93,34 +85,19 @@ module Avo
93
85
  @computed = block.present?
94
86
  @computed_value = nil
95
87
 
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?
88
+ post_initialize if respond_to?(:post_initialize)
101
89
  end
102
90
 
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
91
+ def translation_key
92
+ @translation_key || "avo.field_translations.#{@id}"
118
93
  end
119
94
 
120
- def translation_key
121
- return @translation_key if @translation_key.present?
95
+ def translated_name(default:)
96
+ t(translation_key, count: 1, default: default).humanize
97
+ end
122
98
 
123
- "avo.field_translations.#{@id}"
99
+ def translated_plural_name(default:)
100
+ t(translation_key, count: 2, default: default).humanize
124
101
  end
125
102
 
126
103
  # Getting the name of the resource (user/users, post/posts)
@@ -130,8 +107,8 @@ module Avo
130
107
  def name
131
108
  return @name if custom_name?
132
109
 
133
- if translation_key && ::Avo::App.translation_enabled
134
- t(translation_key, count: 1, default: default_name).humanize
110
+ if translation_key
111
+ translated_name default: default_name
135
112
  else
136
113
  default_name
137
114
  end
@@ -140,15 +117,19 @@ module Avo
140
117
  def plural_name
141
118
  default = name.pluralize
142
119
 
143
- if translation_key && ::Avo::App.translation_enabled
144
- t(translation_key, count: 2, default: default).humanize
120
+ if translation_key
121
+ translated_plural_name default: default
145
122
  else
146
123
  default
147
124
  end
148
125
  end
149
126
 
127
+ def table_header_label
128
+ name
129
+ end
130
+
150
131
  def custom_name?
151
- @name.present?
132
+ !@name.nil?
152
133
  end
153
134
 
154
135
  def default_name
@@ -156,21 +137,7 @@ module Avo
156
137
  end
157
138
 
158
139
  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
140
+ Avo::ExecutionContext.new(target: @placeholder || name, record: record, resource: @resource, view: @view).handle
174
141
  end
175
142
 
176
143
  def value(property = nil)
@@ -178,8 +145,8 @@ module Avo
178
145
 
179
146
  property ||= id
180
147
 
181
- # Get model value
182
- final_value = @model.send(property) if is_model?(@model) && @model.respond_to?(property)
148
+ # Get record value
149
+ final_value = record.send(property) if is_model?(record) && record.respond_to?(property)
183
150
 
184
151
  # On new views and actions modals we need to prefill the fields with the default value
185
152
  if should_fill_with_default_value? && default.present?
@@ -188,50 +155,50 @@ module Avo
188
155
 
189
156
  # Run computable callback block if present
190
157
  if computable && block.present?
191
- final_value = instance_exec(@model, @resource, @view, self, &block)
158
+ final_value = Avo::ExecutionContext.new(
159
+ target: block,
160
+ record: record,
161
+ resource: @resource,
162
+ view: @view,
163
+ field: self,
164
+ include: self.class.included_modules
165
+ ).handle
192
166
  end
193
167
 
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,
168
+ # Run the value through resolver if present
169
+ if format_using.present?
170
+ final_value = Avo::ExecutionContext.new(
171
+ target: format_using,
200
172
  value: final_value,
173
+ record: record,
201
174
  resource: resource,
202
175
  view: view,
203
176
  field: self,
204
- delegate_missing_to: :view_context,
205
177
  include: self.class.included_modules
206
178
  ).handle
207
- else
208
- final_value
209
179
  end
180
+
181
+ final_value
210
182
  end
211
183
 
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
184
+ # Fills the record with the received value on create and update actions.
185
+ def fill_field(record, key, value, params)
186
+ return record unless record.methods.include? key.to_sym
215
187
 
216
188
  if @update_using.present?
217
- value = update_using(model, key, value, params)
189
+ value = Avo::ExecutionContext.new(
190
+ target: @update_using,
191
+ record: record,
192
+ key: key,
193
+ value: value,
194
+ resource: resource,
195
+ field: self
196
+ ).handle
218
197
  end
219
198
 
220
- model.public_send("#{key}=", value)
199
+ record.public_send("#{key}=", value)
221
200
 
222
- model
223
- end
224
-
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
201
+ record
235
202
  end
236
203
 
237
204
  # Try to see if the field has a different database ID than it's name
@@ -257,21 +224,31 @@ module Avo
257
224
  "#{type.camelize}Field"
258
225
  end
259
226
 
227
+ # For custom components the namespace will be different than Avo::Fields so we should take that into account.
228
+ def view_component_namespace
229
+ "#{self.class.to_s.deconstantize}::#{view_component_name}"
230
+ end
231
+
260
232
  # Try and build the component class or fallback to a blank one
261
233
  def component_for_view(view = :index)
262
234
  # Use the edit variant for all "update" views
263
235
  view = :edit if view.in? [:new, :create, :update]
264
236
 
265
- component_class = "::Avo::Fields::#{view_component_name}::#{view.to_s.camelize}Component"
237
+ component_class = "#{view_component_namespace}::#{view.to_s.camelize}Component"
266
238
  component_class.constantize
267
239
  rescue
240
+ unless Rails.env.test?
241
+ Avo.logger.info "Failed to find component for the `#{self.class}` field on the `#{view}` view."
242
+ end
268
243
  # When returning nil, a race condition happens and throws an error in some environments.
269
244
  # See https://github.com/avo-hq/avo/pull/365
270
245
  ::Avo::BlankFieldComponent
271
246
  end
272
247
 
273
- def model_errors
274
- model.nil? ? {} : model.errors
248
+ def record_errors
249
+ return {} if record.nil?
250
+
251
+ record.errors
275
252
  end
276
253
 
277
254
  def type
@@ -292,8 +269,12 @@ module Avo
292
269
  !visible_in_reflection?
293
270
  end
294
271
 
272
+ def options_for_filter
273
+ options
274
+ end
275
+
295
276
  def updatable
296
- !is_readonly? && visible?
277
+ !is_disabled? && visible?
297
278
  end
298
279
 
299
280
  # Used by Avo to fill the record with the default value on :new and :edit views
@@ -308,7 +289,11 @@ module Avo
308
289
  private
309
290
 
310
291
  def model_or_class(model)
311
- model.instance_of?(String) ? "class" : "model"
292
+ if model.instance_of?(String)
293
+ "class"
294
+ else
295
+ "model"
296
+ end
312
297
  end
313
298
 
314
299
  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
@@ -107,9 +104,7 @@ module Avo
107
104
 
108
105
  # What the user sees in the text field
109
106
  def field_label
110
- value.send(target_resource.class.title)
111
- rescue
112
- nil
107
+ label
113
108
  end
114
109
 
115
110
  def options
@@ -118,16 +113,16 @@ module Avo
118
113
 
119
114
  def values_for_type(model = nil)
120
115
  resource = target_resource
121
- resource = App.get_resource_by_model_name model if model.present?
116
+ resource = Avo.resource_manager.get_resource_by_model_class model if model.present?
122
117
 
123
- query = resource.class.query_scope
118
+ query = resource.query_scope
124
119
 
125
120
  if attach_scope.present?
126
- query = Avo::Hosts::AssociationScopeHost.new(block: attach_scope, query: query, parent: get_model).handle
121
+ query = Avo::ExecutionContext.new(target: attach_scope, query: query, parent: get_model).handle
127
122
  end
128
123
 
129
- query.all.map do |model|
130
- [model.send(resource.class.title), model.id]
124
+ query.all.map do |record|
125
+ [resource.new(record: record).record_title, record.id]
131
126
  end
132
127
  end
133
128
 
@@ -160,8 +155,8 @@ module Avo
160
155
  def foreign_key
161
156
  return polymorphic_as if polymorphic_as.present?
162
157
 
163
- if @model.present?
164
- get_model_class(@model).reflections[@relation_method].foreign_key
158
+ if @record.present?
159
+ get_model_class(@record).reflections[@relation_method].foreign_key
165
160
  elsif @resource.present? && @resource.model_class.reflections[@relation_method].present?
166
161
  @resource.model_class.reflections[@relation_method].foreign_key
167
162
  end
@@ -185,7 +180,8 @@ module Avo
185
180
  end
186
181
 
187
182
  def label
188
- value.send(target_resource.class.title)
183
+ return if target_resource.blank?
184
+ target_resource.new(record: value)&.record_title
189
185
  end
190
186
 
191
187
  def to_permitted_param
@@ -237,7 +233,7 @@ module Avo
237
233
 
238
234
  if is_polymorphic?
239
235
  if value.present?
240
- return App.get_resource_by_model_name(value.class)
236
+ return Avo.resource_manager.get_resource_by_model_class(value.class)
241
237
  else
242
238
  return nil
243
239
  end
@@ -245,19 +241,19 @@ module Avo
245
241
 
246
242
  reflection_key = polymorphic_as || id
247
243
 
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]
244
+ if @record._reflections[reflection_key.to_s].klass.present?
245
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[reflection_key.to_s].klass.to_s
246
+ elsif @record._reflections[reflection_key.to_s].options[:class_name].present?
247
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[reflection_key.to_s].options[:class_name]
252
248
  else
253
249
  App.get_resource_by_name reflection_key.to_s
254
250
  end
255
251
  end
256
252
 
257
253
  def get_model
258
- return @model if @model.present?
254
+ return @record if @record.present?
259
255
 
260
- @resource.model
256
+ @resource.record
261
257
  rescue
262
258
  nil
263
259
  end
@@ -6,7 +6,7 @@ module Avo
6
6
 
7
7
  delegate :authorization, to: :@resource
8
8
  delegate :authorize_action, to: :authorization
9
- delegate :id, :model, to: :@field
9
+ delegate :id, :record, to: :@field
10
10
 
11
11
  def can_upload_file?
12
12
  authorize_file_action(:upload)
@@ -23,7 +23,7 @@ module Avo
23
23
  private
24
24
 
25
25
  def authorize_file_action(action)
26
- authorize_action("#{action}_#{id}?", record: model, raise_exception: false)
26
+ authorize_action("#{action}_#{id}?", record: record, raise_exception: false)
27
27
  end
28
28
  end
29
29
  end
@@ -0,0 +1,49 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module HandlesFieldArgs
5
+ extend ActiveSupport::Concern
6
+
7
+ private
8
+
9
+ # Add an instance variable from args
10
+ # That may be a string, boolean, or array
11
+ # Each args should also have a default value
12
+ def add_prop_from_args(args = {}, name: nil, type: :string, default: nil)
13
+ value = default
14
+
15
+ if type == :boolean
16
+ case args[name.to_sym]
17
+ when nil
18
+ value = default
19
+ when false
20
+ value = false
21
+ when true
22
+ value = true
23
+ end
24
+ else
25
+ value = args[name.to_sym] unless args.dig(name.to_sym).nil?
26
+ end
27
+
28
+ instance_variable_set(:"@#{name}", value)
29
+ end
30
+
31
+ def add_boolean_prop(args, name, default = false)
32
+ add_prop_from_args args, name: name, default: default, type: :boolean
33
+ end
34
+
35
+ def add_array_prop(args, name, default = [])
36
+ add_prop_from_args args, name: name, default: default, type: :array
37
+ end
38
+
39
+ def add_object_prop(args, name, default = {})
40
+ add_prop_from_args args, name: name, default: default, type: :object
41
+ end
42
+
43
+ def add_string_prop(args, name, default = nil)
44
+ add_prop_from_args args, name: name, default: default, type: :string
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -5,11 +5,7 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def computed_default_value
8
- if default.respond_to? :call
9
- Avo::Hosts::ResourceViewRecordHost.new(block: default, record: model, view: view, resource: resource).handle
10
- else
11
- default
12
- end
8
+ Avo::ExecutionContext.new(target: default, record: record, view: view, resource: resource).handle
13
9
  end
14
10
  end
15
11
  end
@@ -0,0 +1,22 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module HasFieldName
5
+ extend ActiveSupport::Concern
6
+
7
+ class_methods do
8
+ def field_name(name)
9
+ self.field_name_attribute = name
10
+ end
11
+
12
+ # Get the field name
13
+ def get_field_name
14
+ return field_name_attribute if field_name_attribute.present?
15
+
16
+ to_s.demodulize.underscore.gsub "_field", ""
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,110 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module HasHTMLAttributes
5
+ extend ActiveSupport::Concern
6
+
7
+ attr_reader :html
8
+
9
+ # Used to get attributes for elements and views
10
+ #
11
+ # examples:
12
+ # get_html :data, view: :edit, element: :input
13
+ # get_html :classes, view: :show, element: :wrapper
14
+ # get_html :styles, view: :index, element: :wrapper
15
+ def get_html(name = nil, element:, view:)
16
+ if [view, element].any?(&:nil?)
17
+ default_attribute_value name
18
+ end
19
+
20
+ parsed = parse_html
21
+
22
+ attributes = if parsed.is_a? Hash
23
+ get_html_from_hash name, element: element, hash: parsed, view: view
24
+ elsif parsed.is_a? Avo::HTML::Builder
25
+ get_html_from_block name, element: element, html_builder: parsed, view: view
26
+ elsif parsed.nil?
27
+ # Handle empty parsed by returning an empty state
28
+ default_attribute_value name
29
+ end
30
+
31
+ add_default_data_attributes attributes, name, element, view
32
+ end
33
+
34
+ private
35
+
36
+ # Returns Hash, HTML::Builder, or nil.
37
+ def parse_html
38
+ return if @html.nil?
39
+
40
+ if @html.is_a? Hash
41
+ @html
42
+ elsif @html.respond_to? :call
43
+ Avo::HTML::Builder.parse_block(record: record, resource: resource, &@html)
44
+ end
45
+ end
46
+
47
+ def default_attribute_value(name)
48
+ name == :data ? {} : ""
49
+ end
50
+
51
+ def add_default_data_attributes(attributes, name, element, view)
52
+ if !attributes.nil? && name == :data && element == :input && view.in?([:edit, :new]) && resource.present? && resource.respond_to?(:get_stimulus_controllers)
53
+ extra_attributes = resource.get_stimulus_controllers
54
+ .split(" ")
55
+ .map do |controller|
56
+ [:"#{controller}-target", "#{id.to_s.underscore}_#{type.to_s.underscore}_input".camelize(:lower)]
57
+ end
58
+ .to_h
59
+
60
+ attributes.merge extra_attributes
61
+ else
62
+ attributes
63
+ end
64
+ end
65
+
66
+ def get_html_from_block(name = nil, element:, html_builder:, view:)
67
+ values = []
68
+
69
+ # get view ancestor
70
+ values << html_builder.dig_stack(view, element, name)
71
+ # get element ancestor
72
+ values << html_builder.dig_stack(element, name)
73
+ # get direct ancestor
74
+ values << html_builder.dig_stack(name)
75
+
76
+ values_type = if name == :data
77
+ :hash
78
+ else
79
+ :string
80
+ end
81
+
82
+ merge_values_as(as: values_type, values: values)
83
+ end
84
+
85
+ def get_html_from_hash(name = nil, element:, hash:, view:)
86
+ # @todo: what if this is not a Hash but a string?
87
+ hash.dig(view, element, name) || {}
88
+ end
89
+
90
+ # Merge the values from all possible locations.
91
+ # If the result is "blank", return nil so the attributes are not outputted to the DOM.
92
+ #
93
+ # Ex: if the style attribute is empty return `nil` instead of an empty space `" "`
94
+ def merge_values_as(as: :array, values: [])
95
+ result = if as == :array
96
+ values.flatten
97
+ elsif as == :string
98
+ values.select do |value|
99
+ value.is_a? String
100
+ end.join " "
101
+ elsif as == :hash
102
+ values.reduce({}, :merge)
103
+ end
104
+
105
+ result if result.present?
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -7,11 +7,7 @@ module Avo
7
7
  attr_reader :disabled
8
8
 
9
9
  def is_disabled?
10
- if disabled.respond_to? :call
11
- Avo::Hosts::ResourceViewRecordHost.new(block: disabled, record: model, view: view, resource: resource).handle
12
- else
13
- disabled
14
- end
10
+ Avo::ExecutionContext.new(target: disabled, record: record, view: view, resource: resource).handle
15
11
  end
16
12
  end
17
13
  end
@@ -5,11 +5,7 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def is_readonly?
8
- if readonly.respond_to? :call
9
- Avo::Hosts::ResourceViewRecordHost.new(block: readonly, record: model, view: view, resource: resource).handle
10
- else
11
- readonly
12
- end
8
+ Avo::ExecutionContext.new(target: readonly, record: record, view: view, resource: resource).handle
13
9
  end
14
10
  end
15
11
  end