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
@@ -12,85 +12,26 @@ module Avo
12
12
  extend ActiveSupport::Concern
13
13
 
14
14
  included do |base|
15
- helper HelperMethods
16
- extend ClassMethods
17
15
  helper_method :add_breadcrumb, :avo_breadcrumbs
18
16
  end
19
17
 
20
- Crumb = Struct.new(:name, :path) unless defined?(Crumb)
18
+ Crumb = Data.define(:title, :path, :avatar, :initials, :icon) unless defined?(Crumb)
21
19
 
22
20
  class Builder
23
- DEFAULT_SEPARATOR = " » ".freeze unless defined?(DEFAULT_SEPARATOR)
21
+ extend PropInitializer::Properties
22
+ prop :context, reader: :public
23
+ prop :options, reader: :public
24
24
 
25
- attr_reader :context, :options
26
-
27
- def initialize(context, options)
28
- @context = context
29
- @options = options
30
- end
31
-
32
- def render
33
- separator = options.fetch(:separator, DEFAULT_SEPARATOR)
34
- breadcrumbs.map(&method(:render_element)).join(separator)
35
- end
36
-
37
- private
38
-
39
- def breadcrumbs
40
- context.avo_breadcrumbs
41
- end
42
-
43
- def render_element(element)
44
- content = element.path.nil? ? compute_name(element) : context.link_to_unless_current(compute_name(element), compute_path(element))
45
- options[:tag] ? context.content_tag(options[:tag], content) : ERB::Util.h(content)
46
- end
47
-
48
- def compute_name(element)
49
- case name = element.name
50
- when Symbol
51
- context.send(name)
52
- when Proc
53
- Avo::ExecutionContext.new(target: name, context: context).handle
54
- else
55
- name.to_s
56
- end
57
- end
58
-
59
- def compute_path(element)
60
- case path = element.path
61
- when Symbol
62
- context.send(path)
63
- when Proc
64
- Avo::ExecutionContext.new(target: path, context: context).handle
65
- else
66
- context.url_for(path)
67
- end
68
- end
69
- end
70
-
71
- module ClassMethods
72
- def add_breadcrumb(name, path = nil)
73
- before_action(filter_options) do |controller|
74
- controller.send(:add_breadcrumb, name, path)
75
- end
76
- end
25
+ def breadcrumbs = context.avo_breadcrumbs
77
26
  end
78
27
 
79
- def add_breadcrumb(name, path = nil)
80
- avo_breadcrumbs << Crumb.new(name, path)
28
+ def add_breadcrumb(title: nil, path: nil, avatar: nil, initials: nil, icon: nil)
29
+ avo_breadcrumbs << Crumb.new(title:, path:, avatar:, initials:, icon:)
81
30
  end
82
31
 
83
32
  def avo_breadcrumbs
84
33
  @avo_breadcrumbs ||= []
85
34
  end
86
-
87
- module HelperMethods
88
- def render_avo_breadcrumbs(options = {}, &)
89
- builder = Builder.new(self, options)
90
- content = builder.render.html_safe
91
- block_given? ? capture(content, &) : content
92
- end
93
- end
94
35
  end
95
36
  end
96
37
  end
@@ -0,0 +1,41 @@
1
+ module Avo
2
+ module Concerns
3
+ module FormBuilder
4
+ def build_form(&block)
5
+ form_with model: @resource.record,
6
+ scope: @resource.form_scope,
7
+ url: form_url,
8
+ method: is_edit? ? :put : :post,
9
+ local: true,
10
+ html: {
11
+ novalidate: true,
12
+ data: {
13
+ controller: "form avo-reactive-fields",
14
+ action: "keydown.ctrl+enter->form#submit keydown.meta+enter->form#submit"
15
+ }
16
+ },
17
+ multipart: true, &block
18
+ end
19
+
20
+ def form_url
21
+ if is_edit?
22
+ helpers.resource_path(
23
+ record: @resource.record,
24
+ resource: @resource
25
+ )
26
+ else
27
+ helpers.resources_path(
28
+ resource: @resource,
29
+ via_relation_class: params[:via_relation_class],
30
+ via_relation: params[:via_relation],
31
+ via_record_id: params[:via_record_id]
32
+ )
33
+ end
34
+ end
35
+
36
+ def is_edit?
37
+ @view.in?(%w[edit update])
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,17 +1,21 @@
1
1
  # Adds the ability to set the visibility of an item in the execution context.
2
2
  module Avo
3
3
  module Concerns
4
- module HasProfilePhoto
4
+ module HasAvatar
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  class_methods do
8
8
  # Add class property to capture the settings
9
- attr_accessor :profile_photo
9
+ attr_accessor :avatar
10
10
  end
11
11
 
12
12
  # Add instance property to compute the options
13
- def profile_photo
14
- ProfilePhoto.new resource: self
13
+ def avatar
14
+ Avatar.new resource: self
15
+ end
16
+
17
+ def initials
18
+ record_title.split(" ").map(&:first).join("").first(2).upcase
15
19
  end
16
20
  end
17
21
  end
@@ -1,17 +1,17 @@
1
1
  # Adds the ability to set the visibility of an item in the execution context.
2
2
  module Avo
3
3
  module Concerns
4
- module HasCoverPhoto
4
+ module HasCover
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  class_methods do
8
8
  # Add class property to capture the settings
9
- attr_accessor :cover_photo
9
+ attr_accessor :cover
10
10
  end
11
11
 
12
12
  # Add instance property to compute the options
13
- def cover_photo
14
- Avo::CoverPhoto.new resource: self
13
+ def cover
14
+ Avo::Cover.new resource: self
15
15
  end
16
16
  end
17
17
  end
@@ -6,6 +6,7 @@ module Avo
6
6
 
7
7
  class_methods do
8
8
  attr_accessor :description
9
+ attr_accessor :discreet_description
9
10
  end
10
11
 
11
12
  def description(additional_attributes = {})
@@ -16,6 +17,14 @@ module Avo
16
17
  ).handle
17
18
  end
18
19
 
20
+ def discreet_description(additional_attributes = {})
21
+ Avo::ExecutionContext.new(
22
+ target: @discreet_description || self.class.discreet_description,
23
+ **description_attributes,
24
+ **additional_attributes
25
+ ).handle
26
+ end
27
+
19
28
  private
20
29
 
21
30
  # Override this method to add custom attributes to the description execution context.
@@ -14,8 +14,12 @@ module Avo
14
14
  self.class.ancestors.include?(Avo::Resources::Items::Panel)
15
15
  end
16
16
 
17
- def is_main_panel?
18
- self.class.ancestors.include?(Avo::Resources::Items::MainPanel)
17
+ def is_card?
18
+ self.class.ancestors.include?(Avo::Resources::Items::Card)
19
+ end
20
+
21
+ def is_header?
22
+ self.class.ancestors.include?(Avo::Resources::Items::Header)
19
23
  end
20
24
 
21
25
  def is_tool?
@@ -3,52 +3,18 @@ module Avo
3
3
  module HasItems
4
4
  extend ActiveSupport::Concern
5
5
 
6
- class_methods do
7
- def deprecated_dsl_api(name, method)
8
- message = "This API was deprecated. Please use the `#{name}` method inside the `#{method}` method."
9
- raise DeprecatedAPIError.new message
10
- end
11
-
12
- # DSL methods
13
- def field(name, as: :text, **args, &block)
14
- deprecated_dsl_api __method__, "fields"
15
- end
16
-
17
- def panel(name = nil, **args, &block)
18
- deprecated_dsl_api __method__, "fields"
19
- end
20
-
21
- def row(**args, &block)
22
- deprecated_dsl_api __method__, "fields"
23
- end
24
-
25
- def tabs(**args, &block)
26
- deprecated_dsl_api __method__, "fields"
27
- end
28
-
29
- def tool(klass, **args)
30
- deprecated_dsl_api __method__, "fields"
31
- end
32
-
33
- def sidebar(**args, &block)
34
- deprecated_dsl_api __method__, "fields"
35
- end
36
- # END DSL methods
37
- end
38
-
39
6
  attr_writer :items_holder
40
7
 
41
8
  delegate :invalid_fields, to: :items_holder
42
9
 
43
10
  delegate :field, to: :items_holder
44
11
  delegate :panel, to: :items_holder
45
- delegate :row, to: :items_holder
46
- delegate :cluster, to: :items_holder
12
+ delegate :card, to: :items_holder
47
13
  delegate :tabs, to: :items_holder
48
14
  delegate :tool, to: :items_holder
49
15
  delegate :heading, to: :items_holder
50
16
  delegate :sidebar, to: :items_holder
51
- delegate :main_panel, to: :items_holder
17
+ delegate :header, to: :items_holder
52
18
  delegate :collaboration_timeline, to: :items_holder
53
19
 
54
20
  def items_holder
@@ -87,11 +53,11 @@ module Avo
87
53
  next if item.nil?
88
54
 
89
55
  if only_root
90
- # When `item.is_main_panel? == true` then also `item.is_panel? == true`
91
- # But when only_root == true we want to extract main_panel items
92
- # In all other circumstances items will get extracted when checking for `item.is_panel?`
93
- if item.is_main_panel?
94
- fields << extract_fields(item)
56
+ # When only_root == true we want to extract the panel and card items
57
+ if item.is_panel? || item.is_card?
58
+ if item.visible_in_view?(view: view)
59
+ fields << extract_fields(item)
60
+ end
95
61
  end
96
62
  else
97
63
  # Dive into panels to fetch their fields
@@ -110,6 +76,10 @@ module Avo
110
76
  if item.is_sidebar?
111
77
  fields << extract_fields(item)
112
78
  end
79
+
80
+ if item.is_card?
81
+ fields << extract_fields(item)
82
+ end
113
83
  end
114
84
 
115
85
  if item.is_field?
@@ -207,25 +177,36 @@ module Avo
207
177
  # Slice when the item type changes from standalone to panel or vice-versa
208
178
  is_standalone?(prev) != is_standalone?(curr)
209
179
  end.to_a.map do |group|
210
- { elements: group, is_standalone: is_standalone?(group.first) }
180
+ {elements: group, is_standalone: is_standalone?(group.first)}
211
181
  end
212
182
 
213
- # Creates a main panel if it's missing and adds first standalone group of items if present
214
- if items.none? { |item| item.is_main_panel? }
215
- if (standalone_group = grouped_items.find { |group| group[:is_standalone] }).present?
216
- calculated_main_panel = Avo::Resources::Items::MainPanel.new
217
- hydrate_item calculated_main_panel
218
- calculated_main_panel.items_holder.items = standalone_group[:elements]
219
- grouped_items[grouped_items.index standalone_group] = { elements: [calculated_main_panel], is_standalone: false }
220
- end
183
+ # Add the header automatically as first item if the user didn't define one
184
+ # This is to ensure that the header is always present
185
+ if items.none? { |item| item.is_header? }
186
+ header = Avo::Resources::Items::Header.new
187
+ hydrate_item header
188
+ grouped_items.unshift({elements: [header], is_standalone: false})
221
189
  end
222
190
 
223
- # For each standalone group, wrap items in a panel
224
- grouped_items.select { |group| group[:is_standalone] }.each do |group|
225
- calculated_panel = Avo::Resources::Items::Panel.new
226
- calculated_panel.items_holder.items = group[:elements]
227
- hydrate_item calculated_panel
228
- group[:elements] = calculated_panel
191
+ # For each standalone group, wrap items in a panel and card
192
+ # If the resource has at least one panel defined, we compute nothing, user took control of the panels
193
+ if items.none? { |item| item.is_panel? }
194
+ grouped_items.select { |group| group[:is_standalone] }.each do |group|
195
+ calculated_panel = Avo::Resources::Items::Panel.new
196
+ hydrate_item calculated_panel
197
+
198
+ # Create a card
199
+ card = Avo::Resources::Items::Card.new
200
+ hydrate_item card
201
+
202
+ # Add the items to the card
203
+ card.items_holder.items = group[:elements]
204
+
205
+ # Add the card to the main panel
206
+ calculated_panel.items_holder.items = [card]
207
+
208
+ group[:elements] = calculated_panel
209
+ end
229
210
  end
230
211
 
231
212
  grouped_items.flat_map { |group| group[:elements] }
@@ -281,11 +262,15 @@ module Avo
281
262
  next true if item.is_a?(Avo::Resources::Items::TabGroup) ||
282
263
  item.is_a?(Avo::Resources::Items::Tab) ||
283
264
  item.is_heading? ||
284
- item.is_a?(Avo::Fields::LocationField)
265
+ item.is_a?(Avo::Fields::LocationField) ||
266
+ item.is_header?
285
267
 
286
268
  # Skip nested fields
287
269
  next true if item.try(:nested_on?, view)
288
270
 
271
+ # When the resource is a form, we want to show all items even if there is no setter method
272
+ next true if defined?(Avo::Forms::Core::Resources::FormResource) && try(:resource).is_a?(Avo::Forms::Core::Resources::FormResource)
273
+
289
274
  item.resource.record.respond_to?(:"#{item.try(:for_attribute) || item.id}=")
290
275
  end
291
276
  .select do |item|
@@ -329,7 +314,7 @@ module Avo
329
314
  # Extractable structures are panels, rows and sidebars
330
315
  # Sidebars are only extractable if they are not on the index view
331
316
  def extractable_structure?(structure)
332
- structure.is_panel? || structure.is_row? || (structure.is_sidebar? && !view.index?)
317
+ structure.is_panel? || structure.is_row? || structure.is_card? || (structure.is_sidebar? && !view.index?)
333
318
  end
334
319
 
335
320
  # Standalone items are fields that don't have their own panel
@@ -4,22 +4,14 @@ module Avo
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- include Pagy::Backend
7
+ include Pagy::Method
8
8
 
9
9
  class_attribute :pagination, default: {}
10
10
 
11
- unless defined? PAGINATION_METHOD
12
- PAGINATION_METHOD = {
13
- default: :pagy,
14
- countless: :pagy_countless,
15
- array: :pagy_array,
16
- }
17
- end
18
-
19
11
  unless defined? PAGINATION_DEFAULTS
20
12
  PAGINATION_DEFAULTS = {
21
13
  type: :default,
22
- size: ::Pagy::VERSION >= ::Gem::Version.new("9.0") ? 9 : [1, 2, 2, 1],
14
+ slots: 9,
23
15
  }
24
16
  end
25
17
  end
@@ -38,10 +30,10 @@ module Avo
38
30
 
39
31
  data_turbo_frame = "data-turbo-frame=\"#{CGI.escapeHTML(params[:turbo_frame]) if params[:turbo_frame]}\""
40
32
 
41
- # Perform pagination and fallback to first page on Pagy::OverflowError
33
+ # Perform pagination and fallback to first page on Pagy::RangeError.
42
34
  begin
43
35
  perform_pagination(index_params:, query:, data_turbo_frame:, extra_pagy_params:, **args)
44
- rescue Pagy::OverflowError
36
+ rescue Pagy::RangeError
45
37
  index_params[:page] = 1
46
38
  perform_pagination(index_params:, query:, data_turbo_frame:, extra_pagy_params:, **args)
47
39
  end
@@ -50,16 +42,34 @@ module Avo
50
42
  private
51
43
 
52
44
  def perform_pagination(index_params:, query:, data_turbo_frame:, extra_pagy_params:, **args)
53
- send PAGINATION_METHOD[pagination_type.to_sym],
45
+ pagy(
46
+ pagy_kind,
54
47
  query,
55
48
  **args,
56
49
  page: index_params[:page],
57
- items: index_params[:per_page], # Add per page in pagy < 9
58
- limit: index_params[:per_page], # Add per page in pagy >= 9
59
- link_extra: data_turbo_frame, # Add extra arguments in pagy 7.
60
- anchor_string: data_turbo_frame, # Add extra arguments in pagy 8.
61
- params: extra_pagy_params,
62
- size: pagination_hash[:size]
50
+ limit: index_params[:per_page],
51
+ anchor_string: data_turbo_frame,
52
+ querify: pagy_querify(extra_pagy_params),
53
+ slots: pagination_hash[:slots],
54
+ raise_range_error: true
55
+ )
56
+ end
57
+
58
+ def pagy_kind
59
+ case pagination_type.to_sym
60
+ when :countless
61
+ :countless
62
+ else
63
+ :offset
64
+ end
65
+ end
66
+
67
+ def pagy_querify(extra_pagy_params)
68
+ return nil if extra_pagy_params.blank?
69
+
70
+ lambda do |params_hash|
71
+ params_hash.merge!(extra_pagy_params.transform_keys(&:to_s))
72
+ end
63
73
  end
64
74
 
65
75
  def pagination_hash
@@ -26,21 +26,28 @@ module Avo
26
26
  end
27
27
 
28
28
  def row_controls_classes
29
- classes = "text-right whitespace-nowrap px-3"
30
-
31
- if render_row_controls_on_the_left?
32
- classes += " w-px"
33
- end
34
-
35
- if row_controls_configurations[:show_on_hover]
36
- classes += " opacity-0 group-hover:opacity-100"
37
- end
38
-
39
- if row_controls_configurations[:float]
40
- classes += " floating-row-controls sticky group-hover:bg-gray-50 bg-white inset-auto right-0"
41
- end
42
-
43
- classes
29
+ float_classes = "bg-primary
30
+ group-hover:bg-table-row-hover
31
+
32
+ sticky inset-auto end-0
33
+
34
+ before:content-[''] before:absolute before:z-10 before:inset-auto before:start-0 before:top-0 before:mt-0 before:-translate-x-full before:w-3 before:h-full
35
+ before:bg-gradient-to-r
36
+ before:from-transparent before:to-primary
37
+ group-hover:before:from-transparent group-hover:before:to-table-row-hover
38
+ "
39
+
40
+ # TODO: add this to the css classes above
41
+ # &:has([data-toggle-target="panel"]:not(.hidden)) {
42
+ # @apply z-30 opacity-100
43
+ # }
44
+
45
+ class_names(
46
+ "text-end whitespace-nowrap px-3",
47
+ "w-px": render_row_controls_on_the_left?,
48
+ "*:opacity-0 group-hover:*:opacity-100": row_controls_configurations[:show_on_hover],
49
+ "#{float_classes}": row_controls_configurations[:float]
50
+ )
44
51
  end
45
52
  end
46
53
  end
@@ -8,25 +8,25 @@ class Avo::Configuration::Branding
8
8
  @favicon = favicon
9
9
 
10
10
  @default_colors = {
11
- :background => "#F6F6F7",
11
+ :background => "#FAFAFA",
12
12
  100 => "206 231 248",
13
13
  400 => "57 158 229",
14
14
  500 => "8 134 222",
15
15
  600 => "6 107 178"
16
16
  }
17
17
  @default_chart_colors = ["#0B8AE2", "#34C683", "#FFBE4F", "#FF7676", "#2AB1EE", "#34C6A8", "#EC8CFF", "#80FF91", "#FFFC38", "#1BDBE8"]
18
- @default_logo = "/avo-assets/logo.png"
19
- @default_logomark = "/avo-assets/logomark.png"
20
- @default_placeholder = "/avo-assets/placeholder.svg"
21
- @default_favicon = "/avo-assets/favicon.ico"
18
+ @default_logo = "avo/logo.png"
19
+ @default_logomark = "avo/logomark.png"
20
+ @default_placeholder = "avo/placeholder.svg"
21
+ @default_favicon = "avo/favicon.ico"
22
22
  end
23
23
 
24
24
  def css_colors
25
25
  rgb_colors.map do |color, value|
26
26
  if color == :background
27
- "--color-application-#{color}: #{value};"
27
+ "--avo-color-application-background: #{value};"
28
28
  else
29
- "--color-primary-#{color}: #{value};"
29
+ "--avo-color-primary-#{color}: #{value};"
30
30
  end
31
31
  end.join("\n")
32
32
  end