avo 2.45.0 → 3.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of avo might be problematic. Click here for more details.

Files changed (415) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +9 -9
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +11 -10
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -35
  167. data/lib/avo/base_resource.rb +107 -95
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/is_resource_item.rb +24 -36
  175. data/lib/avo/concerns/is_visible.rb +15 -0
  176. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  177. data/lib/avo/configuration/branding.rb +0 -12
  178. data/lib/avo/configuration.rb +8 -45
  179. data/lib/avo/current.rb +5 -0
  180. data/lib/avo/dsl/field_parser.rb +1 -1
  181. data/lib/avo/dynamic_router.rb +6 -2
  182. data/lib/avo/engine.rb +37 -30
  183. data/lib/avo/error_manager.rb +25 -0
  184. data/lib/avo/execution_context.rb +9 -15
  185. data/lib/avo/fields/badge_field.rb +1 -1
  186. data/lib/avo/fields/base_field.rb +72 -123
  187. data/lib/avo/fields/belongs_to_field.rb +14 -25
  188. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  189. data/lib/avo/fields/concerns/has_default.rb +1 -5
  190. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  191. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  192. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  193. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  194. data/lib/avo/fields/concerns/is_required.rb +5 -7
  195. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  196. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  197. data/lib/avo/fields/country_field.rb +4 -0
  198. data/lib/avo/fields/date_field.rb +3 -16
  199. data/lib/avo/fields/date_time_field.rb +1 -5
  200. data/lib/avo/fields/field_manager.rb +45 -0
  201. data/lib/avo/fields/file_field.rb +0 -2
  202. data/lib/avo/fields/files_field.rb +0 -6
  203. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  204. data/lib/avo/fields/has_base_field.rb +11 -14
  205. data/lib/avo/fields/has_many_field.rb +5 -2
  206. data/lib/avo/fields/has_one_field.rb +5 -10
  207. data/lib/avo/fields/heading_field.rb +4 -1
  208. data/lib/avo/fields/hidden_field.rb +1 -1
  209. data/lib/avo/fields/id_field.rb +2 -3
  210. data/lib/avo/fields/password_field.rb +1 -1
  211. data/lib/avo/fields/preview_field.rb +14 -0
  212. data/lib/avo/fields/select_field.rb +12 -8
  213. data/lib/avo/fields/status_field.rb +4 -0
  214. data/lib/avo/filters/base_filter.rb +3 -8
  215. data/lib/avo/grid_collector.rb +7 -9
  216. data/lib/avo/html/builder.rb +5 -8
  217. data/lib/avo/item_grapher.rb +78 -0
  218. data/lib/avo/licensing/h_q.rb +3 -67
  219. data/lib/avo/licensing/license.rb +2 -2
  220. data/lib/avo/licensing/license_manager.rb +1 -1
  221. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  222. data/lib/avo/licensing/pro_license.rb +1 -7
  223. data/lib/avo/plugin.rb +6 -0
  224. data/lib/avo/plugin_manager.rb +58 -0
  225. data/lib/avo/prefixed_test_helpers.rb +20 -0
  226. data/lib/avo/reloader.rb +3 -0
  227. data/lib/avo/resources/controls/actions_list.rb +6 -12
  228. data/lib/avo/resources/controls/attach_button.rb +15 -0
  229. data/lib/avo/resources/controls/back_button.rb +1 -1
  230. data/lib/avo/resources/controls/base_control.rb +15 -49
  231. data/lib/avo/resources/controls/create_button.rb +15 -0
  232. data/lib/avo/resources/controls/delete_button.rb +5 -1
  233. data/lib/avo/resources/controls/detach_button.rb +4 -1
  234. data/lib/avo/resources/controls/edit_button.rb +4 -1
  235. data/lib/avo/resources/controls/order_controls.rb +8 -0
  236. data/lib/avo/resources/controls/save_button.rb +13 -0
  237. data/lib/avo/resources/controls/show_button.rb +15 -0
  238. data/lib/avo/resources/items/holder.rb +76 -0
  239. data/lib/avo/resources/items/item_group.rb +48 -0
  240. data/lib/avo/resources/items/main_panel.rb +2 -0
  241. data/lib/avo/resources/items/panel.rb +2 -0
  242. data/lib/avo/resources/items/sidebar.rb +47 -0
  243. data/lib/avo/resources/items/tab.rb +60 -0
  244. data/lib/avo/resources/items/tab_group.rb +68 -0
  245. data/lib/avo/resources/resource_manager.rb +181 -0
  246. data/lib/avo/services/authorization_service.rb +11 -110
  247. data/lib/avo/services/debug_service.rb +92 -0
  248. data/lib/avo/services/telemetry_service.rb +84 -0
  249. data/lib/avo/test_helpers.rb +362 -0
  250. data/lib/avo/tools/tool_manager.rb +30 -0
  251. data/lib/avo/version.rb +1 -1
  252. data/lib/avo.rb +7 -0
  253. data/lib/generators/avo/eject_generator.rb +0 -1
  254. data/lib/generators/avo/install_generator.rb +1 -11
  255. data/lib/generators/avo/resource_generator.rb +5 -23
  256. data/lib/generators/avo/scope_generator.rb +15 -0
  257. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  258. data/lib/generators/avo/templates/action.tt +1 -1
  259. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  261. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  263. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  265. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  266. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  267. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  268. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  271. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  272. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  273. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  274. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  275. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  280. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  281. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  282. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  283. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  284. data/lib/generators/avo/templates/scope.tt +6 -0
  285. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  286. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  287. data/lib/generators/avo/templates/tool/view.tt +2 -2
  288. data/lib/tasks/avo_tasks.rake +22 -0
  289. metadata +81 -159
  290. data/app/assets/stylesheets/css/tags.css +0 -32
  291. data/app/assets/svgs/map-empty-state.svg +0 -35
  292. data/app/assets/svgs/map-view-type.svg +0 -3
  293. data/app/components/avo/card_component.html.erb +0 -46
  294. data/app/components/avo/card_component.rb +0 -25
  295. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  296. data/app/components/avo/dashboards/divider_component.rb +0 -19
  297. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  298. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  299. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  300. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  301. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  303. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  304. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  305. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  306. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  307. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  309. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  311. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  312. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  313. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  314. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  315. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  316. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  317. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  318. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  319. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  320. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  321. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  322. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  323. data/app/components/avo/index/ordering/base_component.rb +0 -9
  324. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  325. data/app/components/avo/index/ordering/button_component.rb +0 -23
  326. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  327. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  328. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  329. data/app/components/avo/index/resource_map_component.rb +0 -109
  330. data/app/components/avo/row_component.html.erb +0 -3
  331. data/app/components/avo/row_component.rb +0 -12
  332. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  333. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  334. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  335. data/app/controllers/avo/dashboards_controller.rb +0 -22
  336. data/app/controllers/avo/reorder_controller.rb +0 -25
  337. data/app/javascript/js/controllers/base_controller.js +0 -22
  338. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  339. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  340. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  341. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  342. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  343. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  344. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  345. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  346. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  347. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  348. data/app/views/avo/dashboards/show.html.erb +0 -38
  349. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  350. data/app/views/avo/partials/_global_search.html.erb +0 -19
  351. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  352. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  353. data/lib/avo/base_card.rb +0 -161
  354. data/lib/avo/concerns/fetches_things.rb +0 -150
  355. data/lib/avo/concerns/handles_field_args.rb +0 -47
  356. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  357. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  358. data/lib/avo/concerns/pagination.rb +0 -53
  359. data/lib/avo/concerns/policy_helpers.rb +0 -31
  360. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  361. data/lib/avo/concerns/visible_items.rb +0 -51
  362. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  363. data/lib/avo/dashboards/base_divider.rb +0 -35
  364. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  365. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  366. data/lib/avo/dashboards/metric_card.rb +0 -9
  367. data/lib/avo/dashboards/partial_card.rb +0 -7
  368. data/lib/avo/fields/area_field.rb +0 -39
  369. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  370. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  371. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  372. data/lib/avo/fields/location_field.rb +0 -86
  373. data/lib/avo/fields/tags_field.rb +0 -102
  374. data/lib/avo/hosts/association_scope_host.rb +0 -8
  375. data/lib/avo/hosts/base_host.rb +0 -25
  376. data/lib/avo/hosts/card_visibility.rb +0 -20
  377. data/lib/avo/hosts/dashboard_card.rb +0 -22
  378. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  379. data/lib/avo/hosts/ordering.rb +0 -22
  380. data/lib/avo/hosts/record_host.rb +0 -7
  381. data/lib/avo/hosts/resource_record_host.rb +0 -7
  382. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  383. data/lib/avo/hosts/search_scope_host.rb +0 -7
  384. data/lib/avo/hosts/view_record_host.rb +0 -7
  385. data/lib/avo/hosts/visibility_host.rb +0 -12
  386. data/lib/avo/items_holder.rb +0 -96
  387. data/lib/avo/main_panel.rb +0 -3
  388. data/lib/avo/menu/base_item.rb +0 -25
  389. data/lib/avo/menu/builder.rb +0 -82
  390. data/lib/avo/menu/dashboard.rb +0 -22
  391. data/lib/avo/menu/group.rb +0 -2
  392. data/lib/avo/menu/link.rb +0 -6
  393. data/lib/avo/menu/menu.rb +0 -2
  394. data/lib/avo/menu/resource.rb +0 -22
  395. data/lib/avo/menu/section.rb +0 -2
  396. data/lib/avo/panel.rb +0 -24
  397. data/lib/avo/panel_builder.rb +0 -25
  398. data/lib/avo/resources/controls/action.rb +0 -38
  399. data/lib/avo/resources/controls/execution_context.rb +0 -58
  400. data/lib/avo/resources/controls/items_holder.rb +0 -19
  401. data/lib/avo/resources/controls/link_to.rb +0 -27
  402. data/lib/avo/row.rb +0 -26
  403. data/lib/avo/row_builder.rb +0 -24
  404. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  405. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  406. data/lib/avo/sidebar.rb +0 -30
  407. data/lib/avo/sidebar_builder.rb +0 -24
  408. data/lib/avo/tab.rb +0 -72
  409. data/lib/avo/tab_builder.rb +0 -25
  410. data/lib/avo/tab_group.rb +0 -42
  411. data/lib/avo/tab_group_builder.rb +0 -43
  412. data/lib/avo/tools_manager.rb +0 -11
  413. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  414. data/public/avo-assets/avo.base.js +0 -1037
  415. data/public/avo-assets/avo.base.js.map +0 -7
@@ -1,18 +1,3 @@
1
- <% if method.present? %>
2
- <%= button_to path,
3
- form_class: "flex-1 flex",
4
- class: button_classes,
5
- target: target,
6
- title: title,
7
- method: method,
8
- params: params do %>
9
- <%= helpers.svg(icon, class: 'h-4 mr-1') if icon.present? %> <%= label %>
10
- <% end %>
11
- <% else %>
12
- <%= link_to path,
13
- class: button_classes,
14
- target: target,
15
- title: title do %>
16
- <%= helpers.svg(icon, class: 'h-4 mr-1') if icon.present? %> <%= label %>
17
- <% end %>
1
+ <%= link_to path, class: "flex-1 flex items-center justify-center bg-white text-left cursor-pointer text-gray-800 font-semibold hover:bg-primary-100 block px-4 py-1 w-full py-3 text-center rounded w-full", target: target, title: title do %>
2
+ <%= helpers.svg(icon, class: 'h-4 mr-1') if icon.present? %> <%= label %>
18
3
  <% end %>
@@ -6,29 +6,17 @@ class Avo::ProfileItemComponent < ViewComponent::Base
6
6
  attr_reader :path
7
7
  attr_reader :active
8
8
  attr_reader :target
9
- attr_reader :method
10
- attr_reader :params
11
- attr_reader :classes
12
9
 
13
- def initialize(label: nil, icon: nil, path: nil, active: :inclusive, target: nil, title: nil, method: nil, params: {}, classes: "")
10
+ def initialize(label: nil, icon: nil, path: nil, active: :inclusive, target: nil, title: nil)
14
11
  @label = label
15
12
  @icon = icon
16
13
  @path = path
17
14
  @active = active
18
15
  @target = target
19
16
  @title = title
20
- @method = method
21
- @params = params
22
- @classes = classes
23
17
  end
24
18
 
25
19
  def title
26
20
  @title || @label
27
21
  end
28
-
29
- private
30
-
31
- def button_classes
32
- "flex-1 flex items-center justify-center bg-white text-left cursor-pointer text-gray-800 font-semibold hover:bg-primary-100 block px-4 py-1 w-full py-3 text-center rounded w-full"
33
- end
34
22
  end
@@ -1,7 +1,4 @@
1
- <%# via_association_type is used in has_one create actions %>
2
- <%= hidden_field_tag :via_association_type, params[:via_association_type] if params[:via_association_type] %>
3
1
  <%= hidden_field_tag :via_resource_class, params[:via_resource_class] if params[:via_resource_class] %>
4
- <%= hidden_field_tag :via_resource_id, params[:via_resource_id] if params[:via_resource_id] %>
2
+ <%= hidden_field_tag :via_record_id, params[:via_record_id] if params[:via_record_id] %>
5
3
  <%= hidden_field_tag :via_relation, params[:via_relation] if params[:via_relation] %>
6
- <%= hidden_field_tag :via_belongs_to_resource_class, params[:via_belongs_to_resource_class] if params[:via_belongs_to_resource_class] %>
7
4
  <%= hidden_field_tag :referrer, back_path if params[:via_resource_class] %>
@@ -20,20 +20,13 @@ class Avo::ResourceComponent < Avo::BaseComponent
20
20
  end
21
21
 
22
22
  def can_detach?
23
- return false if @reflection.blank? || @resource.model.blank? || !authorize_association_for(:detach)
24
-
25
- # If the inverse_of is a belongs_to, we need to check if it's optional in order to know if we can detach it.
26
- if inverse_of.is_a?(ActiveRecord::Reflection::BelongsToReflection)
27
- inverse_of.options[:optional]
28
- else
29
- true
30
- end
23
+ authorize_association_for(:detach)
31
24
  end
32
25
 
33
26
  def detach_path
34
27
  return "/" if @reflection.blank?
35
28
 
36
- helpers.resource_detach_path(params[:resource_name], params[:id], @reflection.name.to_s, @resource.model.to_param)
29
+ helpers.resource_detach_path(params[:resource_name], params[:id], @reflection.name.to_s, @resource.record.to_param)
37
30
  end
38
31
 
39
32
  def can_see_the_edit_button?
@@ -44,7 +37,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
44
37
  @resource.authorization.authorize_action(:destroy, raise_exception: false)
45
38
  end
46
39
 
47
- def can_act_on?
40
+ def can_see_the_actions_button?
41
+ return false if @actions.blank?
42
+
48
43
  return authorize_association_for(:act_on) if @reflection.present?
49
44
 
50
45
  @resource.authorization.authorize_action(:act_on, raise_exception: false) && !has_reflection_and_is_read_only
@@ -52,9 +47,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
52
47
 
53
48
  def destroy_path
54
49
  if params[:via_resource_class].present?
55
- helpers.resource_path(model: @resource.model, resource: @resource, referrer: back_path)
50
+ helpers.resource_path(record: @resource.record, resource: @resource, referrer: back_path)
56
51
  else
57
- helpers.resource_path(model: @resource.model, resource: @resource)
52
+ helpers.resource_path(record: @resource.record, resource: @resource)
58
53
  end
59
54
  end
60
55
 
@@ -65,9 +60,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
65
60
  if @reflection.present?
66
61
  # Fetch the appropiate resource
67
62
  reflection_resource = field.resource
68
- # Fetch the model
69
- # Hydrate the resource with the model if we have one
70
- reflection_resource.hydrate(model: @parent_model) if @parent_model.present?
63
+ # Fetch the record
64
+ # Hydrate the resource with the record if we have one
65
+ reflection_resource.hydrate(record: @parent_record) if @parent_record.present?
71
66
  # Use the related_name as the base of the association
72
67
  association_name = @reflection.name
73
68
 
@@ -80,16 +75,17 @@ class Avo::ResourceComponent < Avo::BaseComponent
80
75
  if service.has_method?(method_name, raise_exception: false)
81
76
  # Some policy methods should get the parent record in order to have the necessarry information to do the authorization
82
77
  # Example: Post->has_many->Comments
78
+ #
83
79
  # When you want to authorize the creation/attaching of a Comment, you don't have the Comment instance.
84
80
  # But you do have the Post instance and you can get that in your policy to authorize against.
85
81
  parent_policy_methods = [:view, :create, :attach, :act_on]
86
82
 
87
83
  record = if parent_policy_methods.include?(policy_method)
88
84
  # Use the parent record (Post)
89
- reflection_resource.model
85
+ reflection_resource.record
90
86
  else
91
87
  # Override the record with the child record (Comment)
92
- resource.model
88
+ resource.record
93
89
  end
94
90
  policy_result = service.authorize_action(method_name, record: record, raise_exception: false)
95
91
  end
@@ -117,23 +113,27 @@ class Avo::ResourceComponent < Avo::BaseComponent
117
113
 
118
114
  def has_reflection_and_is_read_only
119
115
  if @reflection.present? && @reflection.active_record.name && @reflection.name
120
- fields = ::Avo::App.get_resource_by_model_name(@reflection.active_record.name).get_field_definitions
116
+ fields = ::Avo::App.resources.get_resource_by_model_class(@reflection.active_record.name).get_field_definitions
121
117
  filtered_fields = fields.filter { |f| f.id == @reflection.name }
122
118
  else
123
119
  return false
124
120
  end
125
121
 
126
122
  if filtered_fields.present?
127
- filtered_fields.find { |f| f.id == @reflection.name }.is_readonly?
123
+ filtered_fields.find { |f| f.id == @reflection.name }.readonly
128
124
  else
129
125
  false
130
126
  end
131
127
  end
132
128
 
129
+ def render_control(control)
130
+ send "render_#{control.type}", control
131
+ end
132
+
133
133
  private
134
134
 
135
135
  def via_resource?
136
- (params[:via_resource_class].present? || params[:via_relation_class].present?) && params[:via_resource_id].present?
136
+ (params[:via_resource_class].present? || params[:via_relation_class].present?) && params[:via_record_id].present?
137
137
  end
138
138
 
139
139
  def search_for_sidebar
@@ -144,20 +144,132 @@ class Avo::ResourceComponent < Avo::BaseComponent
144
144
  item&.hydrate(view: view)
145
145
  end
146
146
 
147
- def inverse_of
148
- current_reflection = @reflection.active_record.reflect_on_all_associations.find do |reflection|
149
- reflection.name == @reflection.name.to_sym
147
+ def render_back_button(control)
148
+ return if is_a_related_resource?
149
+
150
+ tippy = control.title ? :tooltip : nil
151
+ a_link back_path,
152
+ style: :text,
153
+ title: control.title,
154
+ data: {tippy: tippy},
155
+ icon: "arrow-left" do
156
+ control.label
157
+ end
158
+ end
159
+
160
+ def render_actions_list(actions_list)
161
+ return unless can_see_the_actions_button?
162
+
163
+ render Avo::ActionsComponent.new(
164
+ actions: @actions,
165
+ resource: @resource,
166
+ view: @view,
167
+ exclude: actions_list.exclude,
168
+ style: actions_list.style,
169
+ color: actions_list.color,
170
+ label: actions_list.label,
171
+ size: actions_list.size,
172
+ as_row_control: instance_of?(Avo::Index::ResourceControlsComponent)
173
+ )
174
+ end
175
+
176
+ def render_delete_button(control)
177
+ # If the resource is a related resource, we use the can_delete? policy method because it uses
178
+ # authorize_association_for(:destroy).
179
+ # Otherwise we use the can_see_the_destroy_button? policy method becuse it do no check for assiciation
180
+ # only for authorize_action .
181
+ policy_method = is_a_related_resource? ? :can_delete? : :can_see_the_destroy_button?
182
+ return unless send policy_method
183
+
184
+ a_link destroy_path,
185
+ style: :text,
186
+ color: :red,
187
+ icon: "trash",
188
+ form_class: "flex flex-col sm:flex-row sm:inline-flex",
189
+ title: control.title,
190
+ data: {
191
+ turbo_confirm: t("avo.are_you_sure", item: @resource.record.model_name.name.downcase),
192
+ turbo_method: :delete,
193
+ target: "control:destroy",
194
+ control: :destroy,
195
+ tippy: control.title ? :tooltip : nil,
196
+ "resource-id": @resource.record.id,
197
+ } do
198
+ control.label
150
199
  end
200
+ end
151
201
 
152
- inverse_of = current_reflection.inverse_of
202
+ def render_save_button(control)
203
+ return unless can_see_the_save_button?
153
204
 
154
- if inverse_of.blank? && Rails.env.development?
155
- puts "WARNING! Avo uses the 'inverse_of' option to determine the inverse association and figure out if the association permit or not detaching."
156
- # Ex: Please configure the 'inverse_of' option for the ':users' association on the 'Project' model.
157
- puts "Please configure the 'inverse_of' option for the '#{current_reflection.macro} :#{current_reflection.name}' association on the '#{current_reflection.active_record.name}' model."
158
- puts "Otherwise the detach button will be visible by default.\n\n"
205
+ a_button color: :primary,
206
+ style: :primary,
207
+ loading: true,
208
+ type: :submit,
209
+ icon: "save" do
210
+ control.label
159
211
  end
212
+ end
213
+
214
+ def render_edit_button(control)
215
+ return unless can_see_the_edit_button?
216
+
217
+ a_link edit_path,
218
+ color: :primary,
219
+ style: :primary,
220
+ title: control.title,
221
+ data: {tippy: control.title ? :tooltip : nil},
222
+ icon: "edit" do
223
+ control.label
224
+ end
225
+ end
226
+
227
+ def render_detach_button(control)
228
+ return unless is_a_related_resource? && can_detach?
229
+
230
+ a_button url: detach_path,
231
+ icon: "detach",
232
+ method: :delete,
233
+ form_class: "flex flex-col sm:flex-row sm:inline-flex",
234
+ style: :text,
235
+ data: {
236
+ confirm: "Are you sure you want to detach this #{title}."
237
+ } do
238
+ control.label || t("avo.detach_item", item: title).capitalize
239
+ end
240
+ end
241
+
242
+ def render_create_button(control)
243
+ return unless can_see_the_create_button?
244
+
245
+ a_link create_path,
246
+ color: :primary,
247
+ style: :primary,
248
+ target: "_top",
249
+ icon: "heroicons/outline/plus",
250
+ data: {
251
+ target: :create
252
+ } do
253
+ control.label
254
+ end
255
+ end
256
+
257
+ def render_attach_button(control)
258
+ return unless can_attach?
259
+
260
+ a_link attach_path,
261
+ icon: "heroicons/outline/link",
262
+ color: :primary,
263
+ style: :text,
264
+ data: {
265
+ turbo_frame: :attach_modal,
266
+ target: :attach
267
+ } do
268
+ control.label
269
+ end
270
+ end
160
271
 
161
- inverse_of
272
+ def is_a_related_resource?
273
+ @reflection.present? && @resource.record.present?
162
274
  end
163
275
  end
@@ -1,9 +1,13 @@
1
- <div class="resource-sidebar-component divide-y">
1
+ <div class="resource-sidebar-component divide-y"
2
+ data-component-name="<%= self.class.to_s.underscore%>"
3
+ data-resource-name="<%= @resource.class.to_s %>"
4
+ data-record-id="<%= @resource.record.id %>"
5
+ >
2
6
  <% fields.each_with_index do |field, index| %>
3
7
  <%= render field
4
8
  .hydrate(
5
9
  resource: resource,
6
- model: resource.model,
10
+ record: resource.record,
7
11
  user: resource.user,
8
12
  view: view
9
13
  ).component_for_view(view)
@@ -1,6 +1,5 @@
1
1
  <% if path.present? %>
2
2
  <%= send link_method, path, class: classes, active: active, target: target, data: data do %>
3
- <%= helpers.svg icon, class: "h-4 text-gray-700" if icon.present? %>
4
3
  <%= label %>
5
4
  <% if target == :_blank %>
6
5
  <%= helpers.svg('heroicons/outline/external-link', class: 'self-center ml-auto h-3 mr-2') %>
@@ -8,7 +7,6 @@
8
7
  <% end %>
9
8
  <% else %>
10
9
  <%= content_tag :div, class: classes, active: active, target: target, data: data do %>
11
- <%= helpers.svg icon, class: "h-4 text-gray-700" if icon.present? %>
12
10
  <%= label %>
13
11
  <% end %>
14
12
  <% end %>
@@ -6,20 +6,18 @@ class Avo::Sidebar::LinkComponent < ViewComponent::Base
6
6
  attr_reader :label
7
7
  attr_reader :path
8
8
  attr_reader :data
9
- attr_reader :icon
10
9
 
11
- def initialize(label: nil, path: nil, active: :inclusive, target: nil, data: {}, icon: nil)
10
+ def initialize(label: nil, path: nil, active: :inclusive, target: nil, data: {})
12
11
  @label = label
13
12
  @path = path
14
13
  @active = active
15
14
  @target = target
16
15
  @data = data
17
- @icon = icon
18
16
  end
19
17
 
20
18
  def is_external?
21
19
  # If the path contains the scheme, check if it includes the root path or not
22
- return !path.include?(Avo::App.root_path) if URI(path).scheme.present?
20
+ return !path.include?(Avo::App.mount_path) if URI(path).scheme.present?
23
21
 
24
22
  false
25
23
  end
@@ -30,6 +28,6 @@ class Avo::Sidebar::LinkComponent < ViewComponent::Base
30
28
  end
31
29
 
32
30
  def classes
33
- "px-4 pr-0 flex-1 flex mx-6 leading-none py-2 text-black rounded font-medium hover:bg-gray-100 gap-1"
31
+ "px-4 pr-0 flex-1 flex mx-6 leading-none py-2 text-black rounded font-medium hover:bg-gray-100"
34
32
  end
35
33
  end
@@ -13,7 +13,7 @@
13
13
  <div class="space-y-6 mb-4">
14
14
  <%= render Avo::Sidebar::LinkComponent.new label: 'Get started', path: helpers.avo.root_path, active: :exclusive if Rails.env.development? && Avo.configuration.home_path.nil? %>
15
15
 
16
- <% if Avo::App.has_main_menu? %>
16
+ <% if Avo.plugin_manager.installed?(:avo_menu) && Avo::App.has_main_menu? %>
17
17
  <% Avo::App.main_menu.items.each do |item| %>
18
18
  <%= render Avo::Sidebar::ItemSwitcherComponent.new item: item %>
19
19
  <% end %>
@@ -57,7 +57,14 @@
57
57
  <%= render partial: "/avo/partials/sidebar_extra" %>
58
58
  </div>
59
59
  </div>
60
- <%= helpers.render_license_warnings unless Rails.env.production? %>
60
+ <% if Rails.env.development? %>
61
+ <div class="p-4 border-t group">
62
+ <%= link_to helpers.avo.avo_private_status_path, class: "block px-4 py-2 border rounded flex justify-between items-center w-full text-black text-sm" do %>
63
+ <span>Avo Status</span> <span><div class="rounded-full w-4 h-4 <%= Avo::App.instance.app_status ? "bg-green-400" : "bg-orange-400" %>"></div></span>
64
+ <% end %>
65
+ <div class="absolute text-xs text-gray-700 group-hover:block hidden text-center w-full -ml-4">👆Visible only in development👆</div>
66
+ </div>
67
+ <% end %>
61
68
  <%= render Avo::SidebarProfileComponent.new user: helpers._current_user %>
62
69
  </div>
63
70
  </div>
@@ -7,15 +7,17 @@ class Avo::SidebarComponent < ViewComponent::Base
7
7
  end
8
8
 
9
9
  def dashboards
10
- Avo::App.dashboards_for_navigation
10
+ return [] unless defined?(AvoDashboards)
11
+
12
+ AvoDashboards.dashboard_manager.dashboards_for_navigation
11
13
  end
12
14
 
13
15
  def resources
14
- Avo::App.resources_for_navigation
16
+ Avo::Current.app.resource_manager.resources_for_navigation helpers._current_user
15
17
  end
16
18
 
17
19
  def tools
18
- Avo::App.tools_for_navigation
20
+ Avo::App.tools.tools_for_navigation
19
21
  end
20
22
 
21
23
  def stimulus_target
@@ -16,25 +16,32 @@
16
16
  <% end %>
17
17
  </div>
18
18
  </div>
19
- <div class="relative" data-controller="toggle-panel">
20
- <a class="flex items-center h-full cursor-pointer" data-control="profile-dots" data-action="click->toggle-panel#togglePanel">
21
- <%= helpers.svg 'three-dots', class: 'h-4' %>
22
- </a>
23
- <div
24
- class="hidden absolute flex flex-col inset-auto right-0 -mt-12 bg-white rounded min-w-[200px] shadow-context -translate-y-full z-40"
25
- data-toggle-panel-target="panel"
26
- >
27
- <% if Avo::App.has_profile_menu? %>
28
- <div class="text-black">
29
- <% Avo::App.profile_menu.items.each do |item| %>
30
- <% if item.is_a? Avo::Menu::Link %>
31
- <%= render Avo::ProfileItemComponent.new label: item.name, path: item.path, icon: item.icon, method: item.method, params: item.params %>
19
+ <% if can_destroy_user? %>
20
+ <div class="relative" data-controller="toggle">
21
+ <a class="flex items-center h-full cursor-pointer" data-control="profile-dots" data-action="click->toggle#togglePanel">
22
+ <%= helpers.svg 'three-dots', class: 'h-4' %>
23
+ </a>
24
+ <div
25
+ class="hidden absolute flex flex-col inset-auto right-0 -mt-12 bg-white rounded min-w-[200px] shadow-context -translate-y-full z-40"
26
+ data-toggle-target="panel"
27
+ data-transition-enter="transition ease-out duration-100"
28
+ data-transition-enter-start="transform opacity-0 translate-y-1"
29
+ data-transition-enter-end="transform opacity-100 translate-y-0"
30
+ data-transition-leave="transition ease-in duration-75"
31
+ data-transition-leave-start="transform opacity-100 translate-y-0"
32
+ data-transition-leave-end="transform opacity-0 translate-y-1"
33
+ >
34
+ <% if Avo.plugin_manager.installed?(:avo_menu) && Avo::App.has_profile_menu? %>
35
+ <div class="text-black space-y-4">
36
+ <% Avo::App.profile_menu.items.each do |item| %>
37
+ <% if item.is_a? AvoMenu::Link %>
38
+ <%= render Avo::ProfileItemComponent.new label: item.name, path: item.path, icon: item.icon %>
39
+ <% end %>
32
40
  <% end %>
33
- <% end %>
34
- </div>
35
- <% end %>
36
- <%= render "avo/partials/profile_menu_extra" %>
37
- <% if can_destroy_user? %>
41
+ </div>
42
+ <% end %>
43
+ <%# Example link below %>
44
+ <%#= render Avo::ProfileItemComponent.new label: 'Profile', path: '/profile', icon: 'user-circle' %>
38
45
  <%= button_to helpers.main_app.send(destroy_user_session_path),
39
46
  form: { "data-turbo" => "false" },
40
47
  method: :delete,
@@ -45,7 +52,7 @@
45
52
  form_class: 'flex-1' do %>
46
53
  <%= helpers.svg 'logout', class: 'h-4 mr-1' %> <%= t('avo.sign_out') %>
47
54
  <% end %>
48
- <% end %>
55
+ </div>
49
56
  </div>
50
- </div>
57
+ <% end %>
51
58
  </div>
@@ -32,19 +32,25 @@
32
32
  end
33
33
 
34
34
  if should_lazy_load
35
- args[:src] = helpers.resource_path(resource: resource, model: resource.model, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
35
+ args[:src] = helpers.resource_path(resource: resource, record: resource.record, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
36
36
  args[:loading] = :lazy
37
37
  end
38
38
  %>
39
39
  <%= turbo_frame_tag tab.turbo_frame_id(parent: @group), **args do %>
40
40
  <div class="border rounded-lg p-2 -mx-2 -my-2 lg:p-4 lg:-mx-4 lg:-my-4 space-y-4">
41
- <%= render Avo::TabSwitcherComponent.new resource: resource, current_tab: tab, group: group, active_tab_name: active_tab_name, view: view, style: tabs_style %>
42
- <% if !should_lazy_load && !tab.empty? %>
43
- <div class="space-y-12">
44
- <% tab.visible_items.each do |item| %>
45
- <%= render Avo::ItemSwitcherComponent.new resource: resource, item: item, index: index, form: form, view: @view %>
46
- <% end %>
41
+ <%= render Avo::TabSwitcherComponent.new resource: resource, current_tab: tab, group: group, active_tab_name: active_tab_name, view: view %>
42
+ <% if should_lazy_load %>
43
+ <div class="block w-full">
44
+ <%= render Avo::LoadingComponent.new title: "#{tab.name}" %>
47
45
  </div>
46
+ <% else %>
47
+ <% if !tab.is_empty? %>
48
+ <div class="space-y-12">
49
+ <% tab.visible_items.each do |item| %>
50
+ <%= render Avo::ItemSwitcherComponent.new resource: resource, item: item, index: index, form: form, view: @view %>
51
+ <% end %>
52
+ </div>
53
+ <% end %>
48
54
  <% end %>
49
55
  </div>
50
56
  <% end %>
@@ -7,14 +7,13 @@ class Avo::TabGroupComponent < Avo::BaseComponent
7
7
  attr_reader :form
8
8
  attr_reader :resource
9
9
 
10
- def initialize(resource:, group:, index:, form:, params:, view:, tabs_style:)
10
+ def initialize(resource:, group:, index:, form:, params:, view:)
11
11
  @resource = resource
12
12
  @group = group
13
13
  @index = index
14
14
  @form = form
15
15
  @params = params
16
16
  @view = view
17
- @tabs_style = tabs_style
18
17
 
19
18
  @group.index = index
20
19
  end
@@ -50,8 +49,4 @@ class Avo::TabGroupComponent < Avo::BaseComponent
50
49
  tab.name.to_s == active_tab_name.to_s
51
50
  end
52
51
  end
53
-
54
- def tabs_style
55
- @tabs_style || Avo.configuration.tabs_style
56
- end
57
52
  end
@@ -1,41 +1,18 @@
1
- <% if style == :tabs %>
2
- <div class="flex overflow-auto mac-styled-scrollbar" data-target="tab-switcher" data-style="tabs">
3
- <div class="button-group">
4
- <% visible_items.each do |tab| %>
5
- <%= a_link tab_path(tab),
6
- color: selected?(tab) ? :primary : :gray ,
7
- rounded: false,
8
- size: :sm,
9
- class: "active:outline-0 #{selected?(tab) ? "z-20" : "bg-gray-100 border-gray-300"}",
10
- title: tab.description,
11
- data: {
12
- tippy: tab.description.present? ? 'tooltip' : '',
13
- selected: selected?(tab),
14
- action: 'click->tabs#changeTab',
15
- tabs_id_param: tab.name
16
- } do %>
17
- <%= tab.name %>
18
- <% end %>
19
- <% end %>
20
- </div>
21
- </div>
22
- <% else %>
23
- <div class="flex flex-wrap gap-2 p-2 <%= white_panel_classes %>" data-target="tab-switcher" data-style="pills">
24
- <% visible_items.each do |tab| %>
25
- <%= a_link tab_path(tab),
26
- color: selected?(tab) ? :primary : :gray,
27
- style: selected?(tab) ? :outline : :text,
28
- size: :sm,
29
- class: selected?(tab) ? "z-20 bg-primary-100" : "",
30
- title: tab.description,
31
- data: {
32
- tippy: tab.description.present? ? 'tooltip' : '',
33
- selected: selected?(tab),
34
- action: 'click->tabs#changeTab',
35
- tabs_id_param: tab.name
36
- } do %>
37
- <%= tab.name %>
38
- <% end %>
1
+ <div class="flex flex-wrap gap-2 p-2 <%= white_panel_classes %>" data-target="tab-switcher">
2
+ <% group.visible_items.each do |tab| %>
3
+ <%= a_link tab_path(tab),
4
+ color: selected?(tab) ? :primary : :gray,
5
+ style: selected?(tab) ? :outline : :text,
6
+ size: :sm,
7
+ class: selected?(tab) ? "z-20 bg-primary-100" : "",
8
+ title: tab.description,
9
+ data: {
10
+ tippy: tab.description.present? ? 'tooltip' : '',
11
+ selected: selected?(tab),
12
+ action: 'click->tabs#changeTab',
13
+ tabs_id_param: tab.name
14
+ } do %>
15
+ <%= tab.name %>
39
16
  <% end %>
40
- </div>
41
- <% end %>
17
+ <% end %>
18
+ </div>