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
@@ -1,33 +1,31 @@
1
- <thead
2
- data-component-name="avo/partials/table_header"
3
- class="bg-white border-b border-gray-200 pb-1">
4
- <% if @resource.record_selector %>
1
+ <thead data-component-name="avo/partials/table_header" class="table-header-group">
2
+ <% if resource.record_selector %>
5
3
  <th class="rounded-lg" data-control="item-select-th">
6
4
  <%= content_tag :label, name: t("avo.select_all") do %>
7
5
  <%= content_tag :span, t("avo.select_all"), class: 'sr-only' %>
6
+
8
7
  <%= tag :input,
9
8
  type: "checkbox",
10
9
  name: t("avo.select_all"),
11
10
  title: t("avo.select_all"),
12
11
  autocomplete: :off,
13
- class: "mx-3 rounded w-4 h-4 checked:bg-primary-400 focus:checked:!bg-primary-400",
14
12
  data: {
15
13
  action: "input->item-select-all#toggle",
16
14
  item_select_all_target: "checkbox",
17
15
  tippy: "tooltip",
18
- }
19
- %>
16
+ } %>
20
17
  <% end %>
21
18
  </th>
22
19
  <% end %>
23
- <% if @resource.render_row_controls_on_the_left? %>
20
+
21
+ <% if resource.render_row_controls_on_the_left? %>
24
22
  <th class="max-w-24" data-control="resource-controls-th">
25
23
  <!-- Item controls cell -->
26
24
  </th>
27
25
  <% end %>
28
- <% fields.each_with_index do |field, index| %>
29
- <%
30
- first_option = Avo.configuration.first_sorting_option.to_s
26
+
27
+ <% fields.each_with_index do |field, index| %>
28
+ <% first_option = Avo.configuration.first_sorting_option.to_s
31
29
 
32
30
  if params[:sort_by] == field.id.to_s
33
31
  second_option = first_option == "desc" ? "asc" : "desc"
@@ -54,10 +52,10 @@
54
52
  sort_by = field.id
55
53
  sort_direction = first_option
56
54
  end
57
- text_classes = "text-gray-600 tracking-tight leading-tight text-xs font-semibold"
58
- %>
55
+ text_classes = "text-content-secondary tracking-tight leading-tight text-xs font-semibold" %>
56
+
59
57
  <%= content_tag :th,
60
- class: "relative text-left uppercase px-3 py-3 whitespace-nowrap rounded-l",
58
+ class: class_names("relative text-start px-2 py-2 whitespace-nowrap rounded-s", field.table_header_class),
61
59
  data: {
62
60
  control: "resource-field-th",
63
61
  controller: "toggle",
@@ -66,11 +64,12 @@
66
64
  } do %>
67
65
  <%= content_tag :div,
68
66
  class: "relative flex items-center justify-between w-full" do %>
69
- <% if field.sortable && @resource.sorting_supported? %>
67
+ <% if field.sortable && resource.sorting_supported? %>
70
68
  <%= link_to params.permit!.merge(sort_by: sort_by, sort_direction: sort_direction),
71
69
  class: class_names("flex-1 flex justify-between", text_classes),
72
70
  'data-turbo-frame': params[:turbo_frame] do %>
73
71
  <%= field.table_header_label %>
72
+
74
73
  <%= render partial: 'avo/partials/sortable_component', locals: {
75
74
  field: field,
76
75
  sort_tippy_content: I18n.t("avo.sort_#{sort_direction || "reset"}")
@@ -81,9 +80,14 @@
81
80
  <%= field.table_header_label %>
82
81
  <% end %>
83
82
  <% end %>
83
+
84
84
  <% if field.summarizable %>
85
- <div id="summary-header-<%= field.id %>" class="<%= text_classes %> cursor-pointer" data-action="click->toggle#togglePanel">
86
- <%= svg 'heroicons/solid/chart-bar', class: 'h-3 ml-1' %>
85
+ <div
86
+ id="summary-header-<%= field.id %>"
87
+ class="cursor-pointer <%= text_classes %>"
88
+ data-action="click->toggle#togglePanel"
89
+ >
90
+ <%= svg 'heroicons/solid/chart-bar', class: 'h-3 ms-1' %>
87
91
  </div>
88
92
  <turbo-frame
89
93
  id="summary-frame-<%= field.id %>"
@@ -97,8 +101,12 @@
97
101
  association_name: @field&.attribute_id
98
102
  }.compact
99
103
  ) %>"
100
- class="absolute inset-auto bg-white w-full sm:w-[400px] top-0 mt-6 p-4 z-40 shadow-modal rounded overflow-hidden hidden border border-gray-50"
104
+ class="
105
+ absolute inset-auto top-0 z-40 mt-6 w-full overflow-hidden rounded-sm border border-gray-50
106
+ bg-white p-4 shadow-modal sm:w-[400px]
107
+ "
101
108
  data-toggle-target="panel"
109
+ hidden
102
110
  >
103
111
  <%= render Avo::LoadingComponent.new %>
104
112
  </turbo-frame>
@@ -106,7 +114,8 @@
106
114
  <% end %>
107
115
  <% end %>
108
116
  <% end %>
109
- <% if @resource.render_row_controls_on_the_right? %>
117
+
118
+ <% if resource.render_row_controls_on_the_right? %>
110
119
  <th class="w-px max-w-24" data-control="resource-controls-th">
111
120
  <!-- Item controls cell -->
112
121
  </th>
@@ -1,43 +1,20 @@
1
1
  <% if available_view_types.count > 1 %>
2
- <%
3
- info = {
4
- table: {
5
- new_view_type: 'table',
6
- new_icon: "avo/table-view-type",
7
- translation_key: 'avo.table_view',
8
- },
9
- grid: {
10
- new_view_type: 'grid',
11
- new_icon: "avo/grid-view-type",
12
- translation_key: 'avo.grid_view',
13
- },
14
- list: {
15
- new_view_type: 'list',
16
- new_icon: 'queue-list',
17
- },
18
- map: {
19
- new_view_type: 'map',
20
- new_icon: "avo/map-view-type",
21
- translation_key: 'avo.map_view',
22
- },
23
- }
24
- %>
25
2
  <div class="flex">
26
3
  <div class="button-group">
27
4
  <% available_view_types.each do |type| %>
5
+ <% view_info = Avo.view_type_manager.find(type) %>
28
6
  <% is_active_view = view_type.to_s == type.to_s %>
29
7
 
30
8
  <%= a_link url_for(params.permit!.merge(view_type: type)).to_s,
31
- icon: info[type][:new_icon],
32
- color: is_active_view ? :primary : :gray,
33
- rounded: false,
34
- size: :sm,
35
- class: is_active_view ? "z-20" : "bg-gray-100 border-gray-300",
9
+ icon: is_active_view ? view_info&.[](:active_icon) : view_info&.[](:icon),
10
+ style: :primary,
11
+ class: is_active_view ? "button--active" : "",
36
12
  title: t('avo.switch_to_view', view_type: type),
37
13
  data: {
38
14
  tippy: 'tooltip',
39
15
  'turbo-frame': turbo_frame,
40
- control: "view-type-toggle-#{type}"
16
+ control: "view-type-toggle-#{type}",
17
+ is_active: is_active_view
41
18
  }
42
19
  %>
43
20
  <% end %>
@@ -3,13 +3,13 @@
3
3
  <ul class="col-span-5" id="<%= @field_id %>-summary">
4
4
  <% @values_summary.each_with_index do |(key, value), index| %>
5
5
  <li class="grid grid-cols-6 gap-3 items-center font-semibold text-sm text-gray-600 uppercase">
6
- <div class="flex items-center space-x-1 col-span-5 truncate">
6
+ <div class="flex items-center space-x-1 rtl:space-x-reverse col-span-5 truncate">
7
7
  <span class="<%= "inline-block w-[0.75rem] h-[0.75rem] rounded-full bg-[#{chart_color(index)}]" %>"></span>
8
8
  <span>
9
9
  <%= key %>
10
10
  </span>
11
11
  </div>
12
- <div class="col-span-1 text-right">
12
+ <div class="col-span-1 text-end">
13
13
  <%= value %>
14
14
  </div>
15
15
  </li>
@@ -1,8 +1,8 @@
1
1
  <%
2
- entities = [:button, :link]
3
- sizes = [:xl, :lg, :md, :sm, :xs].reverse
2
+ entities = [:link, :button]
3
+ sizes = [:lg, :md, :sm]
4
4
  styles = [:primary, :outline, :text]
5
- colors = [:primary, :blue, :gray, :red, :orange, :green]
5
+ colors = [nil, :primary, :accent, :blue, :gray, :red, :orange, :green, :teal, :cyan, :sky, :indigo, :violet, :purple, :fuchsia, :pink, :rose]
6
6
  states = [:regular, :hover, :disabled, :active]
7
7
  %>
8
8
  <div class="px-6 space-y-4">
@@ -14,16 +14,16 @@
14
14
  <div class="flex flex-col space-y-1">
15
15
  <% styles.each do |style| %>
16
16
  <% colors.each do |color| %>
17
- <% next if style == :primary && color != :primary %>
18
- <div class="flex space-x-1">
17
+ <%# next if style == :primary && color != :primary %>
18
+ <div class="flex space-x-1 rtl:space-x-reverse">
19
19
  <% states.each do |state| %>
20
20
  <%
21
21
  extra_classes = ""
22
22
  case state
23
23
  when :active
24
- extra_classes += " active"
24
+ extra_classes += " button--active button--hover"
25
25
  when :hover
26
- extra_classes += " hover"
26
+ extra_classes += " button--hover"
27
27
  end
28
28
  %>
29
29
  <%
@@ -32,7 +32,7 @@
32
32
  %>
33
33
  <% if entity == :link %>
34
34
  <div>
35
- <%= send a_button_or_link, '/admin/avo_private/design', **args do %>
35
+ <%= send a_button_or_link, 'javascript:void(0);', **args do %>
36
36
  <%= entity.to_s.humanize.capitalize %> <%= state %>
37
37
  <% end %>
38
38
  </div>
@@ -47,6 +47,10 @@
47
47
  </div>
48
48
  <% end %>
49
49
  <% end %>
50
+
51
+ <div class="flex self-center ms-2">
52
+ <%= color %>
53
+ </div>
50
54
  </div>
51
55
  <% end %>
52
56
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <div class="flex flex-col">
2
- <%= render Avo::PanelComponent.new(name: 'Welcome to Avo', description: 'This page is visible only in development. It will be hidden in other environments.') do |c| %>
3
- <% c.with_tools do %>
2
+ <%= render ui.panel(title: 'Welcome to Avo', description: 'This page is visible only in development. It will be hidden in other environments.') do |panel| %>
3
+ <% panel.with_controls do %>
4
4
  <%= a_link('/admin', icon: "heroicons/outline/arrow-left", color: :green, style: :primary, is_link: true) do %>
5
5
  Primary
6
6
  <% end %>
@@ -16,11 +16,15 @@
16
16
  <%= a_link('/admin', icon: "heroicons/outline/arrow-left", style: :text, color: :orange, is_link: true) do %>
17
17
  Text
18
18
  <% end %>
19
+
20
+ <%= a_link('/admin', color: :slate, style: :primary, is_link: true) do %>
21
+ Create entry
22
+ <% end %>
19
23
  <% end %>
20
24
 
21
- <% c.with_body do %>
25
+ <% panel.with_body do %>
22
26
  <div class="flex flex-col justify-between py-6 min-h-24">
23
- <%= render 'links_and_buttons' %>
27
+ <%= render partial: 'links_and_buttons' %>
24
28
  </div>
25
29
  <% end %>
26
30
  <% end %>
@@ -1,6 +1,6 @@
1
- <div class="w-10/12 ml-1/12 inset-auto bottom-0 z-50 my-4 opacity-50 hover:opacity-100 transition-opacity duration-150 group">
2
- <a href="https://avohq.io/pricing" target="_blank" class="rounded bg-green-700 text-white py-2 px-4 text-sm block group-hover:pt-4">
3
- <%= svg "avo/exclamation", class: 'h-6 inline mr-1 text-bold' %> <%= title %>
1
+ <div class="w-10/12 ms-1/12 inset-auto bottom-0 z-50 my-4 opacity-50 hover:opacity-100 transition-opacity duration-150 group">
2
+ <a href="https://avohq.io/pricing" target="_blank" class="rounded-sm bg-green-700 text-white py-2 px-4 text-sm block group-hover:pt-4">
3
+ <%= svg "avo/exclamation", class: 'h-6 inline me-1 text-bold' %> <%= title %>
4
4
  <div class="group-hover:block hidden py-2">
5
5
  <%= message %> <%= svg "avo/arrow-circle-right", class: "h-6 inline float-right" %>
6
6
  </div>
@@ -1,22 +1,25 @@
1
1
  <!DOCTYPE html>
2
+
2
3
  <!-- ✨ Built with Avo • https://www.avohq.io/ -->
3
- <html lang="<%= I18n.default_locale %>">
4
+ <html lang="<%= I18n.locale %>" dir="<%= text_direction %>">
4
5
  <head>
5
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
+
6
8
  <% if !Avo.configuration.turbo[:instant_click] %>
7
9
  <meta name="turbo-prefetch" content="false">
8
10
  <% end %>
11
+
9
12
  <%= display_meta_tags site: Avo.configuration.app_name, reverse: true, separator: "—" %>
10
13
  <%= csrf_meta_tags %>
11
14
  <%= csp_meta_tag %>
15
+ <%= favicon_link_tag "avo/favicon.ico" %>
12
16
  <%= render partial: "avo/partials/javascript" %>
13
17
  <%= render partial: "avo/partials/branding" %>
14
18
  <%= render partial: "avo/partials/pre_head" %>
15
19
  <%= render Avo::AssetManager::StylesheetComponent.new asset_manager: Avo.asset_manager %>
16
20
  <%= stylesheet_link_tag @stylesheet_assets_path, "data-turbo-track": "reload", as: "style" %>
17
21
 
18
- <% path = Avo::PACKED ? "/avo-assets/avo.base" : "avo.base" %>
19
- <%= javascript_include_tag path, "data-turbo-track": "reload", defer: true %>
22
+ <%= javascript_include_tag "avo/application", "data-turbo-track": "reload", defer: true %>
20
23
 
21
24
  <% if !Avo::PACKED && defined?(Hotwire::Livereload) %>
22
25
  <%= javascript_include_tag "hotwire-livereload", defer: true %>
@@ -24,35 +27,54 @@
24
27
 
25
28
  <%= render Avo::AssetManager::JavascriptComponent.new asset_manager: Avo.asset_manager %>
26
29
  <%= render partial: "avo/partials/head" %>
30
+ <%= render partial: 'avo/partials/color_theme_override' %>
27
31
  <%= content_for :head %>
28
32
  </head>
29
- <body class="bg-application os-mac floating-controls">
30
- <div class="relative flex flex-1 w-full min-h-full" data-controller="sidebar" data-sidebar-open-value="<%= @sidebar_open %>">
31
- <div class="flex-1 flex flex-col max-w-full">
33
+
34
+ <body class="<%= class_names("floating-controls bg-background", *body_classes, "all-fields-stacked": Avo.configuration.use_stacked_fields) %>">
35
+ <a href="#main-content" class="skip-to-content"><%= t("avo.skip_to_content") %></a>
36
+
37
+ <div
38
+ class="relative flex min-h-dvh w-full flex-1"
39
+ data-controller="sidebar"
40
+ data-sidebar-open-value="<%= @sidebar_open %>"
41
+ >
42
+ <div class="flex max-w-full flex-1 flex-col">
32
43
  <%= render partial: "avo/partials/navbar", locals: { resource: @resource } %>
33
- <div data-sidebar-target="mainArea" class="content-area flex-1 flex pt-16 relative <%= "sidebar-open" if @sidebar_open %>">
34
- <div class="hidden lg:flex">
35
- <%= render Avo::SidebarComponent.new sidebar_open: @sidebar_open %>
36
- </div>
44
+
45
+ <div data-sidebar-target="mainArea" class="main relative flex flex-1 <%= "sidebar-open" if @sidebar_open %>">
46
+ <div class="hidden lg:flex"><%= render Avo::SidebarComponent.new sidebar_open: @sidebar_open %></div>
47
+
37
48
  <div class="flex lg:hidden">
38
- <%= render Avo::SidebarComponent.new sidebar_open: false, for_mobile: true %>
49
+ <%= render Avo::SidebarComponent.new sidebar_open: @sidebar_open, for_mobile: true %>
39
50
  </div>
40
- <div class="main-content-area flex-1 flex flex-col min-h-full max-w-full">
41
- <div class="content p-4 lg:p-6 flex-1 flex flex-col justify-between items-stretch <%= container_classes %>">
42
- <%= render partial: "avo/partials/custom_tools_alert" %>
43
- <div class="flex flex-1 flex-col justify-between items-stretch space-y-8">
51
+
52
+ <main id="main-content" class="main-content-area" tabindex="-1">
53
+ <div class="mb-4">
54
+ <%= render Avo::BreadcrumbsComponent.new(items: avo_breadcrumbs) %>
55
+ </div>
56
+
57
+ <%= render partial: "avo/partials/custom_tools_alert" %>
58
+
59
+ <div class="scrollable-wrapper">
60
+ <div class="avo-container <%= container_classes %>">
44
61
  <%= yield.force_encoding("UTF-8") %>
45
- <%= render partial: "avo/partials/footer" %>
62
+
63
+ <div class="mt-8">
64
+ <%= render partial: "avo/partials/footer" %>
65
+ </div>
46
66
  </div>
47
67
  </div>
48
- </div>
68
+ </main>
49
69
  </div>
50
70
  </div>
51
71
  </div>
72
+
52
73
  <%= turbo_frame_tag Avo::MODAL_FRAME_ID %>
53
74
  <%= render partial: "avo/partials/alerts" %>
54
75
  <%= render partial: "avo/partials/scripts" %>
55
76
  <%= render partial: "avo/partials/confirm_dialog" %>
56
77
  </body>
57
78
  </html>
79
+
58
80
  <!-- ✨ Built with Avo • https://www.avohq.io/ -->
@@ -0,0 +1,7 @@
1
+ <%= turbo_frame_tag Avo::MODAL_FRAME_ID do %>
2
+ <%= render(Avo::ModalComponent.new(width: @modal_width, height: @modal_height, body_class: "bg-backgrund")) do |c| %>
3
+ <%= tag.div class: @wrapper_class do %>
4
+ <%= yield %>
5
+ <% end %>
6
+ <% end %>
7
+ <% end %>
data/avo.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.name = "avo"
9
9
  spec.version = Avo::VERSION
10
10
  spec.authors = ["Adrian Marin", "Mihai Marin", "Paul Bob"]
11
- spec.email = ["avo@avohq.io"]
11
+ spec.email = ["hi@avohq.io"]
12
12
  spec.homepage = "https://avohq.io"
13
13
  spec.summary = "Admin panel framework and Content Management System for Ruby on Rails."
14
14
  spec.description = "Avo is a very custom Content Management System for Ruby on Rails that saves engineers and teams months of development time by building user interfaces and logic using configuration rather than traditional coding; When configuration is not enough, you can fallback to familiar Ruby on Rails code."
@@ -32,12 +32,11 @@ Gem::Specification.new do |spec|
32
32
  spec.post_install_message = "Thank you for using Avo 💪 Docs are available at https://docs.avohq.io"
33
33
 
34
34
  spec.files = Dir["{bin,app,config,db,lib,public}/**/*", "Rakefile", "README.md", "avo.gemspec", "Gemfile", "Gemfile.lock", "tailwind.preset.js", "tailwind.custom.js"]
35
- spec.files.reject! { |file_name| %w[application.js application.js.map app/assets/builds/avo.custom.js avo.custom.js.map].any? { |rejected_file| file_name.include? rejected_file } }
36
35
 
37
36
  spec.add_dependency "activerecord", ">= 6.1"
38
37
  spec.add_dependency "activesupport", ">= 6.1"
39
38
  spec.add_dependency "actionview", ">= 6.1"
40
- spec.add_dependency "pagy", ">= 7.0.0", "< 43"
39
+ spec.add_dependency "pagy", ">= 43.0"
41
40
  spec.add_dependency "zeitwerk", ">= 2.6.12"
42
41
  spec.add_dependency "active_link_to"
43
42
  spec.add_dependency "view_component", ">= 3.7.0"
@@ -46,6 +45,6 @@ Gem::Specification.new do |spec|
46
45
  spec.add_dependency "addressable"
47
46
  spec.add_dependency "meta-tags"
48
47
  spec.add_dependency "docile"
49
- spec.add_dependency "prop_initializer", ">= 0.3.0"
48
+ spec.add_dependency "prop_initializer", ">= 0.2.0"
50
49
  spec.add_dependency "avo-icons", ">= 0.1.1"
51
50
  end
@@ -3,7 +3,7 @@
3
3
  # The "main" locale.
4
4
  base_locale: en
5
5
  ## All available locales are inferred from the data by default. Alternatively, specify them explicitly:
6
- locales: [ar, de, en, es, fr, it, ja, nb, nl, nn, pl, pt-BR, pt, ro, ru, tr, uk, zh, zh-TW]
6
+ locales: [ar, de, en, es, fr, it, ja, nb, nl, nn, pl, pt-BR, pt, ro, ru, tr, ua, zh, zh-TW]
7
7
  ## Reporting locale, default: en. Available: en, ru.
8
8
  # internal_locale: en
9
9
 
@@ -0,0 +1 @@
1
+ pin "avo/application"
@@ -1,26 +1,6 @@
1
- require "pagy/extras/trim"
2
- require "pagy/extras/countless"
3
- require "pagy/extras/array"
4
- if ::Pagy::VERSION >= ::Gem::Version.new("9.0")
5
- require "pagy/extras/size"
1
+ if defined?(Pagy::I18n)
2
+ if Pagy::I18n.respond_to?(:pathnames)
3
+ # Load custom dictionaries that are not bundled by Pagy.
4
+ Pagy::I18n.pathnames << Avo::Engine.root.join("lib", "generators", "avo", "templates", "locales", "pagy")
5
+ end
6
6
  end
7
-
8
- # For locales without native pagy i18n support
9
- def pagy_locale_path(file_name)
10
- Avo::Engine.root.join("lib", "generators", "avo", "templates", "locales", "pagy", file_name)
11
- end
12
-
13
- extra_locales = [
14
- {locale: "en"},
15
- {locale: "es"},
16
- {locale: "fr"},
17
- {locale: "ja"},
18
- {locale: "nb"},
19
- {locale: "pt-BR"},
20
- {locale: "pt"},
21
- {locale: "tr"},
22
- {locale: "nn", filepath: pagy_locale_path("nn.yml")},
23
- {locale: "ro", filepath: pagy_locale_path("ro.yml")}
24
- ]
25
-
26
- Pagy::I18n.send(:build, *extra_locales)
@@ -1,7 +1,11 @@
1
1
  Avo::Resources::ResourceManager.fetch_resources.map do |resource|
2
2
  resources resource.route_key do
3
+ get :search, on: :collection
4
+
3
5
  member do
4
6
  get :preview
7
+ post :new
8
+ put :edit
5
9
  end
6
10
  end
7
11
  end
data/config/routes.rb CHANGED
@@ -10,7 +10,7 @@ Avo::Engine.routes.draw do
10
10
  post "/rails/active_storage/direct_uploads", to: "/active_storage/direct_uploads#create"
11
11
 
12
12
  scope "avo_api", as: "avo_api" do
13
- get "/search", to: "search#index"
13
+ # Only used for searchable fields
14
14
  get "/:resource_name/search", to: "search#show"
15
15
  post "/resources/:resource_name/:id/attachments/", to: "attachments#create"
16
16
  end
@@ -25,8 +25,8 @@ Avo::Engine.routes.draw do
25
25
  delete "/:resource_name/:id/active_storage_attachments/:attachment_name/:attachment_id", to: "attachments#destroy"
26
26
 
27
27
  # Actions
28
- get "/:resource_name(/:id)/actions/(:action_id)", to: "actions#show"
29
- post "/:resource_name(/:id)/actions/(:action_id)", to: "actions#handle"
28
+ get "/:resource_name(/:id)/actions/(:action_id)", to: "actions#show", as: "actions_show"
29
+ post "/:resource_name(/:id)/actions/(:action_id)", to: "actions#handle", as: "actions_handle"
30
30
 
31
31
  # Generate resource routes as below:
32
32
  # resources :posts
@@ -42,14 +42,13 @@ Avo::Engine.routes.draw do
42
42
 
43
43
  scope "/avo_private", as: "avo_private" do
44
44
  get "/status", to: "debug#status", as: "status"
45
- post "/status/send_to_hq", to: "debug#send_to_hq", as: "send_to_hq"
46
- get "/debug/report", to: "debug#report", as: "debug_report"
47
- post "/debug/refresh_license", to: "debug#refresh_license"
48
45
  end
49
46
 
50
- if Rails.env.development? || Rails.env.staging?
47
+ if Rails.env.development? || Rails.env.staging? || Rails.env.test?
51
48
  scope "/avo_private", as: "avo_private" do
52
49
  get "/design", to: "private#design"
53
50
  end
51
+
52
+ mount Lookbook::Engine, at: "/lookbook" if defined?(Lookbook)
54
53
  end
55
54
  end
data/db/factories.rb CHANGED
@@ -145,6 +145,20 @@ FactoryBot.define do
145
145
  body { Faker::Lorem.paragraphs(number: rand(1...3)).join("\n") }
146
146
  end
147
147
 
148
+ trait :with_avatar do
149
+ after(:create) do |event|
150
+ file = Rails.root.join("db", "seed_files", "dummy-image.jpg")
151
+ event.avatar.attach(io: file.open, filename: "dummy-image.jpg")
152
+ end
153
+ end
154
+
155
+ trait :with_cover do
156
+ after(:create) do |event|
157
+ file = Rails.root.join("db", "seed_files", "watch.jpg")
158
+ event.cover.attach(io: file.open, filename: "watch.jpg")
159
+ end
160
+ end
161
+
148
162
  factory :volunteer do
149
163
  name { Faker::Name.name }
150
164
  role { Faker::Job.title }
@@ -1,5 +1,7 @@
1
1
  module Avo
2
2
  class AssetManager
3
+ include ActionView::Helpers::AssetTagHelper
4
+
3
5
  attr_reader :stimulus_controllers
4
6
 
5
7
  def initialize
data/lib/avo/avatar.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avo
4
+ class Avatar < PhotoObject
5
+ def key = :avatar
6
+ end
7
+ end
@@ -9,10 +9,11 @@ module Avo
9
9
  end
10
10
 
11
11
  class_attribute :name, default: nil
12
+ class_attribute :description, default: nil
12
13
  class_attribute :message
13
14
  class_attribute :confirm_button_label
14
15
  class_attribute :cancel_button_label
15
- class_attribute :no_confirmation, default: false
16
+ class_attribute :confirmation, default: true
16
17
  class_attribute :standalone, default: false
17
18
  class_attribute :visible, default: -> {
18
19
  # Hide on the :new view by default
@@ -118,7 +119,7 @@ module Avo
118
119
  self.class.to_s.demodulize.underscore.humanize(keep_id_suffix: true)
119
120
  end
120
121
 
121
- def initialize(record: nil, resource: nil, user: nil, view: nil, arguments: {}, icon: :play, query: nil, index_query: nil)
122
+ def initialize(record: nil, resource: nil, user: nil, view: nil, arguments: {}, icon: "tabler/outline/player-play", query: nil, index_query: nil)
122
123
  @record = record
123
124
  @resource = resource
124
125
  @user = user
@@ -149,6 +150,17 @@ module Avo
149
150
  def fields
150
151
  end
151
152
 
153
+ def get_description
154
+ Avo::ExecutionContext.new(
155
+ target: self.class.description,
156
+ resource: @resource,
157
+ record: @record,
158
+ view: @view,
159
+ arguments: @arguments,
160
+ query: @query
161
+ ).handle
162
+ end
163
+
152
164
  def get_message
153
165
  Avo::ExecutionContext.new(
154
166
  target: self.class.message,
@@ -350,9 +362,9 @@ module Avo
350
362
  !enabled?
351
363
  end
352
364
 
353
- def no_confirmation?
365
+ def confirmation?
354
366
  Avo::ExecutionContext.new(
355
- target: no_confirmation,
367
+ target: confirmation,
356
368
  action: self,
357
369
  resource: @resource,
358
370
  view: @view,