avo 2.45.0 → 3.0.0.beta1

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

Potentially problematic release.


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

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