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
@@ -56,13 +56,19 @@ export default class extends Controller {
56
56
  this.attachScrollVisibilityAnchor()
57
57
 
58
58
  // Restore sidebar scroll position
59
- if (this.sidebarScrollPosition && window.Avo.configuration.preserve_sidebar_scroll) {
59
+ if (this.sidebarScrollPosition) {
60
60
  document.querySelector('.avo-sidebar .mac-styled-scrollbar').scrollTo({
61
61
  top: this.sidebarScrollPosition,
62
62
  behavior: 'instant',
63
63
  })
64
64
  }
65
65
  this.rememberScrollPosition()
66
+
67
+ const isMobile = window.innerWidth < 1024
68
+ const isOpen = isMobile
69
+ ? this.mainAreaTarget.classList.contains('sidebar-mobile-open')
70
+ : this.mainAreaTarget.classList.contains('sidebar-open')
71
+ this.setToggleButtonsState(isOpen ? 'open' : 'closed')
66
72
  }
67
73
 
68
74
  rememberScrollPosition() {
@@ -77,9 +83,17 @@ export default class extends Controller {
77
83
  }
78
84
 
79
85
  attachScrollVisibilityAnchor() {
80
- if (window.Avo.configuration.focus_sidebar_menu_item) {
81
- scrollSidebarMenuItemIntoView()
82
- }
86
+ scrollSidebarMenuItemIntoView()
87
+ }
88
+
89
+ get toggleButtons() {
90
+ return document.querySelectorAll('[data-sidebar-toggle-icon]')
91
+ }
92
+
93
+ setToggleButtonsState(state) {
94
+ this.toggleButtons.forEach((button) => {
95
+ button.dataset.sidebarState = state
96
+ })
83
97
  }
84
98
 
85
99
  toggleSidebar() {
@@ -89,20 +103,26 @@ export default class extends Controller {
89
103
  this.mainAreaTarget.classList.toggle('sidebar-open')
90
104
 
91
105
  Cookies.set(this.cookieKey, this.newValue(Cookies.get(this.cookieKey)))
106
+
107
+ const isOpen = this.mainAreaTarget.classList.contains('sidebar-open')
108
+ this.setToggleButtonsState(isOpen ? 'open' : 'closed')
92
109
  }
93
110
 
94
111
  toggleSidebarOnMobile() {
95
112
  if (this.mobileSidebarTarget.classList.contains('hidden')) {
96
- this.mainAreaTarget.classList.remove('sidebar-open')
113
+ this.mainAreaTarget.classList.remove('sidebar-mobile-open')
97
114
  this.mobileSidebarTarget.classList.remove('hidden')
98
115
 
99
116
  // we force a reflow here because we remove then
100
- // immediately add the sidebar-open class
117
+ // immediately add the sidebar-mobile-open class
101
118
  // which doesn't give the browser enough time to apply the
102
119
  // transition.
103
- this.mainAreaTarget.offsetHeight;
120
+ this.mainAreaTarget.offsetHeight // eslint-disable-line no-unused-expressions
104
121
  }
105
- this.mainAreaTarget.classList.toggle('sidebar-open')
122
+ this.mainAreaTarget.classList.toggle('sidebar-mobile-open')
123
+
124
+ const isOpen = this.mainAreaTarget.classList.contains('sidebar-mobile-open')
125
+ this.setToggleButtonsState(isOpen ? 'open' : 'closed')
106
126
  }
107
127
 
108
128
  // private
@@ -110,7 +130,7 @@ export default class extends Controller {
110
130
  if (oldValue === undefined) {
111
131
  return '0'
112
132
  }
133
+
113
134
  return oldValue === '1' ? '0' : '1'
114
135
  }
115
-
116
136
  }
@@ -14,6 +14,34 @@ export default class extends Controller {
14
14
  this.element.removeEventListener('mousemove', this.boundHandleMouseMove)
15
15
  }
16
16
 
17
+ anchor = null
18
+
19
+ mouseEntered(event) {
20
+ const row = event.target.closest('tr')
21
+ const url = row.dataset.visitPath
22
+
23
+ if (url) {
24
+ this.anchor = this.createAnchor(url)
25
+ this.anchor.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true }))
26
+ }
27
+ }
28
+
29
+ mouseLeft() {
30
+ if (this.anchor) {
31
+ this.anchor.dispatchEvent(new MouseEvent('mouseleave', { bubbles: true }))
32
+ document.body.removeChild(this.anchor)
33
+ }
34
+ }
35
+
36
+ createAnchor(url) {
37
+ const anchor = document.createElement('a')
38
+ anchor.href = url
39
+ anchor.rel = 'noopener noreferrer'
40
+ document.body.appendChild(anchor)
41
+
42
+ return anchor
43
+ }
44
+
17
45
  visitRecord(event) {
18
46
  if (event.type !== 'click') {
19
47
  return
@@ -8,7 +8,7 @@ export default class extends Controller {
8
8
  this.tippyInstance = tippy(this.sourceTarget, {
9
9
  content: this.contentTarget.innerHTML,
10
10
  allowHTML: true,
11
- theme: 'light',
11
+ theme: 'basic',
12
12
  })
13
13
  }
14
14
 
@@ -1,5 +1,4 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
- import { leave, toggle } from 'el-transition'
3
2
  import { useClickOutside } from 'stimulus-use'
4
3
 
5
4
  export default class extends Controller {
@@ -16,29 +15,65 @@ export default class extends Controller {
16
15
 
17
16
  connect() {
18
17
  useClickOutside(this)
18
+ this.hideTimeout = null
19
19
  }
20
20
 
21
21
  clickOutside(e) {
22
22
  if (this.hasPanelTarget) {
23
23
  const isInExemptionContainer = this.hasExemptionContainersValue && this.exemptionContainerTargets.some((container) => container.contains(e.target))
24
24
 
25
- if (!isInExemptionContainer && !this.panelTarget.classList.contains('hidden')) {
26
- leave(this.panelTarget)
25
+ if (!isInExemptionContainer && !this.panelTarget.hasAttribute('hidden')) {
26
+ this.leave(this.panelTarget)
27
27
  }
28
28
  }
29
29
  }
30
30
 
31
31
  togglePanel() {
32
32
  if (this.hasPanelTarget) {
33
- toggle(this.panelTarget)
33
+ this.toggle(this.panelTarget)
34
34
  }
35
35
  }
36
36
 
37
+ showPanel() {
38
+ // Clear any pending hide timeout
39
+ if (this.hideTimeout) {
40
+ clearTimeout(this.hideTimeout)
41
+ this.hideTimeout = null
42
+ }
43
+
44
+ if (this.hasPanelTarget) {
45
+ this.panelTarget.removeAttribute('hidden')
46
+ }
47
+ }
48
+
49
+ hidePanel() {
50
+ // Clear any existing timeout
51
+ if (this.hideTimeout) {
52
+ clearTimeout(this.hideTimeout)
53
+ }
54
+
55
+ // Add a small delay before hiding to allow smooth transition from button to panel
56
+ this.hideTimeout = setTimeout(() => {
57
+ if (this.hasPanelTarget) {
58
+ this.panelTarget.setAttribute('hidden', true)
59
+ }
60
+ this.hideTimeout = null
61
+ }, 100)
62
+ }
63
+
64
+ toggle(element) {
65
+ element.toggleAttribute('hidden')
66
+ }
67
+
68
+ leave(element) {
69
+ element.setAttribute('hidden', true)
70
+ }
71
+
37
72
  outlet({ params }) {
38
73
  const { outlet } = params
39
74
 
40
75
  if (outlet && document.querySelector(outlet)) {
41
- document.querySelector(outlet).classList.toggle('hidden')
76
+ this.toggle(document.querySelector(outlet))
42
77
  }
43
78
  }
44
79
  }
@@ -9,23 +9,28 @@ import BooleanFilterController from './controllers/boolean_filter_controller'
9
9
  import CardFiltersController from './controllers/card_filters_controller'
10
10
  import ClearInputController from './controllers/fields/clear_input_controller'
11
11
  import CodeFieldController from './controllers/fields/code_field_controller'
12
+ import ColorSchemeSwitcherController from './controllers/color_scheme_switcher_controller'
12
13
  import CopyToClipboardController from './controllers/copy_to_clipboard_controller'
13
14
  import DashboardCardController from './controllers/dashboard_card_controller'
14
15
  import DateFieldController from './controllers/fields/date_field_controller'
15
16
  import DateTimeFilterController from './controllers/date_time_filter_controller'
17
+ import DropdownController from './controllers/dropdown_menu_controller'
16
18
  import EasyMdeController from './controllers/fields/easy_mde_controller'
17
19
  import FilterController from './controllers/filter_controller'
18
20
  import FormController from './controllers/form_controller'
21
+ import GridCoverEmptyStateController from './controllers/grid_cover_empty_state_controller'
19
22
  import HiddenInputController from './controllers/hidden_input_controller'
20
23
  import InputAutofocusController from './controllers/input_autofocus_controller'
21
24
  import ItemSelectAllController from './controllers/item_select_all_controller'
22
25
  import ItemSelectorController from './controllers/item_selector_controller'
23
26
  import KeyValueController from './controllers/fields/key_value_controller'
24
27
  import LoadingButtonController from './controllers/loading_button_controller'
28
+ import MapDarkModeController from './controllers/map_dark_mode_controller'
25
29
  import MediaLibraryAttachController from './controllers/media_library_attach_controller'
26
30
  import MediaLibraryController from './controllers/media_library_controller'
27
31
  import MenuController from './controllers/menu_controller'
28
32
  import ModalController from './controllers/modal_controller'
33
+ import ModalSizeController from './controllers/modal_size_controller'
29
34
  import MultipleSelectFilterController from './controllers/multiple_select_filter_controller'
30
35
  import NestedFormController from './controllers/nested_form_controller'
31
36
  import PanelRefreshController from './controllers/fields/panel_refresh_controller'
@@ -36,6 +41,7 @@ import RecordSelectorController from './controllers/record_selector_controller'
36
41
  import ReloadBelongsToFieldController from './controllers/fields/reload_belongs_to_field_controller'
37
42
  import ResourceEditController from './controllers/resource_edit_controller'
38
43
  import ResourceIndexController from './controllers/resource_index_controller'
44
+ import ResourceSearchController from './controllers/resource_search_controller'
39
45
  import ResourceShowController from './controllers/resource_show_controller'
40
46
  import SearchController from './controllers/search_controller'
41
47
  import SelectController from './controllers/select_controller'
@@ -43,6 +49,7 @@ import SelectFilterController from './controllers/select_filter_controller'
43
49
  import SelfDestroyController from './controllers/self_destroy_controller'
44
50
  import SidebarController from './controllers/sidebar_controller'
45
51
  import SignOutController from './controllers/sign_out_controller'
52
+ import StarsFieldController from './controllers/fields/stars_field_controller'
46
53
  import TableRowController from './controllers/table_row_controller'
47
54
  import TabsController from './controllers/tabs_controller'
48
55
  import TagsFieldController from './controllers/fields/tags_field_controller'
@@ -52,7 +59,6 @@ import TiptapFieldController from './controllers/fields/tiptap_field_controller'
52
59
  import ToggleController from './controllers/toggle_controller'
53
60
  import TrixBodyController from './controllers/trix_body_controller'
54
61
  import TrixFieldController from './controllers/fields/trix_field_controller'
55
- import StarsFieldController from './controllers/fields/stars_field_controller'
56
62
 
57
63
  application.register('action', ActionController)
58
64
  application.register('actions-overflow', ActionsOverflowController)
@@ -61,20 +67,24 @@ application.register('attachments', AttachmentsController)
61
67
  application.register('boolean-filter', BooleanFilterController)
62
68
  application.register('card-filters', CardFiltersController)
63
69
  application.register('clear-input', ClearInputController)
70
+ application.register('color-scheme-switcher', ColorSchemeSwitcherController)
64
71
  application.register('copy-to-clipboard', CopyToClipboardController)
65
72
  application.register('dashboard-card', DashboardCardController)
66
73
  application.register('date-time-filter', DateTimeFilterController)
67
74
  application.register('filter', FilterController)
68
75
  application.register('form', FormController)
76
+ application.register('grid-cover-empty-state', GridCoverEmptyStateController)
69
77
  application.register('hidden-input', HiddenInputController)
70
78
  application.register('input-autofocus', InputAutofocusController)
71
79
  application.register('item-select-all', ItemSelectAllController)
72
80
  application.register('item-selector', ItemSelectorController)
73
81
  application.register('loading-button', LoadingButtonController)
82
+ application.register('map-dark-mode', MapDarkModeController)
74
83
  application.register('media-library-attach', MediaLibraryAttachController)
75
84
  application.register('media-library', MediaLibraryController)
76
85
  application.register('menu', MenuController)
77
86
  application.register('modal', ModalController)
87
+ application.register('modal-size', ModalSizeController)
78
88
  application.register('multiple-select-filter', MultipleSelectFilterController)
79
89
  application.register('avo-nested-form', NestedFormController)
80
90
  application.register('panel-refresh', PanelRefreshController)
@@ -83,8 +93,8 @@ application.register('preview', PreviewController)
83
93
  application.register('record-selector', RecordSelectorController)
84
94
  application.register('resource-edit', ResourceEditController)
85
95
  application.register('resource-index', ResourceIndexController)
96
+ application.register('resource-search', ResourceSearchController)
86
97
  application.register('resource-show', ResourceShowController)
87
- application.register('search', SearchController)
88
98
  application.register('select-filter', SelectFilterController)
89
99
  application.register('select', SelectController)
90
100
  application.register('self-destroy', SelfDestroyController)
@@ -95,7 +105,9 @@ application.register('tabs', TabsController)
95
105
  application.register('text-filter', TextFilterController)
96
106
  application.register('tippy', TippyController)
97
107
  application.register('toggle', ToggleController)
108
+ application.register('dropdown-menu', DropdownController)
98
109
  application.register('trix-body', TrixBodyController)
110
+ application.register('search', SearchController)
99
111
 
100
112
  // Field controllers
101
113
  application.register('belongs-to-field', BelongsToFieldController)
@@ -5,20 +5,14 @@ import { saveAs } from 'file-saver'
5
5
  // TODO: move these to the avo_filters gem
6
6
 
7
7
  StreamActions.close_filters_dropdown = function () {
8
- document.querySelector('.filters-dropdown-selector').classList.add('hidden')
8
+ const el = document.querySelector('.filters-dropdown-selector[open]')
9
+ if (el) el.close()
9
10
  }
10
11
 
11
12
  // Uses Turbo to refresh the page
12
13
  StreamActions.turbo_reload = function () {
13
14
  window.Turbo.visit(window.location.href, { action: 'replace' })
14
15
  }
15
-
16
- StreamActions.open_filter = function () {
17
- const id = this.getAttribute('unique-id')
18
- setTimeout(() => {
19
- document.querySelector(`[data-filter-id="${id}"] .pill`).click()
20
- }, 150)
21
- }
22
16
  // END TODO: move these to the avo_filters gem
23
17
 
24
18
  // https://stackoverflow.com/a/77850750/9067704
@@ -38,4 +32,12 @@ StreamActions.download = function () {
38
32
  )
39
33
  }
40
34
 
35
+ // Overriding the turbo_power as it needs the timeout to work
36
+
37
+ StreamActions.turbo_progress_bar_hide = function () {
38
+ setTimeout(() => {
39
+ window.Turbo.navigator.adapter.progressBar.hide()
40
+ }, 1)
41
+ }
42
+
41
43
  window.StreamActions = StreamActions
@@ -5,10 +5,10 @@
5
5
  <%= turbo_frame_tag Avo::MODAL_FRAME_ID do %>
6
6
  <div
7
7
  data-controller="<%= ["action", @action.get_stimulus_controllers].join(" ") %>"
8
- data-action-no-confirmation-value="<%= @action.no_confirmation? %>"
8
+ data-action-confirmation-value="<%= @action.confirmation? %>"
9
9
  data-action-resource-name-value="<%= @resource.model_key %>"
10
10
  data-resource-id="<%= params[:id] %>"
11
- class="hidden text-slate-800"
11
+ class="hidden text-content"
12
12
  >
13
13
  <%= form_with scope: 'fields',
14
14
  url: @action.link_arguments(resource: @resource).first,
@@ -21,12 +21,17 @@
21
21
  **@action.class.form_data_attributes,
22
22
  } do |form|
23
23
  %>
24
- <%= render Avo::ModalComponent.new(close_modal_on_backdrop_click: @action.close_modal_on_backdrop_click) do |c| %>
24
+ <%= render Avo::ModalComponent.new(close_modal_on_backdrop_click: @action.close_modal_on_backdrop_click, description: @action.get_description) do |c| %>
25
25
  <% c.with_heading do %>
26
26
  <%= @action.action_name %>
27
+ <% if Rails.env.development? %>
28
+ <%= link_to editor_file_path(@action), target: "_blank", class: "inline-block align-middle ms-1", title: "Open action in your editor", data: { tippy: "tooltip" } do %>
29
+ <%= svg "tabler/outline/code", class: "size-4 text-content-secondary cursor-pointer" %>
30
+ <% end %>
31
+ <% end %>
27
32
  <% end %>
28
33
 
29
- <div class="flex-1 flex">
34
+ <div class="flex-1 flex p-4">
30
35
  <%= @action.get_message %>
31
36
  </div>
32
37
  <%= form.hidden_field :avo_resource_ids, value: params[:id] || params[:resource_ids], 'data-action-target': 'resourceIds' %>
@@ -34,12 +39,12 @@
34
39
  <%= form.hidden_field :avo_index_query, 'data-action-target': 'indexQuery' %>
35
40
  <%= form.hidden_field :arguments, value: params[:arguments] %>
36
41
  <% if @fields.present? %>
37
- <div class="mt-4 -mx-6">
42
+ <div class="description-list border-t border-b border-tertiary">
38
43
  <% @fields.each_with_index do |field, index| %>
39
44
  <%= render field
40
45
  .hydrate(resource: @resource, record: @resource.record, user: @resource.user, view: @view, action: @action)
41
46
  .component_for_view(@view)
42
- .new(field: field, resource: @resource, index: index, form: form, compact: true, autofocus: index == 0)
47
+ .new(field: field, resource: @resource, index: index, form: form, full_width: true, autofocus: index == 0)
43
48
  %>
44
49
  <% end %>
45
50
  </div>
@@ -48,14 +53,13 @@
48
53
  <% c.with_controls do %>
49
54
  <%= a_button type: :button,
50
55
  data: { action: 'click->modal#close' },
51
- size: :sm,
52
- color: :gray do %>
56
+ size: :md do %>
53
57
  <%= @action.cancel_button_label %>
54
58
  <% end %>
55
59
  <%= a_button type: :submit,
56
- color: :green,
60
+ color: :primary,
57
61
  style: :primary,
58
- size: :sm,
62
+ size: :md,
59
63
  data: {
60
64
  target: :submit_action,
61
65
  },
@@ -12,7 +12,7 @@
12
12
  <% filter.options.each do |value, label| %>
13
13
  <label class="flex items-center text-gray-700 text-sm">
14
14
  <%= check_box_tag filter.id, value, filter.selected_value(value.to_s, @applied_filters),
15
- class: 'mr-2 text-lg h-4 w-4',
15
+ class: 'me-2 text-lg h-4 w-4',
16
16
  id: "avo_filters_#{filter.id.parameterize.underscore}",
17
17
  'data-filter-class': filter.class,
18
18
  'data-boolean-filter-target': 'option',
@@ -9,14 +9,14 @@
9
9
  <div class="flex relative">
10
10
  <div class="self-center w-full" data-slot="value">
11
11
  <%= text_field_tag :value, "",
12
- class: input_classes('w-full mb-0 !pr-9'),
12
+ class: input_classes('w-full mb-0 !pe-9'),
13
13
  placeholder: filter.class.empty_message,
14
14
  data: {
15
15
  date_time_filter_target: "input",
16
16
  } %>
17
17
  </div>
18
18
  <%= content_tag :button,
19
- class: "absolute right-0 self-center mr-4 uppercase font-semibold text-xs",
19
+ class: "absolute end-0 self-center me-4 uppercase font-semibold text-xs",
20
20
  id: :reset,
21
21
  type: :button,
22
22
  title: t("avo.reset").capitalize,
@@ -28,7 +28,7 @@
28
28
  <% end %>
29
29
  </div>
30
30
  <div class="flex justify-end">
31
- <%= a_button class: 'mt-4', color: :primary, data: { action: "date-time-filter#changeFilter" }, size: :xs do %>
31
+ <%= a_button class: 'mt-4', style: :primary, data: { action: "date-time-filter#changeFilter" }, size: :xs do %>
32
32
  <%= filter.button_label || "#{t("avo.filter_by")} #{filter.name}" %>
33
33
  <% end %>
34
34
  </div>
@@ -12,7 +12,7 @@
12
12
  'data-multiple-select-filter-target': 'selector'
13
13
  %>
14
14
  <div class="flex justify-end">
15
- <%= a_button class: 'mt-4', color: :primary, size: :xs, data: { action: "multiple-select-filter#changeFilter" } do %>
15
+ <%= a_button class: 'mt-4', style: :primary, size: :xs, data: { action: "multiple-select-filter#changeFilter" } do %>
16
16
  <%= filter.button_label || "#{t("avo.filter_by")} #{filter.name}" %>
17
17
  <% end %>
18
18
  </div>
@@ -1,11 +1,10 @@
1
- <%= turbo_frame_tag "new_via_belongs_to" do %>
1
+ <%= turbo_frame_tag Avo::MODAL_FRAME_ID do %>
2
2
  <%= render(Avo::ModalComponent.new(width: :xl, body_class: "bg-application")) do |c| %>
3
3
  <div class="pt-4 pb-8">
4
- <%= render Avo::Views::ResourceEditComponent.new(
4
+ <%= render @component.new(
5
5
  resource: @resource,
6
6
  record: @record,
7
7
  view: @view,
8
- display_breadcrumbs: false
9
8
  ) %>
10
9
  </div>
11
10
  <% end %>
@@ -13,7 +13,7 @@
13
13
  'data-action': 'keypress->text-filter#tryToSubmit'
14
14
  %>
15
15
  <div class="flex justify-end">
16
- <%= a_button class: 'mt-4', color: :primary, data: { action: "text-filter#changeFilter" }, size: :xs do %>
16
+ <%= a_button class: 'mt-4', style: :primary, data: { action: "text-filter#changeFilter" }, size: :xs do %>
17
17
  <%= filter.button_label || "#{t("avo.filter_by")} #{filter.name}" %>
18
18
  <% end %>
19
19
  </div>
@@ -1,3 +1,4 @@
1
+ <%# TODO: update this %>
1
2
  <%= turbo_frame_tag params[:turbo_frame] do %>
2
3
  <% if @authorized %>
3
4
  <%= content_tag :div, class: "-mx-2" do %>
@@ -6,7 +7,7 @@
6
7
  <% end %>
7
8
 
8
9
  <% if @preview_fields.present? %>
9
- <div class="mt-0 divide-y border-t">
10
+ <div class="mt-0 divide-y divide-gray-200 border-t border-gray-200">
10
11
  <% @preview_fields.each_with_index do |field, index| %>
11
12
  <%= render field
12
13
  .hydrate(
@@ -16,19 +17,19 @@
16
17
  view: Avo::ViewInquirer.new(:show)
17
18
  )
18
19
  .component_for_view(:show)
19
- .new(field: field, resource: @resource, index: index, compact: true, short: true)
20
+ .new(field: field, resource: @resource, index: index, stacked: true)
20
21
  %>
21
22
  <% end %>
22
23
  </div>
23
24
  <% end %>
24
25
  <% end %>
25
26
  <% else %>
26
- <div class="shadow-lg rounded px-4 py-3 rounded relative border text-white pointer-events-auto bg-blue-400 border-blue-600 m-2">
27
+ <div class="shadow-lg rounded px-4 py-3 relative border text-white pointer-events-auto bg-blue-400 border-blue-600 m-2">
27
28
  <div class="flex px-2">
28
29
  <div class="shrink-0">
29
30
  <%= svg "heroicons/solid/exclamation-circle", class: "h-6" %>
30
31
  </div>
31
- <div class="ml-3 flex-1 pt-0.5">
32
+ <div class="ms-3 flex-1 pt-0.5">
32
33
  <p class="text-sm leading-5 font-semibold"><%= t "avo.not_authorized" %></p>
33
34
  </div>
34
35
  </div>
@@ -1,92 +1,5 @@
1
- <%
2
- license = Avo.license
3
- information_items = [
4
- 'license_key',
5
- 'ruby_version',
6
- 'rails_version',
7
- 'environment',
8
- 'host',
9
- 'port',
10
- 'ip',
11
- 'app_name',
12
- ].excluding(Avo.configuration.exclude_from_status)
13
-
14
- hq_payload = Avo::Licensing::HQ.new(request).payload
15
- %>
16
- <div class="flex flex-col">
17
- <%= render Avo::PanelComponent.new(name: 'Avo Status', description: 'Use this page to debug your Avo instance.') do |c| %>
18
- <% c.with_tools do %>
19
- <% end %>
20
- <% c.with_bare_content do %>
21
- <div class="grid gap-4 grid-cols-2">
22
- <div class="relative flex flex-col bg-white rounded shadow-panel p-4 space-y-4 h-full">
23
- <div class="flex justify-between w-full">
24
- <div class="font-semibold">License info</div>
25
- <div class="flex justify-self-end">
26
- <%= a_button style: :outline,
27
- color: :blue,
28
- url: "#{root_path}avo_private/debug/refresh_license",
29
- method: :post,
30
- loading: true,
31
- size: :xs,
32
- icon: 'heroicons/outline/refresh' do %>
33
- Refresh license
34
- <% end %>
35
- </div>
36
- </div>
37
- <div class="flex flex-col flex-1">
38
- <div>
39
- <div class="text-xl font-semibold"><%= render partial: "valid_indicator", locals: {valid: license.valid?} %> <%= license.name %> license </div>
40
- <% if license.response['reason'] %>
41
- <dl>
42
- <dt class="font-semibold text-sm">Error</dt>
43
- <dd class="text-red-600"><%= license.response['reason'] %></dd>
44
- </dl>
45
- <% end %>
46
- <% if license.response['error'] %>
47
- <dl>
48
- <dt class="font-semibold text-sm">Error</dt>
49
- <dd class="text-red-600"><%= license.response['error'] %></dd>
50
- <dt class="font-semibold text-sm">Exception message</dt>
51
- <dd class="text-red-600"><%= license.response['exception_message'] %></dd>
52
- </dl>
53
- <% end %>
54
- <div class="mt-4">
55
- <dl>
56
- <% information_items.each do |item| %>
57
- <dt class="font-semibold text-sm"><%= item.humanize %></dt>
58
- <dd><%= license.response[item] %></dd>
59
- <% end %>
60
- <dt class="font-semibold text-sm">Last fetched at</dt>
61
- <dd><%= license.response['fetched_at'] %> <br>
62
- <% if license.response['fetched_at'].present? %>
63
- (<%= time_ago_in_words license.response['fetched_at'] %> ago)</dd>
64
- <% end %>
65
- <dt class="font-semibold text-sm">Cache store</dt>
66
- <dd>
67
- <%= Avo.cache_store.class %>
68
- </dd>
69
- </dl>
70
- </div>
71
- </div>
72
- </div>
73
- </div>
74
- <div class="relative flex flex-col bg-white rounded shadow-panel p-4 space-y-4 h-full">
75
- <div class="flex justify-between w-full">
76
- <div class="font-semibold">Plugins</div>
77
- </div>
78
- <div class="flex flex-col flex-1">
79
- <div>
80
- <ul>
81
- <li>Avo <%= Avo::VERSION %></li>
82
- <% Avo.plugin_manager.plugins.each do |plugin| %>
83
- <li><%= plugin.name %> - <%= plugin.version %></li>
84
- <% end %>
85
- </ul>
86
- </div>
87
- </div>
88
- </div>
89
- </div>
90
- <% end %>
91
- <% end %>
92
- </div>
1
+ <% if defined?(Avo::Licensing::StatusComponent) %>
2
+ <%= render Avo::Licensing::StatusComponent.new %>
3
+ <% else %>
4
+ <%= render Avo::Debug::StatusComponent.new %>
5
+ <% end %>
@@ -1,6 +1,4 @@
1
1
  <!-- Avo version: <%= Avo::VERSION %> -->
2
2
  <!-- Rails version: <%= Rails::VERSION::STRING %> -->
3
3
  <!-- Environment: <%= Rails.env %> -->
4
- <!-- License ID: <%= Avo.license.id %> -->
5
- <!-- License valid?: <%= Avo.license.valid ? "valid" : "invalid" %> -->
6
4
  <!-- Plugins: <%= Avo.plugin_manager.to_s %> -->
@@ -7,7 +7,7 @@
7
7
  <div class="mt-2">
8
8
  <code class="text-lg">Toggle published</code>
9
9
  <div class="mt-1">
10
- <code class="p-1 rounded bg-sky-500 text-white">bin/rails generate avo:action toggle_published</code>
10
+ <code class="p-1 rounded-sm bg-sky-500 text-white">bin/rails generate avo:action toggle_published</code>
11
11
  </div>
12
12
  </div>
13
13
 
@@ -8,7 +8,7 @@
8
8
 
9
9
  <div class="mt-2">
10
10
  <div class="mt-1">
11
- <code class="p-1 rounded bg-sky-500 text-white">bin/rails generate avo:dashboard dashy</code>
11
+ <code class="p-1 rounded-sm bg-sky-500 text-white">bin/rails generate avo:dashboard dashy</code>
12
12
  </div>
13
13
  </div>
14
14
 
@@ -7,7 +7,7 @@
7
7
  <div class="mt-2">
8
8
  <code class="text-lg">Published filter</code>
9
9
  <div class="mt-1">
10
- <code class="p-1 rounded bg-sky-500 text-white">bin/rails generate avo:filter published_filter</code>
10
+ <code class="p-1 rounded-sm bg-sky-500 text-white">bin/rails generate avo:filter published_filter</code>
11
11
  </div>
12
12
  </div>
13
13