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