avo 3.30.4 → 4.0.0.beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +18 -1
  3. data/Gemfile.lock +257 -174
  4. data/README.md +1 -1
  5. data/app/assets/builds/avo/application.css +13979 -0
  6. data/app/assets/builds/avo/application.js +1160 -0
  7. data/app/assets/builds/avo/application.js.map +7 -0
  8. data/app/assets/builds/avo/late-registration.js +2 -0
  9. data/app/assets/builds/avo/late-registration.js.map +7 -0
  10. data/app/assets/config/avo_manifest.js +2 -1
  11. data/app/assets/images/avo/placeholder.svg +1 -0
  12. data/app/assets/stylesheets/application.css +250 -0
  13. data/app/assets/stylesheets/css/button-group.css +23 -0
  14. data/app/assets/stylesheets/css/components/avatar.css +128 -0
  15. data/app/assets/stylesheets/css/components/breadcrumbs.css +43 -0
  16. data/app/assets/stylesheets/css/components/button.css +343 -0
  17. data/app/assets/stylesheets/css/components/color_scheme_switcher.css +226 -0
  18. data/app/assets/stylesheets/css/components/discreet_information.css +49 -0
  19. data/app/assets/stylesheets/css/components/field-wrapper.css +107 -0
  20. data/app/assets/stylesheets/css/components/grid.css +120 -0
  21. data/app/assets/stylesheets/css/components/input.css +312 -0
  22. data/app/assets/stylesheets/css/components/modal.css +228 -0
  23. data/app/assets/stylesheets/css/components/tooltip.css +25 -0
  24. data/app/assets/stylesheets/css/components/ui/badge.css +143 -0
  25. data/app/assets/stylesheets/css/components/ui/card.css +95 -0
  26. data/app/assets/stylesheets/css/components/ui/checkbox.css +50 -0
  27. data/app/assets/stylesheets/css/components/ui/description_list.css +3 -0
  28. data/app/assets/stylesheets/css/components/ui/dropdown.css +68 -0
  29. data/app/assets/stylesheets/css/components/ui/file_upload_input.css +94 -0
  30. data/app/assets/stylesheets/css/components/ui/file_upload_item.css +78 -0
  31. data/app/assets/stylesheets/css/components/ui/panel.css +59 -0
  32. data/app/assets/stylesheets/css/components/ui/panel_header.css +48 -0
  33. data/app/assets/stylesheets/css/components/ui/radio.css +22 -0
  34. data/app/assets/stylesheets/css/components/ui/tabs.css +74 -0
  35. data/app/assets/stylesheets/css/css-animations.css +54 -0
  36. data/app/assets/stylesheets/css/fields/code.css +75 -9
  37. data/app/assets/stylesheets/css/fields/easy-mde.css +7 -0
  38. data/app/assets/stylesheets/css/fields/key_value.css +97 -0
  39. data/app/assets/stylesheets/css/fields/progress.css +4 -4
  40. data/app/assets/stylesheets/css/fields/status.css +7 -1
  41. data/app/assets/stylesheets/css/fields/tags.css +33 -16
  42. data/app/assets/stylesheets/css/fields/tiptap.css +17 -15
  43. data/app/assets/stylesheets/css/fields/trix.css +62 -2
  44. data/app/assets/stylesheets/css/fonts.css +24 -24
  45. data/app/assets/stylesheets/css/layout.css +135 -0
  46. data/app/assets/stylesheets/css/pagination.css +114 -78
  47. data/app/assets/stylesheets/css/resource-controls.css +13 -0
  48. data/app/assets/stylesheets/css/search.css +22 -12
  49. data/app/assets/stylesheets/css/sidebar.css +310 -24
  50. data/app/assets/stylesheets/css/table.css +60 -0
  51. data/app/assets/stylesheets/css/tooltips.css +1 -1
  52. data/app/assets/stylesheets/css/typography.css +10 -1
  53. data/app/assets/stylesheets/css/variables.css +318 -0
  54. data/app/assets/svgs/avo/moon-plus-plus.svg +1 -0
  55. data/app/components/avo/actions_component.html.erb +30 -36
  56. data/app/components/avo/actions_component.rb +8 -11
  57. data/app/components/avo/alert_component.html.erb +3 -3
  58. data/app/components/avo/alert_component.rb +1 -1
  59. data/app/components/avo/asset_manager/javascript_component.html.erb +1 -2
  60. data/app/components/avo/backtrace_alert_component.html.erb +4 -4
  61. data/app/components/avo/base_component.rb +3 -4
  62. data/app/components/avo/breadcrumb_element_component.html.erb +17 -0
  63. data/app/components/avo/breadcrumb_element_component.rb +21 -0
  64. data/app/components/avo/breadcrumbs_component.html.erb +19 -0
  65. data/app/components/avo/breadcrumbs_component.rb +5 -0
  66. data/app/components/avo/button_component.rb +20 -126
  67. data/app/components/avo/clipboard_component.html.erb +3 -2
  68. data/app/components/avo/clipboard_component.rb +1 -1
  69. data/app/components/avo/component_missing_component.rb +11 -0
  70. data/app/components/avo/cover_component.html.erb +3 -0
  71. data/app/components/avo/cover_component.rb +25 -0
  72. data/app/components/avo/debug/status_component.html.erb +59 -0
  73. data/app/components/avo/debug/status_component.rb +30 -0
  74. data/app/components/avo/description_list_component.rb +11 -0
  75. data/app/components/avo/discreet_information_component.html.erb +31 -6
  76. data/app/components/avo/discreet_information_component.rb +23 -32
  77. data/app/components/avo/divider_component.html.erb +2 -2
  78. data/app/components/avo/empty_state_component.html.erb +2 -9
  79. data/app/components/avo/empty_state_component.rb +0 -8
  80. data/app/components/avo/field_wrapper_component.html.erb +21 -22
  81. data/app/components/avo/field_wrapper_component.rb +9 -18
  82. data/app/components/avo/fields/avatar_field/index_component.html.erb +9 -0
  83. data/app/components/avo/fields/avatar_field/index_component.rb +4 -0
  84. data/app/components/avo/fields/badge_field/index_component.html.erb +7 -1
  85. data/app/components/avo/fields/badge_field/show_component.html.erb +6 -1
  86. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +16 -14
  87. data/app/components/avo/fields/belongs_to_field/edit_component.rb +13 -3
  88. data/app/components/avo/fields/boolean_field/edit_component.html.erb +2 -2
  89. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +1 -1
  90. data/app/components/avo/fields/boolean_group_field/edit_component.rb +2 -3
  91. data/app/components/avo/fields/code_field/show_component.html.erb +1 -1
  92. data/app/components/avo/fields/common/boolean_check_component.rb +3 -3
  93. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  94. data/app/components/avo/fields/common/files/controls_component.html.erb +30 -27
  95. data/app/components/avo/fields/common/files/controls_component.rb +0 -1
  96. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +4 -5
  97. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +1 -1
  98. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +7 -19
  99. data/app/components/avo/fields/common/heading_component.html.erb +2 -2
  100. data/app/components/avo/fields/common/heading_component.rb +1 -1
  101. data/app/components/avo/fields/common/key_value_component.html.erb +20 -24
  102. data/app/components/avo/fields/common/nested_field_component.html.erb +1 -1
  103. data/app/components/avo/fields/common/nested_field_component.rb +1 -1
  104. data/app/components/avo/fields/common/progress_bar_component.html.erb +2 -2
  105. data/app/components/avo/fields/common/stars_component.html.erb +1 -1
  106. data/app/components/avo/fields/common/status_viewer_component.html.erb +4 -10
  107. data/app/components/avo/fields/date_field/edit_component.html.erb +14 -1
  108. data/app/components/avo/fields/date_time_field/edit_component.html.erb +3 -3
  109. data/app/components/avo/fields/easy_mde_field/show_component.html.erb +1 -1
  110. data/app/components/avo/fields/edit_component.rb +9 -5
  111. data/app/components/avo/fields/file_field/edit_component.html.erb +14 -6
  112. data/app/components/avo/fields/files_field/edit_component.html.erb +11 -4
  113. data/app/components/avo/fields/has_one_field/show_component.html.erb +10 -9
  114. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  115. data/app/components/avo/fields/heading_field/show_component.html.erb +2 -2
  116. data/app/components/avo/fields/password_field/edit_component.html.erb +5 -7
  117. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +1 -1
  118. data/app/components/avo/fields/radio_field/edit_component.html.erb +1 -1
  119. data/app/components/avo/fields/show_component.rb +4 -7
  120. data/app/components/avo/fields/stars_field/edit_component.html.erb +3 -4
  121. data/app/components/avo/fields/tags_field/edit_component.html.erb +1 -1
  122. data/app/components/avo/fields/tags_field/tag_component.html.erb +7 -8
  123. data/app/components/avo/fields/time_field/edit_component.html.erb +3 -3
  124. data/app/components/avo/fields/tiptap_field/edit_component.html.erb +11 -11
  125. data/app/components/avo/fields/tiptap_field/show_component.html.erb +4 -4
  126. data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
  127. data/app/components/avo/filters_component.html.erb +8 -16
  128. data/app/components/avo/index/field_wrapper_component.html.erb +9 -2
  129. data/app/components/avo/index/field_wrapper_component.rb +0 -16
  130. data/app/components/avo/index/grid_cover_empty_state_component.html.erb +16 -2
  131. data/app/components/avo/index/grid_cover_empty_state_component.rb +90 -0
  132. data/app/components/avo/index/grid_item_component.html.erb +29 -12
  133. data/app/components/avo/index/grid_item_component.rb +12 -10
  134. data/app/components/avo/index/resource_controls_component.html.erb +1 -1
  135. data/app/components/avo/index/resource_controls_component.rb +7 -17
  136. data/app/components/avo/index/resource_controls_dropdown_component.html.erb +3 -0
  137. data/app/components/avo/index/resource_controls_dropdown_component.rb +81 -0
  138. data/app/components/avo/index/table_row_component.html.erb +11 -11
  139. data/app/components/avo/items/panel_component.html.erb +8 -18
  140. data/app/components/avo/items/panel_component.rb +0 -20
  141. data/app/components/avo/items/switcher_component.html.erb +60 -1
  142. data/app/components/avo/items/switcher_component.rb +10 -5
  143. data/app/components/avo/items/visible_items_component.html.erb +2 -1
  144. data/app/components/avo/items/visible_items_component.rb +1 -0
  145. data/app/components/avo/media_library/item_details_component.html.erb +2 -2
  146. data/app/components/avo/media_library/list_component.html.erb +24 -19
  147. data/app/components/avo/media_library/list_component.rb +2 -2
  148. data/app/components/avo/media_library/list_item_component.html.erb +3 -3
  149. data/app/components/avo/modal_component.html.erb +52 -20
  150. data/app/components/avo/modal_component.rb +7 -12
  151. data/app/components/avo/paginator_component.html.erb +46 -33
  152. data/app/components/avo/paginator_component.rb +10 -5
  153. data/app/components/avo/panel_name_component.html.erb +1 -1
  154. data/app/components/avo/profile_item_component.html.erb +4 -4
  155. data/app/components/avo/profile_item_component.rb +2 -4
  156. data/app/components/avo/referrer_params_component.html.erb +1 -1
  157. data/app/components/avo/resource_component.rb +8 -19
  158. data/app/components/avo/resource_listing_component.html.erb +22 -0
  159. data/app/components/avo/resource_listing_component.rb +28 -0
  160. data/app/components/avo/resource_sidebar_component.html.erb +2 -2
  161. data/app/components/avo/resource_sidebar_component.rb +0 -4
  162. data/app/components/avo/row_component.html.erb +1 -1
  163. data/app/components/avo/row_selector_component.html.erb +2 -4
  164. data/app/components/avo/row_selector_component.rb +0 -1
  165. data/app/components/avo/search_overlay_component.html.erb +6 -0
  166. data/app/components/avo/search_overlay_component.rb +2 -0
  167. data/app/components/avo/sidebar/base_item_component.rb +9 -9
  168. data/app/components/avo/sidebar/group_component.html.erb +23 -27
  169. data/app/components/avo/sidebar/group_component.rb +4 -0
  170. data/app/components/avo/sidebar/link_component.html.erb +30 -7
  171. data/app/components/avo/sidebar/link_component.rb +30 -2
  172. data/app/components/avo/sidebar/section_component.html.erb +31 -11
  173. data/app/components/avo/sidebar/section_component.rb +1 -3
  174. data/app/components/avo/sidebar_component.html.erb +35 -36
  175. data/app/components/avo/sidebar_component.rb +16 -0
  176. data/app/components/avo/sidebar_profile_component.html.erb +27 -36
  177. data/app/components/avo/sidebar_profile_component.rb +14 -0
  178. data/app/components/avo/tab_group_component.html.erb +21 -9
  179. data/app/components/avo/tab_group_component.rb +54 -15
  180. data/app/components/avo/turbo_frame_wrapper_component.html.erb +4 -8
  181. data/app/components/avo/turbo_frame_wrapper_component.rb +9 -0
  182. data/app/components/avo/u_i/avatar_component.html.erb +11 -0
  183. data/app/components/avo/u_i/avatar_component.rb +61 -0
  184. data/app/components/avo/u_i/badge_component.html.erb +9 -0
  185. data/app/components/avo/u_i/badge_component.rb +35 -0
  186. data/app/components/avo/u_i/card_component.html.erb +29 -0
  187. data/app/components/avo/u_i/card_component.rb +65 -0
  188. data/app/components/avo/u_i/dropdown_component.html.erb +14 -0
  189. data/app/components/avo/u_i/dropdown_component.rb +26 -0
  190. data/app/components/avo/u_i/dropdown_menu_component.html.erb +16 -0
  191. data/app/components/avo/u_i/dropdown_menu_component.rb +8 -0
  192. data/app/components/avo/u_i/file_upload_input_component.html.erb +26 -0
  193. data/app/components/avo/u_i/file_upload_input_component.rb +15 -0
  194. data/app/components/avo/u_i/file_upload_item_component.html.erb +48 -0
  195. data/app/components/avo/u_i/file_upload_item_component.rb +17 -0
  196. data/app/components/avo/u_i/icon_button_component.html.erb +7 -0
  197. data/app/components/avo/u_i/icon_button_component.rb +22 -0
  198. data/app/components/avo/u_i/panel_component.html.erb +49 -0
  199. data/app/components/avo/u_i/panel_component.rb +29 -0
  200. data/app/components/avo/u_i/panel_header_component.html.erb +37 -0
  201. data/app/components/avo/u_i/panel_header_component.rb +24 -0
  202. data/app/components/avo/u_i/search_input_component.html.erb +28 -0
  203. data/app/components/avo/u_i/search_input_component.rb +12 -0
  204. data/app/components/avo/u_i/tabs/tab_component.html.erb +26 -0
  205. data/app/components/avo/u_i/tabs/tab_component.rb +25 -0
  206. data/app/components/avo/u_i/tabs/tabs_component.html.erb +7 -0
  207. data/app/components/avo/u_i/tabs/tabs_component.rb +13 -0
  208. data/app/components/avo/view_types/base_view_type_component.rb +26 -0
  209. data/app/components/avo/view_types/grid_component.html.erb +18 -0
  210. data/app/components/avo/view_types/grid_component.rb +4 -0
  211. data/app/components/avo/view_types/map_component.html.erb +17 -0
  212. data/app/components/avo/view_types/map_component.rb +110 -0
  213. data/app/components/avo/view_types/table_component.html.erb +63 -0
  214. data/app/components/avo/{index/resource_table_component.rb → view_types/table_component.rb} +1 -10
  215. data/app/components/avo/views/resource_edit_component.html.erb +12 -18
  216. data/app/components/avo/views/resource_edit_component.rb +1 -27
  217. data/app/components/avo/views/resource_index_component.html.erb +97 -74
  218. data/app/components/avo/views/resource_index_component.rb +23 -3
  219. data/app/components/avo/views/resource_show_component.html.erb +4 -2
  220. data/app/components/avo/views/resource_show_component.rb +1 -4
  221. data/app/controllers/avo/associations_controller.rb +1 -1
  222. data/app/controllers/avo/base_application_controller.rb +7 -5
  223. data/app/controllers/avo/base_controller.rb +139 -40
  224. data/app/controllers/avo/debug_controller.rb +0 -29
  225. data/app/controllers/avo/media_library_controller.rb +17 -1
  226. data/app/controllers/avo/search_controller.rb +5 -0
  227. data/app/controllers/concerns/avo/initializes_avo.rb +7 -8
  228. data/app/helpers/avo/application_helper.rb +60 -46
  229. data/app/helpers/avo/turbo_stream_actions_helper.rb +10 -1
  230. data/app/helpers/avo/url_helpers.rb +3 -2
  231. data/app/javascript/{avo.base.js → application.js} +9 -18
  232. data/app/javascript/js/application.js +40 -0
  233. data/app/javascript/js/controllers/action_controller.js +4 -4
  234. data/app/javascript/js/controllers/actions_overflow_controller.js +21 -6
  235. data/app/javascript/js/controllers/color_scheme_switcher_controller.js +226 -0
  236. data/app/javascript/js/controllers/dropdown_menu_controller.js +42 -0
  237. data/app/javascript/js/controllers/fields/code_field_controller.js +20 -3
  238. data/app/javascript/js/controllers/fields/easy_mde_controller.js +23 -1
  239. data/app/javascript/js/controllers/fields/key_value_controller.js +43 -39
  240. data/app/javascript/js/controllers/fields/panel_refresh_controller.js +4 -0
  241. data/app/javascript/js/controllers/fields/tags_field_controller.js +2 -2
  242. data/app/javascript/js/controllers/fields/tags_field_helpers.js +4 -6
  243. data/app/javascript/js/controllers/grid_cover_empty_state_controller.js +42 -0
  244. data/app/javascript/js/controllers/item_selector_controller.js +0 -2
  245. data/app/javascript/js/controllers/loading_button_controller.js +1 -5
  246. data/app/javascript/js/controllers/map_dark_mode_controller.js +131 -0
  247. data/app/javascript/js/controllers/menu_controller.js +38 -16
  248. data/app/javascript/js/controllers/modal_controller.js +16 -0
  249. data/app/javascript/js/controllers/modal_size_controller.js +83 -0
  250. data/app/javascript/js/controllers/nested_form_controller.js +2 -2
  251. data/app/javascript/js/controllers/password_visibility_controller.js +13 -0
  252. data/app/javascript/js/controllers/preview_controller.js +2 -2
  253. data/app/javascript/js/controllers/resource_search_controller.js +123 -0
  254. data/app/javascript/js/controllers/search_controller.js +10 -29
  255. data/app/javascript/js/controllers/sidebar_controller.js +29 -9
  256. data/app/javascript/js/controllers/table_row_controller.js +28 -0
  257. data/app/javascript/js/controllers/tippy_controller.js +1 -1
  258. data/app/javascript/js/controllers/toggle_controller.js +40 -5
  259. data/app/javascript/js/controllers.js +14 -2
  260. data/app/javascript/js/custom-stream-actions.js +10 -8
  261. data/app/views/avo/actions/show.html.erb +14 -10
  262. data/app/views/avo/base/_boolean_filter.html.erb +1 -1
  263. data/app/views/avo/base/_date_time_filter.html.erb +3 -3
  264. data/app/views/avo/base/_multiple_select_filter.html.erb +1 -1
  265. data/app/views/avo/base/_new_via_belongs_to.html.erb +2 -3
  266. data/app/views/avo/base/_text_filter.html.erb +1 -1
  267. data/app/views/avo/base/preview.html.erb +5 -4
  268. data/app/views/avo/debug/status.html.erb +5 -92
  269. data/app/views/avo/debug/status.text.erb +0 -2
  270. data/app/views/avo/home/_actions.html.erb +1 -1
  271. data/app/views/avo/home/_dashboards.html.erb +1 -1
  272. data/app/views/avo/home/_filters.html.erb +1 -1
  273. data/app/views/avo/home/_resources.html.erb +2 -2
  274. data/app/views/avo/home/failed_to_load.html.erb +2 -2
  275. data/app/views/avo/home/index.html.erb +25 -25
  276. data/app/views/avo/media_library/_form.html.erb +43 -28
  277. data/app/views/avo/media_library/show.html.erb +7 -3
  278. data/app/views/avo/modal/_size_selector.html.erb +46 -0
  279. data/app/views/avo/partials/_alerts.html.erb +1 -1
  280. data/app/views/avo/partials/_color_scheme_switcher.html.erb +106 -0
  281. data/app/views/avo/partials/_color_theme_override.html.erb +49 -0
  282. data/app/views/avo/partials/_confirm_dialog.html.erb +19 -17
  283. data/app/views/avo/partials/_custom_tools_alert.html.erb +6 -6
  284. data/app/views/avo/partials/_footer.html.erb +1 -1
  285. data/app/views/avo/partials/_header.html.erb +1 -1
  286. data/app/views/avo/partials/_javascript.html.erb +0 -2
  287. data/app/views/avo/partials/_navbar.html.erb +53 -8
  288. data/app/views/avo/partials/_sortable_component.html.erb +1 -1
  289. data/app/views/avo/partials/_table_header.html.erb +28 -19
  290. data/app/views/avo/partials/_view_toggle_button.html.erb +6 -29
  291. data/app/views/avo/partials/distribution_chart.html.erb +2 -2
  292. data/app/views/avo/private/_links_and_buttons.html.erb +12 -8
  293. data/app/views/avo/private/design.html.erb +8 -4
  294. data/app/views/avo/sidebar/_license_warning.html.erb +3 -3
  295. data/app/views/layouts/avo/application.html.erb +39 -17
  296. data/app/views/layouts/avo/modal.html.erb +7 -0
  297. data/avo.gemspec +3 -4
  298. data/config/i18n-tasks.yml +1 -1
  299. data/config/importmap.rb +1 -0
  300. data/config/initializers/pagy.rb +5 -25
  301. data/config/routes/dynamic_routes.rb +4 -0
  302. data/config/routes.rb +6 -7
  303. data/db/factories.rb +14 -0
  304. data/lib/avo/asset_manager.rb +2 -0
  305. data/lib/avo/avatar.rb +7 -0
  306. data/lib/avo/base_action.rb +16 -4
  307. data/lib/avo/concerns/breadcrumbs.rb +7 -66
  308. data/lib/avo/concerns/form_builder.rb +41 -0
  309. data/lib/avo/concerns/{has_profile_photo.rb → has_avatar.rb} +8 -4
  310. data/lib/avo/concerns/{has_cover_photo.rb → has_cover.rb} +4 -4
  311. data/lib/avo/concerns/has_description.rb +9 -0
  312. data/lib/avo/concerns/has_item_type.rb +6 -2
  313. data/lib/avo/concerns/has_items.rb +43 -58
  314. data/lib/avo/concerns/pagination.rb +29 -19
  315. data/lib/avo/concerns/row_controls_configuration.rb +22 -15
  316. data/lib/avo/configuration/branding.rb +7 -7
  317. data/lib/avo/configuration.rb +92 -45
  318. data/lib/avo/{cover_photo.rb → cover.rb} +2 -2
  319. data/lib/avo/current.rb +0 -11
  320. data/lib/avo/discreet_information.rb +52 -29
  321. data/lib/avo/dsl/field_parser.rb +1 -1
  322. data/lib/avo/engine.rb +41 -8
  323. data/lib/avo/error_manager.rb +1 -1
  324. data/lib/avo/fields/avatar_field.rb +19 -0
  325. data/lib/avo/fields/badge_field.rb +23 -3
  326. data/lib/avo/fields/base_field.rb +46 -1
  327. data/lib/avo/fields/concerns/dom_id.rb +17 -0
  328. data/lib/avo/fields/concerns/file_authorization.rb +4 -0
  329. data/lib/avo/fields/concerns/has_html_attributes.rb +1 -1
  330. data/lib/avo/fields/concerns/is_searchable.rb +2 -5
  331. data/lib/avo/fields/concerns/nested.rb +1 -1
  332. data/lib/avo/fields/files_field.rb +2 -2
  333. data/lib/avo/fields/frame_base_field.rb +2 -2
  334. data/lib/avo/fields/id_field.rb +5 -1
  335. data/lib/avo/fields/progress_bar_field.rb +1 -1
  336. data/lib/avo/fields/text_field.rb +1 -1
  337. data/lib/avo/photo_object.rb +12 -1
  338. data/lib/avo/plugin_manager.rb +4 -0
  339. data/lib/avo/resources/base.rb +33 -21
  340. data/lib/avo/resources/controls/actions_list.rb +3 -3
  341. data/lib/avo/resources/controls/base_control.rb +1 -1
  342. data/lib/avo/resources/items/card.rb +16 -0
  343. data/lib/avo/resources/items/header.rb +11 -0
  344. data/lib/avo/resources/items/holder.rb +18 -23
  345. data/lib/avo/resources/items/item_group.rb +5 -7
  346. data/lib/avo/resources/items/sidebar.rb +5 -9
  347. data/lib/avo/resources/items/tab.rb +8 -8
  348. data/lib/avo/resources/items/tab_group.rb +8 -10
  349. data/lib/avo/resources/resource_manager.rb +2 -1
  350. data/lib/avo/services/hq_reporter.rb +102 -0
  351. data/lib/avo/services/telemetry_service.rb +0 -1
  352. data/lib/avo/test_helpers.rb +36 -22
  353. data/lib/avo/u_i_instance.rb +60 -0
  354. data/lib/avo/version.rb +1 -1
  355. data/lib/avo/view_inquirer.rb +6 -1
  356. data/lib/avo/view_types/view_type_manager.rb +70 -0
  357. data/lib/avo.rb +30 -45
  358. data/lib/generators/avo/action_generator.rb +1 -1
  359. data/lib/generators/avo/resource_generator.rb +43 -0
  360. data/lib/generators/avo/resource_tool_generator.rb +1 -1
  361. data/lib/generators/avo/tailwindcss/install_generator.rb +0 -6
  362. data/lib/generators/avo/templates/cards/partial_card_partial.tt +1 -1
  363. data/lib/generators/avo/templates/initializer/avo.tt +7 -9
  364. data/lib/generators/avo/templates/locales/avo.ar.yml +25 -0
  365. data/lib/generators/avo/templates/locales/avo.de.yml +25 -0
  366. data/lib/generators/avo/templates/locales/avo.en.yml +25 -0
  367. data/lib/generators/avo/templates/locales/avo.es.yml +25 -0
  368. data/lib/generators/avo/templates/locales/avo.fr.yml +25 -0
  369. data/lib/generators/avo/templates/locales/avo.it.yml +25 -0
  370. data/lib/generators/avo/templates/locales/avo.ja.yml +25 -0
  371. data/lib/generators/avo/templates/locales/avo.nb.yml +25 -0
  372. data/lib/generators/avo/templates/locales/avo.nl.yml +25 -0
  373. data/lib/generators/avo/templates/locales/avo.nn.yml +25 -0
  374. data/lib/generators/avo/templates/locales/avo.pl.yml +25 -0
  375. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +25 -0
  376. data/lib/generators/avo/templates/locales/avo.pt.yml +25 -0
  377. data/lib/generators/avo/templates/locales/avo.ro.yml +25 -0
  378. data/lib/generators/avo/templates/locales/avo.ru.yml +25 -0
  379. data/lib/generators/avo/templates/locales/avo.tr.yml +25 -0
  380. data/lib/generators/avo/templates/locales/{avo.uk.yml → avo.ua.yml} +26 -1
  381. data/lib/generators/avo/templates/locales/avo.zh-TW.yml +25 -0
  382. data/lib/generators/avo/templates/locales/avo.zh.yml +25 -0
  383. data/lib/generators/avo/templates/resource/resource.tt +10 -1
  384. data/lib/generators/avo/templates/resource_tools/partial.tt +20 -22
  385. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +1 -3
  386. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +0 -7
  387. data/lib/generators/avo/templates/tool/view.tt +14 -16
  388. data/lib/generators/avo/tool_generator.rb +3 -3
  389. data/lib/generators/avo/version_generator.rb +1 -1
  390. data/lib/tasks/avo_tasks.rake +29 -25
  391. metadata +145 -97
  392. data/app/assets/stylesheets/avo.base.css +0 -130
  393. data/app/assets/stylesheets/css/breadcrumbs.css +0 -16
  394. data/app/assets/stylesheets/css/buttons.css +0 -19
  395. data/app/assets/stylesheets/css/tailwindcss/base.css +0 -1
  396. data/app/assets/stylesheets/css/tailwindcss/components.css +0 -1
  397. data/app/assets/stylesheets/css/tailwindcss/utilities.css +0 -1
  398. data/app/assets/svgs/avo/arrow-down.svg +0 -3
  399. data/app/assets/svgs/avo/arrow-up.svg +0 -3
  400. data/app/assets/svgs/avo/detach.svg +0 -8
  401. data/app/assets/svgs/avo/download-solid-reversed.svg +0 -3
  402. data/app/assets/svgs/avo/download-solid.svg +0 -3
  403. data/app/assets/svgs/avo/edit.svg +0 -5
  404. data/app/assets/svgs/avo/editor-bold.svg +0 -1
  405. data/app/assets/svgs/avo/editor-italic.svg +0 -1
  406. data/app/assets/svgs/avo/editor-link.svg +0 -1
  407. data/app/assets/svgs/avo/editor-list.svg +0 -1
  408. data/app/assets/svgs/avo/editor-strike.svg +0 -1
  409. data/app/assets/svgs/avo/editor-underline.svg +0 -1
  410. data/app/assets/svgs/avo/eye.svg +0 -1
  411. data/app/assets/svgs/avo/trash-sm.svg +0 -3
  412. data/app/assets/svgs/avo/trash.svg +0 -7
  413. data/app/components/avo/cover_photo_component.html.erb +0 -3
  414. data/app/components/avo/cover_photo_component.rb +0 -19
  415. data/app/components/avo/fields/common/badge_viewer_component.html.erb +0 -1
  416. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -33
  417. data/app/components/avo/index/resource_grid_component.html.erb +0 -23
  418. data/app/components/avo/index/resource_grid_component.rb +0 -10
  419. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  420. data/app/components/avo/index/resource_map_component.rb +0 -114
  421. data/app/components/avo/index/resource_table_component.html.erb +0 -52
  422. data/app/components/avo/panel_component.html.erb +0 -63
  423. data/app/components/avo/panel_component.rb +0 -43
  424. data/app/components/avo/panel_header_component.html.erb +0 -42
  425. data/app/components/avo/panel_header_component.rb +0 -31
  426. data/app/components/avo/profile_photo_component.html.erb +0 -6
  427. data/app/components/avo/profile_photo_component.rb +0 -9
  428. data/app/components/avo/sidebar/heading_component.html.erb +0 -21
  429. data/app/components/avo/sidebar/heading_component.rb +0 -9
  430. data/app/components/avo/tab_switcher_component.html.erb +0 -20
  431. data/app/components/avo/tab_switcher_component.rb +0 -45
  432. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  433. data/app/views/avo/debug/report.html.erb +0 -37
  434. data/app/views/avo/partials/_panel_breadcrumbs.html.erb +0 -3
  435. data/app/views/avo/partials/_resource_search.html.erb +0 -16
  436. data/lib/avo/licensing/community_license.rb +0 -6
  437. data/lib/avo/licensing/h_q.rb +0 -202
  438. data/lib/avo/licensing/license.rb +0 -76
  439. data/lib/avo/licensing/license_manager.rb +0 -24
  440. data/lib/avo/licensing/nil_license.rb +0 -14
  441. data/lib/avo/licensing/pro_license.rb +0 -20
  442. data/lib/avo/licensing/request.rb +0 -20
  443. data/lib/avo/profile_photo.rb +0 -7
  444. data/lib/avo/services/debug_service.rb +0 -107
  445. data/public/avo-assets/placeholder.svg +0 -1
  446. data/tailwind.preset.js +0 -171
  447. /data/{public/avo-assets → app/assets/images/avo}/favicon.ico +0 -0
  448. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-500.eot +0 -0
  449. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-500.svg +0 -0
  450. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-500.ttf +0 -0
  451. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-500.woff +0 -0
  452. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-500.woff2 +0 -0
  453. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-600.eot +0 -0
  454. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-600.svg +0 -0
  455. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-600.ttf +0 -0
  456. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-600.woff +0 -0
  457. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-600.woff2 +0 -0
  458. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-700.eot +0 -0
  459. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-700.svg +0 -0
  460. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-700.ttf +0 -0
  461. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-700.woff +0 -0
  462. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-700.woff2 +0 -0
  463. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-regular.eot +0 -0
  464. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-regular.svg +0 -0
  465. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-regular.ttf +0 -0
  466. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-regular.woff +0 -0
  467. /data/{public/avo-assets → app/assets/images/avo}/fonts/inter-v7-latin-regular.woff2 +0 -0
  468. /data/{public/avo-assets → app/assets/images/avo}/logo-on-white.png +0 -0
  469. /data/{public/avo-assets → app/assets/images/avo}/logo.png +0 -0
  470. /data/{public/avo-assets → app/assets/images/avo}/logomark.png +0 -0
@@ -20,6 +20,10 @@ module Avo
20
20
  authorize_file_action(:download)
21
21
  end
22
22
 
23
+ def can_reupload_file?
24
+ # TODO: Implement this when we have the reupload action
25
+ end
26
+
23
27
  private
24
28
 
25
29
  def authorize_file_action(action)
@@ -56,7 +56,7 @@ module Avo
56
56
  end
57
57
 
58
58
  def default_attribute_value(name)
59
- (name == :data) ? {} : nil
59
+ (name == :data) ? {} : ""
60
60
  end
61
61
 
62
62
  def add_action_data_attributes(attributes, name, element)
@@ -4,11 +4,8 @@ module Avo
4
4
  module IsSearchable
5
5
  extend ActiveSupport::Concern
6
6
 
7
- def is_searchable?
8
- return false unless defined?(Avo::Pro)
9
-
10
- @searchable && Avo.license.has_with_trial(:searchable_associations)
11
- end
7
+ # Don't remove, avo-pro hooks into this method to check if the field is searchable.
8
+ def is_searchable? = false
12
9
  end
13
10
  end
14
11
  end
@@ -27,7 +27,7 @@ module Avo
27
27
  def component_for_view(view = Avo::ViewInquirer.new("index"))
28
28
  view = Avo::ViewInquirer.new(view)
29
29
 
30
- nested_on?(view) ? Avo::Fields::Common::NestedFieldComponent : super(view)
30
+ nested_on?(view) ? Avo::Fields::Common::NestedFieldComponent : super
31
31
  end
32
32
 
33
33
  def nested_on?(view)
@@ -10,13 +10,13 @@ module Avo
10
10
  attr_reader :hide_view_type_switcher
11
11
 
12
12
  def initialize(id, **args, &block)
13
- super(id, **args, &block)
13
+ super
14
14
 
15
15
  @is_audio = args[:is_audio].present? ? args[:is_audio] : false
16
16
  @is_image = args[:is_image].present? ? args[:is_image] : @is_avatar
17
17
  @direct_upload = args[:direct_upload].present? ? args[:direct_upload] : false
18
18
  @accept = args[:accept].present? ? args[:accept] : nil
19
- @display_filename = args[:display_filename].nil? ? true : args[:display_filename]
19
+ @display_filename = args[:display_filename].nil? || args[:display_filename]
20
20
  @view_type = args[:view_type] || :grid
21
21
  @hide_view_type_switcher = args[:hide_view_type_switcher]
22
22
  end
@@ -7,7 +7,7 @@ module Avo
7
7
  include Avo::Concerns::HasDescription
8
8
 
9
9
  def initialize(id, **args, &block)
10
- super(id, **args, &block)
10
+ super
11
11
 
12
12
  @use_resource = args[:use_resource]
13
13
  @reloadable = args[:reloadable]
@@ -73,7 +73,7 @@ module Avo
73
73
  def component_for_view(view = Avo::ViewInquirer.new("index"))
74
74
  view = Avo::ViewInquirer.new("show") if view.in? %w[new create update edit]
75
75
 
76
- super(view)
76
+ super
77
77
  end
78
78
 
79
79
  def authorized?
@@ -8,12 +8,16 @@ module Avo
8
8
 
9
9
  hide_on :forms
10
10
 
11
- super(id, **args, &block)
11
+ super
12
12
 
13
13
  add_boolean_prop args, :sortable, true
14
14
 
15
15
  @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
16
16
  end
17
+
18
+ def name_override
19
+ "ID"
20
+ end
17
21
  end
18
22
  end
19
23
  end
@@ -7,7 +7,7 @@ module Avo
7
7
  attr_reader :value_suffix
8
8
 
9
9
  def initialize(name, **args, &block)
10
- super(name, **args, &block)
10
+ super
11
11
 
12
12
  @max = args[:max] || 100
13
13
  @step = args[:step] || 1
@@ -6,7 +6,7 @@ module Avo
6
6
  attr_reader :protocol
7
7
 
8
8
  def initialize(id, **args, &block)
9
- super(id, **args, &block)
9
+ super
10
10
 
11
11
  add_boolean_prop args, :link_to_record
12
12
  add_boolean_prop args, :as_html
@@ -20,7 +20,18 @@ class Avo::PhotoObject
20
20
  return unless options.fetch(:source, nil).present?
21
21
 
22
22
  if options[:source].is_a?(Symbol)
23
- record.send(options[:source])
23
+ return unless record.present?
24
+ return if record.new_record?
25
+
26
+ value = record.send(options[:source])
27
+
28
+ # On edit view, prefer the persisted attachment to avoid rendering
29
+ # temporary/unpersisted direct-upload values after a failed update.
30
+ if value.instance_of?(ActiveStorage::Attached::One) && view&.edit?
31
+ value = @resource.find_record(record.to_param).send(options[:source])
32
+ end
33
+
34
+ value
24
35
  elsif options[:source].respond_to?(:call)
25
36
  Avo::ExecutionContext.new(target: options[:source], record:, resource: @resource, view:).handle
26
37
  end
@@ -19,6 +19,10 @@ module Avo
19
19
  @plugins << Plugin.new(name:, priority: priority)
20
20
  end
21
21
 
22
+ def register_view_type(name, component:, icon:, active_icon:, translation_key: nil)
23
+ Avo.view_type_manager.register(name, component:, icon:, active_icon:, translation_key:)
24
+ end
25
+
22
26
  def register_field(method_name, klass)
23
27
  # Avo.boot method is executed multiple times.
24
28
  # During the first run, it correctly loads descendants of Avo::Fields::Base.
@@ -11,8 +11,8 @@ module Avo
11
11
  include Avo::Concerns::HasResourceStimulusControllers
12
12
  include Avo::Concerns::ModelClassConstantized
13
13
  include Avo::Concerns::HasDescription
14
- include Avo::Concerns::HasCoverPhoto
15
- include Avo::Concerns::HasProfilePhoto
14
+ include Avo::Concerns::HasCover
15
+ include Avo::Concerns::HasAvatar
16
16
  include Avo::Concerns::HasHelpers
17
17
  include Avo::Concerns::Hydration
18
18
  include Avo::Concerns::Pagination
@@ -53,7 +53,8 @@ module Avo
53
53
  attr_accessor :record
54
54
 
55
55
  class_attribute :id, default: :id
56
- class_attribute :title
56
+ class_attribute :title # TODO: extract this to HasTitle concern
57
+ class_attribute :icon
57
58
  class_attribute :search, default: {}
58
59
  class_attribute :includes, default: []
59
60
  class_attribute :attachments, default: []
@@ -109,18 +110,6 @@ module Avo
109
110
  delegate :t, to: ::I18n
110
111
  delegate :context, to: ::Avo::Current
111
112
 
112
- def action(action_class, arguments: {})
113
- deprecated_dsl_api __method__, "actions"
114
- end
115
-
116
- def filter(filter_class, arguments: {})
117
- deprecated_dsl_api __method__, "filters"
118
- end
119
-
120
- def scope(scope_class)
121
- deprecated_dsl_api __method__, "scopes"
122
- end
123
-
124
113
  # This resolves the scope when doing "where" queries (not find queries)
125
114
  #
126
115
  # It's used to apply the authorization feature.
@@ -205,6 +194,10 @@ module Avo
205
194
  end
206
195
  alias_method :singular_name, :name
207
196
 
197
+ def initials
198
+ name.to_s.split(" ").map(&:first).join("").first(2).upcase
199
+ end
200
+
208
201
  def plural_name
209
202
  name_from_translation_key(count: 2, default: name.pluralize)
210
203
  end
@@ -282,7 +275,7 @@ module Avo
282
275
  def initialize(record: nil, view: nil, user: nil, params: nil)
283
276
  @view = Avo::ViewInquirer.new(view) if view.present?
284
277
  @user = user if user.present?
285
- @params = params if params.present?
278
+ @params = params.presence || {}
286
279
 
287
280
  if record.present?
288
281
  @record = record
@@ -451,6 +444,25 @@ module Avo
451
444
  end
452
445
  end
453
446
 
447
+ def record_icon
448
+ fetch_record_icon.to_s
449
+ end
450
+
451
+ def fetch_record_icon
452
+ return icon if @record.nil?
453
+
454
+ # Get the icon from the record if icon is not set
455
+ return @record.try(:icon) if icon.nil?
456
+
457
+ # If the icon is a symbol, get the value from the record else execute the block/string
458
+ case icon
459
+ when Symbol
460
+ @record.send icon
461
+ when Proc
462
+ Avo::ExecutionContext.new(target: icon, resource: self, record: @record).handle
463
+ end
464
+ end
465
+
454
466
  def available_view_types
455
467
  @available_view_types ||= begin
456
468
  if self.class.view_types.present?
@@ -654,7 +666,7 @@ module Avo
654
666
  end
655
667
 
656
668
  def get_external_link
657
- return unless record.persisted?
669
+ return unless record&.persisted?
658
670
 
659
671
  Avo::ExecutionContext.new(target: external_link, resource: self, record: record).handle
660
672
  end
@@ -675,15 +687,15 @@ module Avo
675
687
 
676
688
  def view_type
677
689
  @view_type ||= if @params[:view_type].present?
678
- @params[:view_type]
690
+ Avo::ViewInquirer.new(@params[:view_type])
679
691
  elsif available_view_types.size == 1
680
- available_view_types.first
692
+ Avo::ViewInquirer.new(available_view_types.first)
681
693
  else
682
- Avo::ExecutionContext.new(
694
+ Avo::ViewInquirer.new(Avo::ExecutionContext.new(
683
695
  target: default_view_type || Avo.configuration.default_view_type,
684
696
  resource: self,
685
697
  view: @view
686
- ).handle
698
+ ).handle)
687
699
  end
688
700
  end
689
701
 
@@ -2,14 +2,14 @@ module Avo
2
2
  module Resources
3
3
  module Controls
4
4
  class ActionsList < BaseControl
5
- ACTIONS_LIST_DROPDOWN_ICON = "heroicons/outline/arrow-down-circle" unless defined?(ACTIONS_LIST_DROPDOWN_ICON)
5
+ ACTIONS_LIST_DROPDOWN_ICON = "tabler/outline/circle-arrow-down" unless defined?(ACTIONS_LIST_DROPDOWN_ICON)
6
6
 
7
7
  attr_reader :color, :exclude, :include, :style, :icon
8
8
 
9
9
  def initialize(**args)
10
- super(**args)
10
+ super
11
11
 
12
- @color = args[:color] || :primary
12
+ @color = args[:color]
13
13
  @exclude = args[:exclude] || []
14
14
  @include = args[:include] || []
15
15
  @style = args[:style] || :outline
@@ -10,7 +10,7 @@ module Avo
10
10
  @color = args[:color] || :gray
11
11
  @style = args[:style] || :text
12
12
  @icon = args[:icon]
13
- @icon_class = @style == :icon ? " text-gray-600 h-6 hover:text-gray-600" : ""
13
+ @icon_class = (@style == :icon) ? " text-gray-600 h-6 hover:text-gray-600" : ""
14
14
  @confirmation_message = args[:confirmation_message]
15
15
  @size = args[:size] || :md
16
16
  @as_index_control = args[:as_index_control]
@@ -0,0 +1,16 @@
1
+ class Avo::Resources::Items::Card < Avo::Resources::Items::ItemGroup
2
+ class Builder < Avo::Resources::Items::ItemGroup::Builder
3
+ include Avo::Concerns::HasFieldDiscovery
4
+
5
+ def initialize(parent:, title: nil, **args)
6
+ @card = Avo::Resources::Items::Card.new(title: title, **args)
7
+ @items_holder = Avo::Resources::Items::Holder.new(from: self.class, parent: parent)
8
+ end
9
+
10
+ # Fetch the card
11
+ def build
12
+ @card.items_holder = @items_holder
13
+ @card
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ class Avo::Resources::Items::Header
2
+ prepend Avo::Concerns::IsResourceItem
3
+
4
+ include Avo::Concerns::HasItemType
5
+
6
+ def initialize(**args)
7
+ @args = args
8
+ end
9
+
10
+ def visible? = true
11
+ end
@@ -29,7 +29,7 @@ class Avo::Resources::Items::Holder
29
29
  as = args.fetch(:as, nil)
30
30
 
31
31
  alert_type = :error
32
- message = "There's an invalid field configuration for this resource. <br/> <code class='px-1 py-px rounded bg-red-600'>field :#{field_name}, as: :#{as}</code>"
32
+ message = "There's an invalid field configuration for this resource. <br/> <code class='px-1 py-px rounded-sm bg-red-600'>field :#{field_name}, as: :#{as}</code>"
33
33
 
34
34
  if as == :markdown
35
35
  alert_type = :warning
@@ -49,14 +49,13 @@ class Avo::Resources::Items::Holder
49
49
  add_item field_parser.instance
50
50
  end
51
51
 
52
- def tabs(tab = nil, id: nil, name: nil, title: nil, description: nil, **args, &block)
52
+ def tabs(tab = nil, id: nil, title: nil, description: nil, **args, &block)
53
53
  if tab.present?
54
54
  add_item tab
55
55
  else
56
56
  add_item Avo::Resources::Items::TabGroup::Builder.parse_block(
57
57
  parent: @parent,
58
58
  id: id,
59
- name: name,
60
59
  title: title,
61
60
  description: description,
62
61
  **args,
@@ -65,28 +64,24 @@ class Avo::Resources::Items::Holder
65
64
  end
66
65
  end
67
66
 
68
- def tab(name, **args, &block)
69
- add_item Avo::Resources::Items::Tab::Builder.parse_block(name: name, parent: @parent, **args, &block)
67
+ def tab(title:, **args, &block)
68
+ add_item Avo::Resources::Items::Tab::Builder.parse_block(title: title, parent: @parent, **args, &block)
70
69
  end
71
70
 
72
- def cluster(**args, &block)
73
- add_item Avo::Resources::Items::Row::Builder.parse_block(parent: @parent, **args, &block)
71
+ def tool(klass, **args)
72
+ add_item klass.new(**args, view: parent.view, parent: parent)
74
73
  end
75
74
 
76
- # def row
77
- alias_method :row, :cluster
78
-
79
- def tool(klass, **args)
80
- add_item klass.new(**args, view: self.parent.view, parent: self.parent)
75
+ def panel(title: nil, **args, &block)
76
+ add_item Avo::Resources::Items::ItemGroup::Builder.parse_block(title: title, parent: @parent, **args, &block)
81
77
  end
82
78
 
83
- def panel(panel_name = nil, **args, &block)
84
- add_item Avo::Resources::Items::ItemGroup::Builder.parse_block(name: panel_name, parent: @parent, **args, &block)
79
+ def card(title: nil, **args, &block)
80
+ add_item Avo::Resources::Items::Card::Builder.parse_block(title: title, parent: @parent, **args, &block)
85
81
  end
86
82
 
87
- # The main panel is the one that also render the header of the resource with the breadcrumbs, the title and the controls.
88
- def main_panel(**args, &block)
89
- add_item Avo::Resources::Items::MainPanel::Builder.parse_block(name: "main_panel", parent: @parent, **args, &block)
83
+ def header(**args, &block)
84
+ add_item Avo::Resources::Items::Header.new(**args)
90
85
  end
91
86
 
92
87
  def sidebar(**args, &block)
@@ -95,6 +90,12 @@ class Avo::Resources::Items::Holder
95
90
  add_item Avo::Resources::Items::Sidebar::Builder.parse_block(parent: @parent, **args, &block)
96
91
  end
97
92
 
93
+ def check_sidebar_is_inside_a_panel
94
+ unless @from.eql?(Avo::Resources::Items::Panel::Builder) || @from.eql?(Avo::Resources::Items::MainPanel::Builder)
95
+ raise "The sidebar must be inside a panel."
96
+ end
97
+ end
98
+
98
99
  def add_item(instance)
99
100
  @items << instance
100
101
 
@@ -110,10 +111,4 @@ class Avo::Resources::Items::Holder
110
111
  def increment_order_index
111
112
  @items_index += 1
112
113
  end
113
-
114
- def check_sidebar_is_inside_a_panel
115
- unless @from.eql?(Avo::Resources::Items::Panel::Builder) || @from.eql?(Avo::Resources::Items::MainPanel::Builder)
116
- raise "The sidebar must be inside a panel."
117
- end
118
- end
119
114
  end
@@ -7,13 +7,13 @@ class Avo::Resources::Items::ItemGroup
7
7
  include Avo::Concerns::VisibleInDifferentViews
8
8
  include Avo::Concerns::IsVisible
9
9
 
10
- attr_reader :name
10
+ attr_reader :title
11
11
  attr_reader :description
12
12
 
13
13
  delegate :items, :add_item, to: :items_holder
14
14
 
15
- def initialize(name: nil, description: nil, view: nil, **args)
16
- @name = name
15
+ def initialize(title: nil, description: nil, view: nil, **args)
16
+ @title = title
17
17
  @view = Avo::ViewInquirer.new view
18
18
  @description = description
19
19
  @items_holder = Avo::Resources::Items::Holder.new
@@ -28,13 +28,11 @@ class Avo::Resources::Items::ItemGroup
28
28
 
29
29
  delegate :heading, to: :items_holder
30
30
  delegate :field, to: :items_holder
31
- delegate :row, to: :items_holder
32
- delegate :cluster, to: :items_holder
33
31
  delegate :items, to: :items_holder
34
32
  delegate :sidebar, to: :items_holder
35
33
 
36
- def initialize(parent:, name: nil, **args)
37
- @panel = Avo::Resources::Items::Panel.new(name: name, **args)
34
+ def initialize(parent:, title: nil, **args)
35
+ @panel = Avo::Resources::Items::Panel.new(title: title, **args)
38
36
  @items_holder = Avo::Resources::Items::Holder.new(from: self.class, parent: parent)
39
37
  end
40
38
 
@@ -9,22 +9,17 @@ class Avo::Resources::Items::Sidebar
9
9
 
10
10
  delegate :items, :add_item, to: :items_holder
11
11
 
12
- attr_reader :name
12
+ attr_reader :title
13
13
 
14
- def initialize(name: nil, view: nil, **args)
15
- @name = name
14
+ def initialize(title: nil, view: nil, **args)
15
+ @title = title
16
16
  @items_holder = Avo::Resources::Items::Holder.new
17
17
  @view = Avo::ViewInquirer.new view
18
- @panel_wrapper = args[:panel_wrapper].nil? ? true : args[:panel_wrapper]
19
18
  @args = args
20
19
 
21
20
  post_initialize if respond_to?(:post_initialize)
22
21
  end
23
22
 
24
- def panel_wrapper?
25
- @panel_wrapper
26
- end
27
-
28
23
  class Builder
29
24
  include Avo::Concerns::BorrowItemsHolder
30
25
  include Avo::Concerns::HasFieldDiscovery
@@ -33,8 +28,9 @@ class Avo::Resources::Items::Sidebar
33
28
  delegate :tool, to: :items_holder
34
29
  delegate :items, to: :items_holder
35
30
  delegate :heading, to: :items_holder
31
+ delegate :card, to: :items_holder
36
32
 
37
- def initialize(parent: , name: nil, **args)
33
+ def initialize(parent:, **args)
38
34
  @sidebar = Avo::Resources::Items::Sidebar.new(**args)
39
35
  @items_holder = Avo::Resources::Items::Holder.new(parent: parent)
40
36
  end
@@ -12,8 +12,8 @@ class Avo::Resources::Items::Tab
12
12
  attr_accessor :description
13
13
  attr_reader :lazy_load
14
14
 
15
- def initialize(name: nil, description: nil, view: nil, **args)
16
- @name = name
15
+ def initialize(title: nil, description: nil, view: nil, **args)
16
+ @title = title
17
17
  @description = description
18
18
  @items_holder = Avo::Resources::Items::Holder.new
19
19
  @view = Avo::ViewInquirer.new view
@@ -24,17 +24,17 @@ class Avo::Resources::Items::Tab
24
24
  post_initialize if respond_to?(:post_initialize)
25
25
  end
26
26
 
27
- def name
28
- Avo::ExecutionContext.new(target: @name).handle
27
+ def title
28
+ Avo::ExecutionContext.new(target: @title).handle
29
29
  end
30
30
 
31
31
  def id
32
- name.to_s.parameterize
32
+ title.to_s.parameterize
33
33
  end
34
34
  alias_method :to_param, :id
35
35
 
36
36
  def turbo_frame_id(parent: nil)
37
- digest_name = Digest::MD5.hexdigest(name)
37
+ digest_name = Digest::MD5.hexdigest(title)
38
38
  id = "#{Avo::Resources::Items::Tab.to_s.parameterize} #{digest_name}".parameterize
39
39
  return id if parent.nil?
40
40
 
@@ -49,8 +49,8 @@ class Avo::Resources::Items::Tab
49
49
  delegate :panel, to: :items_holder
50
50
  delegate :items, to: :items_holder
51
51
 
52
- def initialize(parent:, name: nil, **args)
53
- @tab = Avo::Resources::Items::Tab.new(name: name, **args)
52
+ def initialize(parent:, title: nil, **args)
53
+ @tab = Avo::Resources::Items::Tab.new(title: title, **args)
54
54
  @items_holder = Avo::Resources::Items::Holder.new(parent: parent)
55
55
  end
56
56
 
@@ -6,9 +6,9 @@ class Avo::Resources::Items::TabGroup
6
6
  include Avo::Concerns::IsVisible
7
7
  include Avo::Concerns::VisibleInDifferentViews
8
8
 
9
- attr_accessor :index, :style, :name, :title, :description
9
+ attr_accessor :index, :style, :title, :description
10
10
 
11
- def initialize(index: 0, view: nil, style: nil, title: nil, description: nil, id: nil, name: nil, **args)
11
+ def initialize(index: 0, view: nil, style: nil, title: nil, description: nil, id: nil, **args)
12
12
  @index = index
13
13
  @items_holder = Avo::Resources::Items::Holder.new
14
14
  @view = Avo::ViewInquirer.new view
@@ -16,7 +16,6 @@ class Avo::Resources::Items::TabGroup
16
16
  @title = title
17
17
  @description = description
18
18
  @id = id
19
- @name = name
20
19
  @args = args
21
20
  @visible = args[:visible]
22
21
 
@@ -24,11 +23,11 @@ class Avo::Resources::Items::TabGroup
24
23
  end
25
24
 
26
25
  # The user might assign an id to a group.
27
- # If not, we'll use the name.
26
+ # If not, we'll use the title.
28
27
  # If not, we'll use the index
29
28
  def id
30
29
  return @id if @id.present?
31
- return @name.parameterize if @name.present?
30
+ return @title.parameterize if @title.present?
32
31
 
33
32
  index
34
33
  end
@@ -51,14 +50,14 @@ class Avo::Resources::Items::TabGroup
51
50
  parsed = Avo::Dsl::FieldParser.new(id: field_name, order_index: @items_index, **args, &block).parse
52
51
  field_instance = parsed.instance
53
52
 
54
- name = field_instance.name
55
- tab = Avo::Resources::Items::Tab.new name: name
53
+ title = field_instance.name
54
+ tab = Avo::Resources::Items::Tab.new title: title
56
55
 
57
56
  if field_instance.has_own_panel?
58
57
  tab.items_holder.add_item parsed.instance
59
58
  else
60
59
  # If the field is not in a panel, create one and add it
61
- panel = Avo::Resources::Items::Panel.new name: name
60
+ panel = Avo::Resources::Items::Panel.new title: title
62
61
  panel.items_holder.add_item parsed.instance
63
62
  # Add that panel to the items_holder
64
63
  tab.items_holder.add_item panel
@@ -67,9 +66,8 @@ class Avo::Resources::Items::TabGroup
67
66
  @items_holder.tabs tab
68
67
  end
69
68
 
70
- def initialize(name:, id:, parent:, title: nil, description: nil, style: nil, **args)
69
+ def initialize(id:, parent:, title: nil, description: nil, style: nil, **args)
71
70
  @group = Avo::Resources::Items::TabGroup.new(
72
- name: name,
73
71
  id: id,
74
72
  style: style,
75
73
  title: title,
@@ -164,7 +164,8 @@ module Avo
164
164
  resource.model_class,
165
165
  Avo.configuration.authorization_methods.stringify_keys["index"],
166
166
  policy_class: resource.authorization_policy,
167
- raise_exception: false
167
+ raise_exception: false,
168
+ resource_class: resource.to_s
168
169
  )
169
170
  end
170
171
  .sort_by { |r| r.name }