avo 2.46.0 → 3.0.2

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