avo 2.46.0 → 3.0.0.pre1

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 (417) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +12 -23
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +12 -11
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -36
  167. data/lib/avo/base_resource.rb +108 -96
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  175. data/lib/avo/concerns/is_resource_item.rb +24 -36
  176. data/lib/avo/concerns/is_visible.rb +15 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +8 -45
  180. data/lib/avo/current.rb +5 -0
  181. data/lib/avo/dsl/field_parser.rb +1 -1
  182. data/lib/avo/dynamic_router.rb +6 -2
  183. data/lib/avo/engine.rb +37 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +9 -15
  186. data/lib/avo/fields/badge_field.rb +1 -1
  187. data/lib/avo/fields/base_field.rb +72 -124
  188. data/lib/avo/fields/belongs_to_field.rb +14 -25
  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 +110 -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 +13 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/country_field.rb +4 -0
  199. data/lib/avo/fields/date_field.rb +3 -16
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/field_manager.rb +45 -0
  202. data/lib/avo/fields/file_field.rb +0 -2
  203. data/lib/avo/fields/files_field.rb +0 -6
  204. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  205. data/lib/avo/fields/has_base_field.rb +11 -14
  206. data/lib/avo/fields/has_many_field.rb +5 -2
  207. data/lib/avo/fields/has_one_field.rb +5 -10
  208. data/lib/avo/fields/heading_field.rb +4 -1
  209. data/lib/avo/fields/hidden_field.rb +1 -1
  210. data/lib/avo/fields/id_field.rb +2 -3
  211. data/lib/avo/fields/password_field.rb +1 -1
  212. data/lib/avo/fields/preview_field.rb +14 -0
  213. data/lib/avo/fields/select_field.rb +12 -8
  214. data/lib/avo/fields/status_field.rb +4 -0
  215. data/lib/avo/filters/base_filter.rb +3 -8
  216. data/lib/avo/grid_collector.rb +7 -9
  217. data/lib/avo/html/builder.rb +5 -8
  218. data/lib/avo/item_grapher.rb +78 -0
  219. data/lib/avo/licensing/h_q.rb +4 -68
  220. data/lib/avo/licensing/license.rb +2 -2
  221. data/lib/avo/licensing/license_manager.rb +1 -1
  222. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  223. data/lib/avo/licensing/pro_license.rb +1 -7
  224. data/lib/avo/plugin.rb +6 -0
  225. data/lib/avo/plugin_manager.rb +58 -0
  226. data/lib/avo/prefixed_test_helpers.rb +20 -0
  227. data/lib/avo/reloader.rb +3 -0
  228. data/lib/avo/resources/controls/actions_list.rb +6 -12
  229. data/lib/avo/resources/controls/attach_button.rb +15 -0
  230. data/lib/avo/resources/controls/back_button.rb +1 -1
  231. data/lib/avo/resources/controls/base_control.rb +15 -49
  232. data/lib/avo/resources/controls/create_button.rb +15 -0
  233. data/lib/avo/resources/controls/delete_button.rb +5 -1
  234. data/lib/avo/resources/controls/detach_button.rb +4 -1
  235. data/lib/avo/resources/controls/edit_button.rb +4 -1
  236. data/lib/avo/resources/controls/order_controls.rb +8 -0
  237. data/lib/avo/resources/controls/save_button.rb +13 -0
  238. data/lib/avo/resources/controls/show_button.rb +15 -0
  239. data/lib/avo/resources/items/holder.rb +76 -0
  240. data/lib/avo/resources/items/item_group.rb +48 -0
  241. data/lib/avo/resources/items/main_panel.rb +2 -0
  242. data/lib/avo/resources/items/panel.rb +2 -0
  243. data/lib/avo/resources/items/sidebar.rb +47 -0
  244. data/lib/avo/resources/items/tab.rb +60 -0
  245. data/lib/avo/resources/items/tab_group.rb +68 -0
  246. data/lib/avo/resources/resource_manager.rb +181 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +92 -0
  249. data/lib/avo/services/telemetry_service.rb +84 -0
  250. data/lib/avo/test_helpers.rb +362 -0
  251. data/lib/avo/tools/tool_manager.rb +30 -0
  252. data/lib/avo/version.rb +1 -1
  253. data/lib/avo.rb +7 -0
  254. data/lib/generators/avo/eject_generator.rb +0 -1
  255. data/lib/generators/avo/install_generator.rb +1 -11
  256. data/lib/generators/avo/resource_generator.rb +5 -23
  257. data/lib/generators/avo/scope_generator.rb +15 -0
  258. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  259. data/lib/generators/avo/templates/action.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  261. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  263. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  265. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  266. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  267. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  268. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  271. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  272. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  273. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  274. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  275. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  280. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  281. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  282. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  283. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  284. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  285. data/lib/generators/avo/templates/scope.tt +6 -0
  286. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  287. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  288. data/lib/generators/avo/templates/tool/view.tt +2 -2
  289. data/lib/tasks/avo_tasks.rake +22 -0
  290. metadata +82 -161
  291. data/app/assets/stylesheets/css/tags.css +0 -32
  292. data/app/assets/svgs/map-empty-state.svg +0 -35
  293. data/app/assets/svgs/map-view-type.svg +0 -3
  294. data/app/components/avo/card_component.html.erb +0 -46
  295. data/app/components/avo/card_component.rb +0 -25
  296. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  297. data/app/components/avo/dashboards/divider_component.rb +0 -19
  298. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  299. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  300. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  301. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  303. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  304. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  305. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  306. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  307. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  309. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  311. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  312. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  313. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  314. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  315. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  317. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  318. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  319. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  320. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  321. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  322. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  323. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  324. data/app/components/avo/index/ordering/base_component.rb +0 -9
  325. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  326. data/app/components/avo/index/ordering/button_component.rb +0 -23
  327. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  328. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  329. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  330. data/app/components/avo/index/resource_map_component.rb +0 -109
  331. data/app/components/avo/row_component.html.erb +0 -3
  332. data/app/components/avo/row_component.rb +0 -12
  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/reload_belongs_to_field_controller.js +0 -51
  340. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  341. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  342. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  343. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  344. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  345. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  346. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  347. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  348. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  349. data/app/views/avo/dashboards/show.html.erb +0 -38
  350. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  351. data/app/views/avo/partials/_global_search.html.erb +0 -19
  352. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  353. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  354. data/lib/avo/base_card.rb +0 -161
  355. data/lib/avo/concerns/fetches_things.rb +0 -150
  356. data/lib/avo/concerns/handles_field_args.rb +0 -47
  357. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  358. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  359. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  360. data/lib/avo/concerns/pagination.rb +0 -53
  361. data/lib/avo/concerns/policy_helpers.rb +0 -31
  362. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  363. data/lib/avo/concerns/visible_items.rb +0 -51
  364. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  365. data/lib/avo/dashboards/base_divider.rb +0 -35
  366. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  367. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  368. data/lib/avo/dashboards/metric_card.rb +0 -9
  369. data/lib/avo/dashboards/partial_card.rb +0 -7
  370. data/lib/avo/fields/area_field.rb +0 -39
  371. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  372. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  373. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  374. data/lib/avo/fields/location_field.rb +0 -86
  375. data/lib/avo/fields/tags_field.rb +0 -102
  376. data/lib/avo/hosts/association_scope_host.rb +0 -8
  377. data/lib/avo/hosts/base_host.rb +0 -25
  378. data/lib/avo/hosts/card_visibility.rb +0 -20
  379. data/lib/avo/hosts/dashboard_card.rb +0 -22
  380. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  381. data/lib/avo/hosts/ordering.rb +0 -22
  382. data/lib/avo/hosts/record_host.rb +0 -7
  383. data/lib/avo/hosts/resource_record_host.rb +0 -7
  384. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  385. data/lib/avo/hosts/search_scope_host.rb +0 -7
  386. data/lib/avo/hosts/view_record_host.rb +0 -7
  387. data/lib/avo/hosts/visibility_host.rb +0 -12
  388. data/lib/avo/items_holder.rb +0 -96
  389. data/lib/avo/main_panel.rb +0 -3
  390. data/lib/avo/menu/base_item.rb +0 -25
  391. data/lib/avo/menu/builder.rb +0 -82
  392. data/lib/avo/menu/dashboard.rb +0 -22
  393. data/lib/avo/menu/group.rb +0 -2
  394. data/lib/avo/menu/link.rb +0 -6
  395. data/lib/avo/menu/menu.rb +0 -2
  396. data/lib/avo/menu/resource.rb +0 -22
  397. data/lib/avo/menu/section.rb +0 -2
  398. data/lib/avo/panel.rb +0 -24
  399. data/lib/avo/panel_builder.rb +0 -25
  400. data/lib/avo/resources/controls/action.rb +0 -38
  401. data/lib/avo/resources/controls/execution_context.rb +0 -58
  402. data/lib/avo/resources/controls/items_holder.rb +0 -19
  403. data/lib/avo/resources/controls/link_to.rb +0 -27
  404. data/lib/avo/row.rb +0 -26
  405. data/lib/avo/row_builder.rb +0 -24
  406. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  407. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  408. data/lib/avo/sidebar.rb +0 -30
  409. data/lib/avo/sidebar_builder.rb +0 -24
  410. data/lib/avo/tab.rb +0 -72
  411. data/lib/avo/tab_builder.rb +0 -25
  412. data/lib/avo/tab_group.rb +0 -42
  413. data/lib/avo/tab_group_builder.rb +0 -43
  414. data/lib/avo/tools_manager.rb +0 -11
  415. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  416. data/public/avo-assets/avo.base.js +0 -1037
  417. data/public/avo-assets/avo.base.js.map +0 -7
@@ -1,8 +0,0 @@
1
- <%= turbo_stream.remove("new_via_belongs_to") %>
2
-
3
- <turbo-stream action="update-belongs-to"
4
- data-relation-name="<%= params[:via_relation] %>"
5
- data-target-resource-id="<%= @model.id %>"
6
- data-target-resource-label="<%= @resource.label %>"
7
- data-target-resource-class="<%= @model.class.name %>">
8
- </turbo-stream>
@@ -1,13 +0,0 @@
1
- <%= turbo_stream.replace(frame_id(@resource), template: "avo/base/new") %>
2
-
3
- <%= turbo_stream.append "alerts" do %>
4
- <%= render Avo::FlashAlertsComponent.new flashes: flash %>
5
- <% end %>
6
-
7
- <% if @model.errors.any? %>
8
- <%= turbo_stream.append("alerts") do %>
9
- <% @model.errors.full_messages.each do |message| %>
10
- <%= render Avo::AlertComponent.new :error, message %>
11
- <% end %>
12
- <% end %>
13
- <% end %>
@@ -1,3 +0,0 @@
1
- <div class="relative flex flex-col <%= @card.chartkick_classes %>">
2
- <%= send(@card.chart_type, @card.result_data, **@card.chartkick_options) %>
3
- </div>
@@ -1,5 +0,0 @@
1
- <div class="flex mt-4 items-end">
2
- <span class="text-3xl"><%= @card.prefix %></span>
3
- <span class="text-5xl"><%= @card.result_data %></span>
4
- <span class="text-3xl"><%= @card.suffix %></span>
5
- </div>
@@ -1,14 +0,0 @@
1
- <%= render Avo::TurboFrameWrapperComponent.new(params[:turbo_frame]) do %>
2
- <div class="w-full h-full flex items-center text-center">
3
- <div class="flex-1">
4
- Chartkick is missing.
5
- <a
6
- href="https://docs.avohq.io/2.0/upgrade.html#upgrade-from-2-17-to-2-18"
7
- target="_blank"
8
- >
9
- Manually require it in your
10
- <code class="inline">Gemfile</code>
11
- </a>.
12
- </div>
13
- </div>
14
- <% end %>
@@ -1,3 +0,0 @@
1
- <%= render Avo::TurboFrameWrapperComponent.new(params[:turbo_frame]) do %>
2
- <%= render Avo::CardComponent.new card: @card %>
3
- <% end %>
@@ -1,38 +0,0 @@
1
- <%= render Avo::PanelComponent.new(name: @dashboard.name, description: @dashboard.description) do |c| %>
2
- <% c.with_bare_content do %>
3
- <% if @dashboard.items.present? %>
4
- <div class="min-h-24">
5
- <%= content_tag(:div, class: "grid gap-4 grid-cols-1 #{@dashboard.classes}") do %>
6
- <% @dashboard.items.each do |item| %>
7
- <% if item.is_divider? %>
8
- <%= render Avo::Dashboards::DividerComponent.new(divider: item) %>
9
- <% elsif item.is_card? %>
10
- <%= content_tag(:div, class: "relative bg-white rounded shadow-panel space-y-2 #{item.card_classes} overflow-hidden") do %>
11
- <turbo-frame id="<%= item.turbo_frame %>"
12
- src="<%= item.frame_url(enforced_range: @range, params: params) %>"
13
- data-card-index="<%= item.index %>"
14
- >
15
- <%= render(Avo::LoadingComponent.new(title: item.label)) %>
16
- </turbo-frame>
17
- <% end %>
18
- <% end %>
19
- <% end %>
20
- <% end %>
21
- </div>
22
- <% else %>
23
- <div class="w-full h-full">
24
- <% if Rails.env.development? %>
25
- <%= render Avo::PanelComponent.new do |c| %>
26
- <% c.with_body do %>
27
- <div class="p-6">
28
- <%= t 'avo.empty_dashboard_message' %>. <%= link_to 'Docs', 'https://docs.avohq.io/2.0/dashboards.html', target: '_blank' %>
29
- </div>
30
- <% end %>
31
- <% end %>
32
- <% end %>
33
-
34
- <%= empty_state message: t('avo.no_cards_present') %>
35
- </div>
36
- <% end %>
37
- <% end %>
38
- <% end %>
@@ -1,3 +0,0 @@
1
- <%= turbo_stream.append "alerts" do %>
2
- <%= render Avo::FlashAlertsComponent.new flashes: flash.discard %>
3
- <% end %>
@@ -1,19 +0,0 @@
1
- <div data-controller="search" class="relative flex global-search rounded border border-gray-200 sm:min-w-[16rem]">
2
- <div class="flex-1 text-gray-500"
3
- data-search-target="autocomplete"
4
- data-search-resource="global"
5
- data-translation-keys='{"no_item_found": "<%= I18n.translate 'avo.no_item_found' %>", "placeholder": "<%= I18n.translate 'avo.search.placeholder' %>", "cancel_button": "<%= I18n.translate 'avo.search.cancel_button' %>"}'
6
- >
7
- </div>
8
- <div class="absolute top-1/2 hidden sm:inline-flex text-gray-400 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md cursor-pointer -translate-y-1/2 left-auto right-0 mr-4"
9
- data-search-target="button"
10
- >
11
- <span class="sr-only">Press </span>
12
- <kbd class="font-sans">
13
- <abbr title="Command" class="no-underline pc:hidden">⌘</abbr>
14
- <abbr title="CTRL" class="no-underline mac:hidden">CTRL +&nbsp; </abbr>
15
- </kbd>
16
- <span class="sr-only"> and </span>
17
- <kbd class="font-sans">K</kbd><span class="sr-only"> to search</span>
18
- </div>
19
- </div>
@@ -1,2 +0,0 @@
1
- <%# Example link below %>
2
- <%#= render Avo::ProfileItemComponent.new label: 'Profile', path: '/profile', icon: 'user-circle' %>
@@ -1,6 +0,0 @@
1
- <% if license[:id] == 'pro' and license[:valid] == false %>
2
- <%= render_license_warning title: 'Trial Mode', message: 'You are experiencing paid features that need to be licensed before deploying this site. Enjoy!' %>
3
- <% end %>
4
- <% if license[:error].present? && !(Avo.configuration.display_license_request_timeout_error === false && license[:error] === "Request timeout.") %>
5
- <%= render_license_warning title: 'Avo HQ Error', message: "#{license[:error]} Checking back every 5 minutes." %>
6
- <% end %>
data/lib/avo/base_card.rb DELETED
@@ -1,161 +0,0 @@
1
- module Avo
2
- class BaseCard
3
- include Avo::Concerns::VisibleInDashboard
4
-
5
- class_attribute :id
6
- class_attribute :label
7
- class_attribute :description
8
- class_attribute :cols, default: 1
9
- class_attribute :rows, default: 1
10
- class_attribute :initial_range
11
- class_attribute :ranges, default: []
12
- class_attribute :refresh_every
13
- class_attribute :display_header, default: true
14
- # private
15
- class_attribute :result_data
16
- class_attribute :query_block
17
-
18
- attr_accessor :dashboard
19
- attr_accessor :options
20
- attr_accessor :arguments
21
- attr_accessor :index
22
- attr_accessor :params
23
-
24
- delegate :context, to: ::Avo::App
25
- delegate :current_user, to: ::Avo::App
26
- delegate :view_context, to: ::Avo::App
27
- delegate :params, to: ::Avo::App
28
- delegate :request, to: ::Avo::App
29
-
30
- class << self
31
- def query(&block)
32
- self.query_block = block
33
- end
34
- end
35
-
36
- def initialize(dashboard:, options: {}, arguments: {}, index: 0, cols: nil, rows: nil, label: nil, description: nil, refresh_every: nil, visible: nil)
37
- @dashboard = dashboard
38
- @options = options
39
- @arguments = arguments
40
- @index = index
41
- @cols = cols
42
- @rows = rows
43
- @label = label
44
- @refresh_every = refresh_every
45
- @description = description
46
- @visible = visible
47
- end
48
-
49
- def label
50
- return @label.to_s if @label.present?
51
- return self.class.label.to_s if self.class.label.present?
52
-
53
- self.class.id.to_s.humanize
54
- end
55
-
56
- def description
57
- @description || self.class.description
58
- end
59
-
60
- def refresh_every
61
- @refresh_every || self.class.refresh_every
62
- end
63
-
64
- def turbo_frame
65
- "#{dashboard.id}_#{id}"
66
- end
67
-
68
- def frame_url(enforced_range: nil, params: {})
69
- enforced_range ||= initial_range || ranges.first
70
-
71
- Avo::App.view_context.avo.dashboard_card_path(dashboard.id, id, turbo_frame: turbo_frame, index: index, range: enforced_range, **params.permit!)
72
- end
73
-
74
- def card_classes
75
- result = ""
76
-
77
- # Writing down the classes so TailwindCSS knows not to purge them
78
- classes_for_cols = {
79
- 1 => " sm:col-span-1",
80
- 2 => " sm:col-span-2",
81
- 3 => " sm:col-span-3",
82
- 4 => " sm:col-span-4",
83
- 5 => " sm:col-span-5",
84
- 6 => " sm:col-span-6"
85
- }
86
-
87
- classes_for_rows = {
88
- 1 => " h-36",
89
- 2 => " h-72",
90
- 3 => " h-[27rem]",
91
- 4 => " h-[36rem]",
92
- 5 => " h-[45rem]",
93
- 6 => " h-[54rem]"
94
- }
95
-
96
- result += classes_for_cols[cols.to_i] if classes_for_cols[cols.to_i].present?
97
- result += classes_for_rows[rows.to_i] if classes_for_rows[rows.to_i].present?
98
-
99
- result
100
- end
101
-
102
- def type
103
- return :metric if is_a?(::Avo::Dashboards::MetricCard)
104
- return :chartkick if is_a?(::Avo::Dashboards::ChartkickCard)
105
- return :partial if is_a?(::Avo::Dashboards::PartialCard)
106
- end
107
-
108
- def compute_result
109
- Avo::Hosts::DashboardCard.new(card: self, dashboard: dashboard, params: params, context: context, range: range, options: options)
110
- .compute_result
111
-
112
- self
113
- end
114
-
115
- def hydrate(dashboard: nil)
116
- @dashboard = dashboard if dashboard.present?
117
-
118
- self
119
- end
120
-
121
- def range
122
- return params[:range] if params.dig(:range).present?
123
-
124
- return initial_range if initial_range.present?
125
-
126
- ranges.first
127
- end
128
-
129
- def result(data)
130
- self.result_data = data
131
-
132
- self
133
- end
134
-
135
- def is_card?
136
- true
137
- end
138
-
139
- def is_divider?
140
- false
141
- end
142
-
143
- def visible
144
- @visible || self.class.visible
145
- end
146
-
147
- def call_block
148
- ::Avo::Hosts::CardVisibility.new(block: visible, card: self, parent: dashboard).handle
149
- end
150
-
151
- private
152
-
153
- def cols
154
- @cols || self.class.cols
155
- end
156
-
157
- def rows
158
- @rows || self.class.rows
159
- end
160
- end
161
- end
@@ -1,150 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module FetchesThings
4
- extend ActiveSupport::Concern
5
-
6
- class_methods do
7
- # Returns the Avo dashboard by id
8
- #
9
- # get_dashboard_by_id(:dashy) -> Dashy
10
- def get_dashboard_by_id(id)
11
- dashboards.find do |dashboard|
12
- dashboard.id == id
13
- end
14
- end
15
-
16
- # Returns the Avo dashboard by name
17
- #
18
- # get_dashboard_by_name(:dashy) -> instance of Dashy
19
- def get_dashboard_by_name(name)
20
- dashboards.find do |dashboard|
21
- dashboard.name == name
22
- end
23
- end
24
-
25
- # Filters out the resources that are missing the model_class
26
- def valid_resources
27
- resources.select { |resource| resource.model_class.present? }.sort_by(&:name)
28
- end
29
-
30
- # Returns the Avo resource by camelized name
31
- #
32
- # get_resource_by_name('User') => instance of UserResource
33
- def get_resource(resource)
34
- possible_resource = "#{resource}Resource".gsub "ResourceResource", "Resource"
35
-
36
- resources.find do |available_resource|
37
- possible_resource.to_s == available_resource.class.to_s
38
- end
39
- end
40
-
41
- # Returns the Avo resource by singular snake_cased name
42
- #
43
- # get_resource_by_name('user') => instance of UserResource
44
- def get_resource_by_name(name)
45
- get_resource name.singularize.camelize
46
- end
47
-
48
- # Returns the Avo resource by singular snake_cased name
49
- # From all the resources that use the same model_class, it will fetch the first one in alphabetical order
50
- #
51
- # get_resource_by_name('User') => instance of UserResource
52
- # get_resource_by_name(User) => instance of UserResource
53
-
54
- def get_resource_by_model_name(klass)
55
- # Fetch the mappings imposed by the user.
56
- # If they are present, use those ones.
57
- mapping = get_mapping_for_model klass
58
- return get_resource(mapping) if mapping.present?
59
-
60
- valid_resources
61
- .find do |resource|
62
- resource.model_class.model_name.name == klass.to_s
63
- end
64
- end
65
-
66
- # Returns the Avo resource by singular snake_cased name
67
- #
68
- # get_resource_by_controller_name('delayed_backend_active_record_jobs') => instance of DelayedJobResource
69
- # get_resource_by_controller_name('users') => instance of UserResource
70
- def get_resource_by_controller_name(name)
71
- valid_resources
72
- .find do |resource|
73
- resource.model_class.to_s.pluralize.underscore.tr("/", "_") == name.to_s
74
- end
75
- end
76
-
77
- # Returns the Avo resource by some name
78
- def guess_resource(name)
79
- get_resource_by_name(name.to_s) || get_resource_by_model_name(name)
80
- end
81
-
82
- # Returns the Rails model class by singular snake_cased name
83
- #
84
- # get_model_class_by_name('user') => User
85
- def get_model_class_by_name(name)
86
- name.to_s.camelize.singularize
87
- end
88
-
89
- def get_available_resources(user = nil)
90
- valid_resources
91
- .select do |resource|
92
- resource.authorization.class.authorize(
93
- user,
94
- resource.model_class,
95
- Avo.configuration.authorization_methods.stringify_keys["index"],
96
- raise_exception: false
97
- )
98
- end
99
- .sort_by { |r| r.name }
100
- end
101
-
102
- def get_available_dashboards(user = nil)
103
- dashboards.sort_by { |r| r.name }
104
- end
105
-
106
- def resources_for_navigation(user = nil)
107
- get_available_resources(current_user)
108
- .select do |resource|
109
- resource.visible_on_sidebar
110
- end
111
- end
112
-
113
- def dashboards_for_navigation(user = nil)
114
- return [] if App.license.lacks_with_trial(:resource_ordering)
115
-
116
- get_available_dashboards(user).select do |dashboard|
117
- dashboard.is_visible?
118
- end
119
- end
120
-
121
- # Insert any partials that we find in app/views/avo/sidebar/items.
122
- def get_sidebar_partials
123
- Dir.glob(Rails.root.join("app", "views", "avo", "sidebar", "items", "*.html.erb"))
124
- .map do |path|
125
- File.basename path
126
- end
127
- .map do |filename|
128
- # remove the leading underscore (_)
129
- filename[0] = ""
130
- # remove the extension
131
- filename.gsub!(".html.erb", "")
132
- filename
133
- end
134
- end
135
-
136
- def tools_for_navigation
137
- return [] if Avo::App.license.lacks_with_trial(:custom_tools)
138
-
139
- get_sidebar_partials
140
- end
141
-
142
- private
143
-
144
- def get_mapping_for_model(klass)
145
- (Avo.configuration.model_resource_mapping || {}).stringify_keys.transform_values(&:to_s)[klass.to_s]
146
- end
147
- end
148
- end
149
- end
150
- end
@@ -1,47 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module HandlesFieldArgs
4
- extend ActiveSupport::Concern
5
-
6
- private
7
-
8
- # Add an instance variable from args
9
- # That may be a string, boolean, or array
10
- # Each args should also have a default value
11
- def add_prop_from_args(args = {}, name: nil, type: :string, default: nil)
12
- value = default
13
-
14
- if type == :boolean
15
- case args[name.to_sym]
16
- when nil
17
- value = default
18
- when false
19
- value = false
20
- when true
21
- value = true
22
- end
23
- else
24
- value = args[name.to_sym] unless args.dig(name.to_sym).nil?
25
- end
26
-
27
- instance_variable_set(:"@#{name}", value)
28
- end
29
-
30
- def add_boolean_prop(args, name, default = false)
31
- add_prop_from_args args, name: name, default: default, type: :boolean
32
- end
33
-
34
- def add_array_prop(args, name, default = [])
35
- add_prop_from_args args, name: name, default: default, type: :array
36
- end
37
-
38
- def add_object_prop(args, name, default = {})
39
- add_prop_from_args args, name: name, default: default, type: :object
40
- end
41
-
42
- def add_string_prop(args, name, default = nil)
43
- add_prop_from_args args, name: name, default: default, type: :string
44
- end
45
- end
46
- end
47
- end
@@ -1,15 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module HasActionStimulusControllers
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_attribute :stimulus_controllers, default: ""
8
- end
9
-
10
- def get_stimulus_controllers
11
- self.class.stimulus_controllers
12
- end
13
- end
14
- end
15
- end
@@ -1,34 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module HasEditableControls
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_attribute :show_controls
8
- class_attribute :show_controls_holder
9
- class_attribute :show_controls_holder_called, default: false
10
- end
11
-
12
- def has_show_controls?
13
- return false if ::Avo::App.license.lacks_with_trial(:resource_show_controls)
14
-
15
- self.class.show_controls.present?
16
- end
17
-
18
- def render_show_controls
19
- return [] if ::Avo::App.license.lacks_with_trial(:resource_show_controls)
20
-
21
- if show_controls.present?
22
- Avo::Resources::Controls::ExecutionContext.new(
23
- block: show_controls,
24
- resource: self,
25
- record: model,
26
- view: view
27
- ).handle&.items || []
28
- else
29
- []
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,123 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module HasHTMLAttributes
4
- extend ActiveSupport::Concern
5
-
6
- attr_reader :html
7
-
8
- # Used to get attributes for elements and views
9
- #
10
- # examples:
11
- # get_html :data, view: :edit, element: :input
12
- # get_html :classes, view: :show, element: :wrapper
13
- # get_html :styles, view: :index, element: :wrapper
14
- def get_html(name = nil, element:, view:)
15
- if [view, element].any?(&:nil?) || Avo::App.license.lacks_with_trial(:stimulus_js_integration)
16
- default_attribute_value name
17
- end
18
-
19
- parsed = parse_html
20
-
21
- attributes = if parsed.is_a? Hash
22
- get_html_from_hash name, element: element, hash: parsed, view: view
23
- elsif parsed.is_a? Avo::HTML::Builder
24
- get_html_from_block name, element: element, html_builder: parsed, view: view
25
- elsif parsed.nil?
26
- # Handle empty parsed by returning an empty state
27
- default_attribute_value name
28
- end
29
-
30
- add_action_data_attributes(attributes, name, element)
31
- add_resource_data_attributes(attributes, name, element, view)
32
-
33
- attributes
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: model, resource: resource, &@html)
46
- end
47
- end
48
-
49
- def default_attribute_value(name)
50
- name == :data ? {} : ""
51
- end
52
-
53
- def add_action_data_attributes(attributes, name, element)
54
- if can_add_stimulus_attributes_for?(action, attributes, name, element)
55
- attributes.merge!(stimulus_attributes_for(action))
56
- end
57
- end
58
-
59
- def add_resource_data_attributes(attributes, name, element, view)
60
- if can_add_stimulus_attributes_for?(resource, attributes, name, element) && view.in?([:edit, :new])
61
- resource_stimulus_attributes = stimulus_attributes_for(resource)
62
-
63
- attributes.merge!(resource_stimulus_attributes)
64
- end
65
- end
66
-
67
- def get_html_from_block(name = nil, element:, html_builder:, view:)
68
- values = []
69
-
70
- # get view ancestor
71
- values << html_builder.dig_stack(view, element, name)
72
- # get element ancestor
73
- values << html_builder.dig_stack(element, name)
74
- # get direct ancestor
75
- values << html_builder.dig_stack(name)
76
-
77
- values_type = if name == :data
78
- :hash
79
- else
80
- :string
81
- end
82
-
83
- merge_values_as(as: values_type, values: values)
84
- end
85
-
86
- def get_html_from_hash(name = nil, element:, hash:, view:)
87
- # @todo: what if this is not a Hash but a string?
88
- hash.dig(view, element, name) || {}
89
- end
90
-
91
- # Merge the values from all possible locations.
92
- # If the result is "blank", return nil so the attributes are not outputted to the DOM.
93
- #
94
- # Ex: if the style attribute is empty return `nil` instead of an empty space `" "`
95
- def merge_values_as(as: :array, values: [])
96
- result = if as == :array
97
- values.flatten
98
- elsif as == :string
99
- values.select do |value|
100
- value.is_a? String
101
- end.join " "
102
- elsif as == :hash
103
- values.reduce({}, :merge)
104
- end
105
-
106
- result if result.present?
107
- end
108
-
109
- def can_add_stimulus_attributes_for?(entity, attributes, name, element)
110
- !attributes.nil? && name == :data && element == :input && entity.present? && entity.respond_to?(:get_stimulus_controllers)
111
- end
112
-
113
- def stimulus_attributes_for(entity)
114
- entity.get_stimulus_controllers
115
- .split(" ")
116
- .map do |controller|
117
- [:"#{controller}-target", "#{id.to_s.underscore}_#{type.to_s.underscore}_input".camelize(:lower)]
118
- end
119
- .to_h
120
- end
121
- end
122
- end
123
- end