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