avo 2.49.0 → 3.0.0.beta1

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 (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +15 -26
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
  40. data/app/components/avo/fields/index_component.rb +5 -5
  41. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  42. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  43. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  44. data/app/components/avo/fields/show_component.rb +4 -1
  45. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  46. data/app/components/avo/filters_component.html.erb +9 -3
  47. data/app/components/avo/filters_component.rb +4 -4
  48. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  49. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  50. data/app/components/avo/index/grid_item_component.rb +43 -16
  51. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  52. data/app/components/avo/index/resource_controls_component.rb +124 -17
  53. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  54. data/app/components/avo/index/resource_grid_component.rb +5 -2
  55. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  56. data/app/components/avo/index/resource_map_component.rb +3 -3
  57. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  58. data/app/components/avo/index/resource_table_component.rb +14 -20
  59. data/app/components/avo/index/table_row_component.html.erb +8 -4
  60. data/app/components/avo/index/table_row_component.rb +3 -2
  61. data/app/components/avo/item_switcher_component.rb +2 -2
  62. data/app/components/avo/modal_component.html.erb +7 -12
  63. data/app/components/avo/modal_component.rb +0 -21
  64. data/app/components/avo/paginator_component.html.erb +40 -29
  65. data/app/components/avo/paginator_component.rb +5 -23
  66. data/app/components/avo/panel_component.html.erb +8 -6
  67. data/app/components/avo/referrer_params_component.html.erb +1 -2
  68. data/app/components/avo/resource_component.rb +189 -14
  69. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  70. data/app/components/avo/resource_sidebar_component.rb +1 -1
  71. data/app/components/avo/sidebar/link_component.rb +1 -1
  72. data/app/components/avo/sidebar_component.html.erb +10 -3
  73. data/app/components/avo/sidebar_component.rb +5 -3
  74. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  75. data/app/components/avo/tab_group_component.html.erb +13 -7
  76. data/app/components/avo/tab_group_component.rb +1 -6
  77. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  78. data/app/components/avo/tab_switcher_component.rb +4 -39
  79. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  80. data/app/components/avo/views/resource_edit_component.rb +7 -18
  81. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  82. data/app/components/avo/views/resource_index_component.rb +62 -12
  83. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  84. data/app/components/avo/views/resource_show_component.rb +6 -11
  85. data/app/controllers/avo/actions_controller.rb +27 -24
  86. data/app/controllers/avo/application_controller.rb +105 -151
  87. data/app/controllers/avo/associations_controller.rb +34 -43
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +102 -102
  90. data/app/controllers/avo/debug_controller.rb +17 -5
  91. data/app/controllers/avo/home_controller.rb +1 -1
  92. data/app/controllers/avo/search_controller.rb +30 -51
  93. data/app/controllers/avo/team_users_controller.rb +4 -0
  94. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  95. data/app/helpers/avo/application_helper.rb +15 -9
  96. data/app/helpers/avo/resources_helper.rb +1 -1
  97. data/app/helpers/avo/url_helpers.rb +27 -11
  98. data/app/javascript/avo.base.js +1 -0
  99. data/app/javascript/js/application.js +0 -3
  100. data/app/javascript/js/controllers/action_controller.js +5 -3
  101. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  102. data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
  103. data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
  104. data/app/javascript/js/controllers/filter_controller.js +1 -1
  105. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  106. data/app/javascript/js/controllers/preview_controller.js +24 -0
  107. data/app/javascript/js/controllers/search_controller.js +2 -2
  108. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  109. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  110. data/app/javascript/js/controllers.js +10 -6
  111. data/app/javascript/js/custom-stream-actions.js +15 -0
  112. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  113. data/app/views/avo/actions/show.html.erb +10 -7
  114. data/app/views/avo/associations/new.html.erb +2 -2
  115. data/app/views/avo/base/index.html.erb +3 -2
  116. data/app/views/avo/base/new.html.erb +2 -1
  117. data/app/views/avo/base/preview.html.erb +19 -0
  118. data/app/views/avo/base/show.html.erb +1 -1
  119. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  120. data/app/views/avo/debug/report.html.erb +32 -17
  121. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  122. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  123. data/app/views/avo/partials/_footer.html.erb +1 -1
  124. data/app/views/avo/partials/_javascript.html.erb +5 -0
  125. data/app/views/avo/partials/_logo.html.erb +1 -1
  126. data/app/views/avo/partials/_navbar.html.erb +3 -5
  127. data/app/views/avo/partials/_table_header.html.erb +5 -11
  128. data/app/views/layouts/avo/application.html.erb +4 -2
  129. data/avo.gemspec +11 -12
  130. data/bin/dev +1 -1
  131. data/bin/prod +0 -0
  132. data/config/i18n-tasks.yml +1 -1
  133. data/config/initializers/pagy.rb +0 -2
  134. data/config/master.key +1 -0
  135. data/config/routes.rb +6 -10
  136. data/db/factories.rb +7 -1
  137. data/lib/avo/action_model.rb +20 -0
  138. data/lib/avo/asset_manager.rb +30 -0
  139. data/lib/avo/base_action.rb +57 -42
  140. data/lib/avo/base_resource.rb +264 -227
  141. data/lib/avo/base_resource_tool.rb +9 -16
  142. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  143. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  144. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  145. data/lib/avo/concerns/has_controls.rb +37 -0
  146. data/lib/avo/concerns/has_description.rb +23 -0
  147. data/lib/avo/concerns/has_item_type.rb +42 -0
  148. data/lib/avo/concerns/has_items.rb +325 -0
  149. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  150. data/lib/avo/concerns/is_resource_item.rb +24 -36
  151. data/lib/avo/concerns/is_visible.rb +15 -0
  152. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  153. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  154. data/lib/avo/configuration/branding.rb +0 -12
  155. data/lib/avo/configuration.rb +1 -37
  156. data/lib/avo/current.rb +39 -0
  157. data/lib/avo/dsl/field_parser.rb +1 -1
  158. data/lib/avo/dynamic_router.rb +18 -3
  159. data/lib/avo/engine.rb +35 -30
  160. data/lib/avo/error_manager.rb +25 -0
  161. data/lib/avo/execution_context.rb +10 -14
  162. data/lib/avo/fields/badge_field.rb +1 -1
  163. data/lib/avo/fields/base_field.rb +91 -106
  164. data/lib/avo/fields/belongs_to_field.rb +18 -22
  165. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  166. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  167. data/lib/avo/fields/concerns/has_default.rb +1 -5
  168. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  169. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  170. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  171. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  172. data/lib/avo/fields/concerns/is_required.rb +5 -7
  173. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  174. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  175. data/lib/avo/fields/country_field.rb +4 -0
  176. data/lib/avo/fields/date_time_field.rb +3 -14
  177. data/lib/avo/fields/field_manager.rb +55 -0
  178. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  179. data/lib/avo/fields/has_base_field.rb +12 -15
  180. data/lib/avo/fields/has_many_field.rb +5 -2
  181. data/lib/avo/fields/has_one_field.rb +6 -10
  182. data/lib/avo/fields/heading_field.rb +4 -1
  183. data/lib/avo/fields/hidden_field.rb +1 -1
  184. data/lib/avo/fields/id_field.rb +1 -1
  185. data/lib/avo/fields/location_field.rb +8 -8
  186. data/lib/avo/fields/password_field.rb +1 -1
  187. data/lib/avo/fields/preview_field.rb +14 -0
  188. data/lib/avo/fields/select_field.rb +12 -8
  189. data/lib/avo/fields/status_field.rb +4 -0
  190. data/lib/avo/filters/base_filter.rb +8 -4
  191. data/lib/avo/html/builder.rb +7 -8
  192. data/lib/avo/item_grapher.rb +78 -0
  193. data/lib/avo/licensing/h_q.rb +8 -67
  194. data/lib/avo/licensing/license.rb +1 -1
  195. data/lib/avo/licensing/pro_license.rb +1 -7
  196. data/lib/avo/loaders/fields_loader.rb +7 -1
  197. data/lib/avo/plugin.rb +16 -0
  198. data/lib/avo/plugin_manager.rb +56 -0
  199. data/lib/avo/prefixed_test_helpers.rb +20 -0
  200. data/lib/avo/reloader.rb +3 -0
  201. data/lib/avo/resources/controls/actions_list.rb +7 -12
  202. data/lib/avo/resources/controls/attach_button.rb +15 -0
  203. data/lib/avo/resources/controls/back_button.rb +1 -1
  204. data/lib/avo/resources/controls/base_control.rb +15 -49
  205. data/lib/avo/resources/controls/create_button.rb +15 -0
  206. data/lib/avo/resources/controls/delete_button.rb +5 -1
  207. data/lib/avo/resources/controls/detach_button.rb +4 -1
  208. data/lib/avo/resources/controls/edit_button.rb +4 -1
  209. data/lib/avo/resources/controls/order_controls.rb +8 -0
  210. data/lib/avo/resources/controls/save_button.rb +13 -0
  211. data/lib/avo/resources/controls/show_button.rb +15 -0
  212. data/lib/avo/resources/items/holder.rb +84 -0
  213. data/lib/avo/resources/items/item_group.rb +49 -0
  214. data/lib/avo/resources/items/main_panel.rb +2 -0
  215. data/lib/avo/resources/items/panel.rb +2 -0
  216. data/lib/avo/resources/items/row.rb +54 -0
  217. data/lib/avo/resources/items/sidebar.rb +47 -0
  218. data/lib/avo/resources/items/tab.rb +60 -0
  219. data/lib/avo/resources/items/tab_group.rb +68 -0
  220. data/lib/avo/resources/resource_manager.rb +174 -0
  221. data/lib/avo/services/authorization_service.rb +11 -110
  222. data/lib/avo/services/debug_service.rb +93 -0
  223. data/lib/avo/services/encryption_service.rb +5 -1
  224. data/lib/avo/services/telemetry_service.rb +85 -0
  225. data/lib/avo/test_helpers.rb +362 -0
  226. data/lib/avo/tools/tool_manager.rb +30 -0
  227. data/lib/avo/version.rb +1 -1
  228. data/lib/avo.rb +115 -24
  229. data/lib/generators/avo/action_generator.rb +8 -8
  230. data/lib/generators/avo/card_generator.rb +27 -0
  231. data/lib/generators/avo/filter_generator.rb +8 -8
  232. data/lib/generators/avo/resource_generator.rb +4 -4
  233. data/lib/generators/avo/scope_generator.rb +15 -0
  234. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  235. data/lib/generators/avo/templates/action.tt +8 -6
  236. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  237. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  238. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  239. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  240. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  241. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  242. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  243. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  244. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  245. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  246. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  247. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  248. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  249. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  250. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  251. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  252. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  253. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  254. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  255. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  256. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  257. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  258. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  259. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  260. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  261. data/lib/generators/avo/templates/scope.tt +6 -0
  262. data/lib/generators/avo/templates/tool/view.tt +2 -2
  263. data/lib/tasks/avo_tasks.rake +27 -0
  264. data/public/avo-assets/avo.base.css +1810 -1189
  265. data/public/avo-assets/avo.base.js +217 -307
  266. data/public/avo-assets/avo.base.js.map +3 -3
  267. data/public/avo-assets/avo.css +9744 -0
  268. data/public/avo-assets/avo.js +513 -0
  269. data/public/avo-assets/avo.js.map +7 -0
  270. metadata +102 -146
  271. data/app/assets/stylesheets/css/tags.css +0 -32
  272. data/app/components/avo/card_component.html.erb +0 -46
  273. data/app/components/avo/card_component.rb +0 -25
  274. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  275. data/app/components/avo/dashboards/divider_component.rb +0 -19
  276. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  277. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  278. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  279. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  280. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  281. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  282. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  283. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  284. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  285. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  286. data/app/components/avo/index/ordering/base_component.rb +0 -9
  287. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  288. data/app/components/avo/index/ordering/button_component.rb +0 -23
  289. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  290. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  291. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  292. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  293. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  294. data/app/controllers/avo/dashboards_controller.rb +0 -22
  295. data/app/controllers/avo/reorder_controller.rb +0 -25
  296. data/app/javascript/js/controllers/base_controller.js +0 -22
  297. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  298. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  299. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  300. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  301. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  302. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  303. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  304. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  305. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  306. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  307. data/app/views/avo/dashboards/show.html.erb +0 -38
  308. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  309. data/app/views/avo/partials/_global_search.html.erb +0 -19
  310. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  311. data/lib/avo/app.rb +0 -237
  312. data/lib/avo/base_card.rb +0 -161
  313. data/lib/avo/concerns/fetches_things.rb +0 -150
  314. data/lib/avo/concerns/handles_field_args.rb +0 -47
  315. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  316. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  317. data/lib/avo/concerns/has_fields.rb +0 -334
  318. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  319. data/lib/avo/concerns/pagination.rb +0 -53
  320. data/lib/avo/concerns/policy_helpers.rb +0 -31
  321. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  322. data/lib/avo/concerns/visible_items.rb +0 -51
  323. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  324. data/lib/avo/dashboards/base_divider.rb +0 -35
  325. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  326. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  327. data/lib/avo/dashboards/metric_card.rb +0 -9
  328. data/lib/avo/dashboards/partial_card.rb +0 -7
  329. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  330. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  331. data/lib/avo/fields/tags_field.rb +0 -102
  332. data/lib/avo/grid_collector.rb +0 -42
  333. data/lib/avo/hosts/association_scope_host.rb +0 -8
  334. data/lib/avo/hosts/base_host.rb +0 -25
  335. data/lib/avo/hosts/card_visibility.rb +0 -20
  336. data/lib/avo/hosts/dashboard_card.rb +0 -22
  337. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  338. data/lib/avo/hosts/ordering.rb +0 -22
  339. data/lib/avo/hosts/record_host.rb +0 -7
  340. data/lib/avo/hosts/resource_record_host.rb +0 -7
  341. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  342. data/lib/avo/hosts/search_scope_host.rb +0 -7
  343. data/lib/avo/hosts/view_record_host.rb +0 -7
  344. data/lib/avo/hosts/visibility_host.rb +0 -12
  345. data/lib/avo/items_holder.rb +0 -96
  346. data/lib/avo/main_panel.rb +0 -3
  347. data/lib/avo/menu/base_item.rb +0 -25
  348. data/lib/avo/menu/builder.rb +0 -82
  349. data/lib/avo/menu/dashboard.rb +0 -22
  350. data/lib/avo/menu/group.rb +0 -2
  351. data/lib/avo/menu/link.rb +0 -6
  352. data/lib/avo/menu/menu.rb +0 -2
  353. data/lib/avo/menu/resource.rb +0 -22
  354. data/lib/avo/menu/section.rb +0 -2
  355. data/lib/avo/panel.rb +0 -24
  356. data/lib/avo/panel_builder.rb +0 -25
  357. data/lib/avo/resources/controls/action.rb +0 -38
  358. data/lib/avo/resources/controls/execution_context.rb +0 -58
  359. data/lib/avo/resources/controls/items_holder.rb +0 -19
  360. data/lib/avo/resources/controls/link_to.rb +0 -27
  361. data/lib/avo/row.rb +0 -26
  362. data/lib/avo/row_builder.rb +0 -24
  363. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  364. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  365. data/lib/avo/sidebar.rb +0 -30
  366. data/lib/avo/sidebar_builder.rb +0 -24
  367. data/lib/avo/tab.rb +0 -72
  368. data/lib/avo/tab_builder.rb +0 -25
  369. data/lib/avo/tab_group.rb +0 -42
  370. data/lib/avo/tab_group_builder.rb +0 -43
  371. data/lib/avo/tools_manager.rb +0 -11
  372. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  373. data/lib/generators/avo/card/metric_generator.rb +0 -18
  374. data/lib/generators/avo/card/partial_generator.rb +0 -19
  375. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  376. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  377. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -5,41 +5,23 @@ class Avo::PaginatorComponent < ViewComponent::Base
5
5
  attr_reader :turbo_frame
6
6
  attr_reader :index_params
7
7
  attr_reader :resource
8
- attr_reader :parent_model
8
+ attr_reader :parent_record
9
9
  attr_reader :discreet_pagination
10
10
 
11
- def initialize(resource: nil, parent_model: nil, pagy: nil, turbo_frame: nil, index_params: nil, discreet_pagination: nil)
11
+ def initialize(resource: nil, parent_record: nil, pagy: nil, turbo_frame: nil, index_params: nil, discreet_pagination: nil)
12
12
  @pagy = pagy
13
13
  @turbo_frame = turbo_frame
14
14
  @index_params = index_params
15
15
  @resource = resource
16
- @parent_model = parent_model
16
+ @parent_record = parent_record
17
17
  @discreet_pagination = discreet_pagination
18
18
  end
19
19
 
20
20
  def change_items_per_page_url(option)
21
- if parent_model.present?
22
- helpers.related_resources_path(parent_model, parent_model, per_page: option, keep_query_params: true, page: 1)
21
+ if parent_record.present?
22
+ helpers.related_resources_path(parent_record, parent_record, per_page: option, keep_query_params: true, page: 1)
23
23
  else
24
24
  helpers.resources_path(resource: resource, per_page: option, keep_query_params: true, page: 1)
25
25
  end
26
26
  end
27
-
28
- def render?
29
- return false if discreet_pagination && pagy.pages <= 1
30
-
31
- @pagy.items > 0
32
- end
33
-
34
- def per_page_options
35
- @per_page_options ||= begin
36
- options = [*Avo.configuration.per_page_steps, Avo.configuration.per_page.to_i, index_params[:per_page].to_i]
37
-
38
- if parent_model.present?
39
- options.prepend Avo.configuration.via_per_page
40
- end
41
-
42
- options.sort.uniq
43
- end
44
- end
45
27
  end
@@ -1,6 +1,6 @@
1
1
  <%= content_tag :div, data: data_attributes, class: classes do %>
2
2
  <% if render_header? %>
3
- <div class="flex-1 flex flex-col xl:flex-row justify-between mb-4">
3
+ <div data-target="panel-header" class="flex-1 flex flex-col xl:flex-row justify-between mb-4">
4
4
  <div class="overflow-hidden flex flex-col">
5
5
  <% if display_breadcrumbs? %>
6
6
  <div class="breadcrumbs truncate mb-2">
@@ -24,7 +24,7 @@
24
24
  </div>
25
25
  <% end %>
26
26
  <% if body? %>
27
- <div class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:gap-4 w-full">
27
+ <div data-target="panel-body" class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:gap-4 w-full">
28
28
  <div class="relative flex-1 w-full <% if sidebar? %> sm:w-2/3 <% end %>">
29
29
  <% # The body is wrapped inside another div in order to avoid long & tall panels next to sidebars when the sidebar taller. %>
30
30
  <div class="relative <%= white_panel_classes %> <%= @body_classes %>">
@@ -32,24 +32,26 @@
32
32
  </div>
33
33
  </div>
34
34
  <% if sidebar? %>
35
- <div class="max-w-full sm:w-1/3 flex-shrink-0 h-full <%= white_panel_classes %>">
35
+ <div class="w-full sm:w-1/3 flex-shrink-0 h-full <%= white_panel_classes %>">
36
36
  <%= sidebar %>
37
37
  </div>
38
38
  <% end %>
39
39
  <% if bare_sidebar? %>
40
- <div class="max-w-full sm:w-1/3 flex-shrink-0 h-full">
40
+ <div class="w-full sm:w-1/3 flex-shrink-0 h-full">
41
41
  <%= bare_sidebar %>
42
42
  </div>
43
43
  <% end %>
44
44
  </div>
45
45
  <% end %>
46
46
  <% if bare_content? %>
47
- <div class="relative">
47
+ <div data-target="panel-bare-content" class="relative">
48
48
  <%= bare_content %>
49
49
  </div>
50
50
  <% end %>
51
51
  <% if footer_tools? %>
52
- <div class="flex-1 w-full flex flex-col sm:flex-row xl:justify-end sm:items-end space-y-2 sm:space-y-0 sm:space-x-2 mt-4 xl:mt-0">
52
+ <div
53
+ data-target="panel-footer-tools"
54
+ class="flex-1 w-full flex flex-col sm:flex-row xl:justify-end sm:items-end space-y-2 sm:space-y-0 sm:space-x-2 mt-4 xl:mt-0">
53
55
  <%= footer_tools %>
54
56
  </div>
55
57
  <% end %>
@@ -1,7 +1,6 @@
1
1
  <%# via_association_type is used in has_one create actions %>
2
2
  <%= hidden_field_tag :via_association_type, params[:via_association_type] if params[:via_association_type] %>
3
3
  <%= 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] %>
4
+ <%= hidden_field_tag :via_record_id, params[:via_record_id] if params[:via_record_id] %>
5
5
  <%= 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
6
  <%= hidden_field_tag :referrer, back_path if params[:via_resource_class] %>
@@ -20,7 +20,7 @@ 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)
23
+ return false if @reflection.blank? || @resource.record.blank? || !authorize_association_for(:detach)
24
24
 
25
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
26
  if inverse_of.is_a?(ActiveRecord::Reflection::BelongsToReflection)
@@ -33,7 +33,7 @@ class Avo::ResourceComponent < Avo::BaseComponent
33
33
  def detach_path
34
34
  return "/" if @reflection.blank?
35
35
 
36
- helpers.resource_detach_path(params[:resource_name], params[:id], @reflection.name.to_s, @resource.model.to_param)
36
+ helpers.resource_detach_path(params[:resource_name], params[:id], @reflection.name.to_s, @resource.record.to_param)
37
37
  end
38
38
 
39
39
  def can_see_the_edit_button?
@@ -44,7 +44,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
44
44
  @resource.authorization.authorize_action(:destroy, raise_exception: false)
45
45
  end
46
46
 
47
- def can_act_on?
47
+ def can_see_the_actions_button?
48
+ return false if @actions.blank?
49
+
48
50
  return authorize_association_for(:act_on) if @reflection.present?
49
51
 
50
52
  @resource.authorization.authorize_action(:act_on, raise_exception: false) && !has_reflection_and_is_read_only
@@ -52,9 +54,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
52
54
 
53
55
  def destroy_path
54
56
  if params[:via_resource_class].present?
55
- helpers.resource_path(model: @resource.model, resource: @resource, referrer: back_path)
57
+ helpers.resource_path(record: @resource.record, resource: @resource, referrer: back_path)
56
58
  else
57
- helpers.resource_path(model: @resource.model, resource: @resource)
59
+ helpers.resource_path(record: @resource.record, resource: @resource)
58
60
  end
59
61
  end
60
62
 
@@ -65,9 +67,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
65
67
  if @reflection.present?
66
68
  # Fetch the appropiate resource
67
69
  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?
70
+ # Fetch the record
71
+ # Hydrate the resource with the record if we have one
72
+ reflection_resource.hydrate(record: @parent_record) if @parent_record.present?
71
73
  # Use the related_name as the base of the association
72
74
  association_name = @reflection.name
73
75
 
@@ -80,16 +82,17 @@ class Avo::ResourceComponent < Avo::BaseComponent
80
82
  if service.has_method?(method_name, raise_exception: false)
81
83
  # Some policy methods should get the parent record in order to have the necessarry information to do the authorization
82
84
  # Example: Post->has_many->Comments
85
+ #
83
86
  # When you want to authorize the creation/attaching of a Comment, you don't have the Comment instance.
84
87
  # But you do have the Post instance and you can get that in your policy to authorize against.
85
88
  parent_policy_methods = [:view, :create, :attach, :act_on]
86
89
 
87
90
  record = if parent_policy_methods.include?(policy_method)
88
91
  # Use the parent record (Post)
89
- reflection_resource.model
92
+ reflection_resource.record
90
93
  else
91
94
  # Override the record with the child record (Comment)
92
- resource.model
95
+ resource.record
93
96
  end
94
97
  policy_result = service.authorize_action(method_name, record: record, raise_exception: false)
95
98
  end
@@ -106,7 +109,7 @@ class Avo::ResourceComponent < Avo::BaseComponent
106
109
  end
107
110
 
108
111
  def sidebar
109
- return if Avo::App.license.lacks_with_trial(:resource_sidebar)
112
+ return if Avo.license.lacks_with_trial(:resource_sidebar)
110
113
 
111
114
  @sidebar ||= search_for_sidebar
112
115
  end
@@ -117,23 +120,28 @@ class Avo::ResourceComponent < Avo::BaseComponent
117
120
 
118
121
  def has_reflection_and_is_read_only
119
122
  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
123
+ resource = Avo.resource_manager.get_resource_by_model_class(@reflection.active_record.name).new(params: helpers.params, view: view, user: helpers._current_user)
124
+ fields = resource.get_field_definitions
121
125
  filtered_fields = fields.filter { |f| f.id == @reflection.name }
122
126
  else
123
127
  return false
124
128
  end
125
129
 
126
130
  if filtered_fields.present?
127
- filtered_fields.find { |f| f.id == @reflection.name }.is_readonly?
131
+ filtered_fields.find { |f| f.id == @reflection.name }.is_disabled?
128
132
  else
129
133
  false
130
134
  end
131
135
  end
132
136
 
137
+ def render_control(control)
138
+ send "render_#{control.type}", control
139
+ end
140
+
133
141
  private
134
142
 
135
143
  def via_resource?
136
- (params[:via_resource_class].present? || params[:via_relation_class].present?) && params[:via_resource_id].present?
144
+ (params[:via_resource_class].present? || params[:via_relation_class].present?) && params[:via_record_id].present?
137
145
  end
138
146
 
139
147
  def search_for_sidebar
@@ -144,6 +152,173 @@ class Avo::ResourceComponent < Avo::BaseComponent
144
152
  item&.hydrate(view: view)
145
153
  end
146
154
 
155
+ def render_back_button(control)
156
+ return if is_a_related_resource?
157
+
158
+ tippy = control.title ? :tooltip : nil
159
+ a_link back_path,
160
+ style: :text,
161
+ title: control.title,
162
+ data: {tippy: tippy},
163
+ icon: "arrow-left" do
164
+ control.label
165
+ end
166
+ end
167
+
168
+ def render_actions_list(actions_list)
169
+ return unless can_see_the_actions_button?
170
+
171
+ render Avo::ActionsComponent.new(
172
+ actions: @actions,
173
+ resource: @resource,
174
+ view: @view,
175
+ exclude: actions_list.exclude,
176
+ include: actions_list.include,
177
+ style: actions_list.style,
178
+ color: actions_list.color,
179
+ label: actions_list.label,
180
+ size: actions_list.size,
181
+ as_row_control: instance_of?(Avo::Index::ResourceControlsComponent)
182
+ )
183
+ end
184
+
185
+ def render_delete_button(control)
186
+ # If the resource is a related resource, we use the can_delete? policy method because it uses
187
+ # authorize_association_for(:destroy).
188
+ # Otherwise we use the can_see_the_destroy_button? policy method becuse it do no check for assiciation
189
+ # only for authorize_action .
190
+ policy_method = is_a_related_resource? ? :can_delete? : :can_see_the_destroy_button?
191
+ return unless send policy_method
192
+
193
+ a_link destroy_path,
194
+ style: :text,
195
+ color: :red,
196
+ icon: "trash",
197
+ form_class: "flex flex-col sm:flex-row sm:inline-flex",
198
+ title: control.title,
199
+ data: {
200
+ turbo_confirm: t("avo.are_you_sure", item: @resource.record.model_name.name.downcase),
201
+ turbo_method: :delete,
202
+ target: "control:destroy",
203
+ control: :destroy,
204
+ tippy: control.title ? :tooltip : nil,
205
+ "resource-id": @resource.record.id,
206
+ } do
207
+ control.label
208
+ end
209
+ end
210
+
211
+ def render_save_button(control)
212
+ return unless can_see_the_save_button?
213
+
214
+ a_button color: :primary,
215
+ style: :primary,
216
+ loading: true,
217
+ type: :submit,
218
+ icon: "save" do
219
+ control.label
220
+ end
221
+ end
222
+
223
+ def render_edit_button(control)
224
+ return unless can_see_the_edit_button?
225
+
226
+ a_link edit_path,
227
+ color: :primary,
228
+ style: :primary,
229
+ title: control.title,
230
+ data: {tippy: control.title ? :tooltip : nil},
231
+ icon: "edit" do
232
+ control.label
233
+ end
234
+ end
235
+
236
+ def render_detach_button(control)
237
+ return unless is_a_related_resource? && can_detach?
238
+
239
+ a_button url: detach_path,
240
+ icon: "detach",
241
+ method: :delete,
242
+ form_class: "flex flex-col sm:flex-row sm:inline-flex",
243
+ style: :text,
244
+ data: {
245
+ confirm: "Are you sure you want to detach this #{title}."
246
+ } do
247
+ control.label || t("avo.detach_item", item: title).humanize
248
+ end
249
+ end
250
+
251
+ def render_create_button(control)
252
+ return unless can_see_the_create_button?
253
+
254
+ a_link create_path,
255
+ color: :primary,
256
+ style: :primary,
257
+ icon: "heroicons/outline/plus",
258
+ data: {
259
+ target: :create
260
+ } do
261
+ control.label
262
+ end
263
+ end
264
+
265
+ def render_attach_button(control)
266
+ return unless can_attach?
267
+
268
+ a_link attach_path,
269
+ icon: "heroicons/outline/link",
270
+ color: :primary,
271
+ style: :text,
272
+ data: {
273
+ turbo_frame: :attach_modal,
274
+ target: :attach
275
+ } do
276
+ control.label
277
+ end
278
+ end
279
+
280
+ def render_link_to(link)
281
+ a_link link.path,
282
+ color: link.color,
283
+ style: link.style,
284
+ icon: link.icon,
285
+ icon_class: link.icon_class,
286
+ title: link.title, target: link.target,
287
+ class: link.classes,
288
+ size: link.size,
289
+ data: {
290
+ **link.data,
291
+ tippy: link.title ? :tooltip : nil,
292
+ } do
293
+ link.label
294
+ end
295
+ end
296
+
297
+ def render_action(action)
298
+ return if !can_see_the_actions_button?
299
+ return if !action.action.visible_in_view(parent_resource: @parent_resource)
300
+
301
+ a_link action.path,
302
+ color: action.color,
303
+ style: action.style,
304
+ icon: action.icon,
305
+ icon_class: action.icon_class,
306
+ title: action.title,
307
+ size: action.size,
308
+ data: {
309
+ turbo_frame: "actions_show",
310
+ action_name: action.action.action_name,
311
+ tippy: action.title ? :tooltip : nil,
312
+ action: "click->actions-picker#visitAction",
313
+ } do
314
+ action.label
315
+ end
316
+ end
317
+
318
+ def is_a_related_resource?
319
+ @reflection.present? && @resource.record.present?
320
+ end
321
+
147
322
  def inverse_of
148
323
  current_reflection = @reflection.active_record.reflect_on_all_associations.find do |reflection|
149
324
  reflection.name == @reflection.name.to_sym
@@ -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)
@@ -16,6 +16,6 @@ class Avo::ResourceSidebarComponent < ViewComponent::Base
16
16
  end
17
17
 
18
18
  def render?
19
- Avo::App.license.has_with_trial(:resource_sidebar)
19
+ Avo.license.has_with_trial(:resource_sidebar)
20
20
  end
21
21
  end
@@ -19,7 +19,7 @@ class Avo::Sidebar::LinkComponent < ViewComponent::Base
19
19
 
20
20
  def is_external?
21
21
  # 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?
22
+ return !path.include?(Avo.mount_path) if URI(path).scheme.present?
23
23
 
24
24
  false
25
25
  end
@@ -13,8 +13,8 @@
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? %>
17
- <% Avo::App.main_menu.items.each do |item| %>
16
+ <% if Avo.plugin_manager.installed?("avo-menu") && Avo.has_main_menu? %>
17
+ <% Avo.main_menu.items.each do |item| %>
18
18
  <%= render Avo::Sidebar::ItemSwitcherComponent.new item: item %>
19
19
  <% end %>
20
20
  <% else %>
@@ -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_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 Avo.plugin_manager.installed?("avo-dashboards")
11
+
12
+ Avo::Dashboards.dashboard_manager.dashboards_for_navigation
11
13
  end
12
14
 
13
15
  def resources
14
- Avo::App.resources_for_navigation
16
+ Avo.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.tool_manager.tools_for_navigation
19
21
  end
20
22
 
21
23
  def stimulus_target
@@ -16,24 +16,31 @@
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">
19
+ <div class="relative" data-controller="toggle">
20
+ <a class="flex items-center h-full cursor-pointer" data-control="profile-dots" data-action="click->toggle#togglePanel">
21
21
  <%= helpers.svg 'three-dots', class: 'h-4' %>
22
22
  </a>
23
23
  <div
24
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"
25
+ data-toggle-target="panel"
26
+ data-transition-enter="transition ease-out duration-100"
27
+ data-transition-enter-start="transform opacity-0 translate-y-1"
28
+ data-transition-enter-end="transform opacity-100 translate-y-0"
29
+ data-transition-leave="transition ease-in duration-75"
30
+ data-transition-leave-start="transform opacity-100 translate-y-0"
31
+ data-transition-leave-end="transform opacity-0 translate-y-1"
26
32
  >
27
- <% if Avo::App.has_profile_menu? %>
28
- <div class="text-black">
29
- <% Avo::App.profile_menu.items.each do |item| %>
33
+ <% if Avo.plugin_manager.installed?("avo-menu") && Avo.has_profile_menu? %>
34
+ <div class="text-black space-y-4">
35
+ <% Avo.profile_menu.items.each do |item| %>
30
36
  <% if item.is_a? Avo::Menu::Link %>
31
37
  <%= render Avo::ProfileItemComponent.new label: item.name, path: item.path, icon: item.icon, method: item.method, params: item.params %>
32
38
  <% end %>
33
39
  <% end %>
34
40
  </div>
35
41
  <% end %>
36
- <%= render "avo/partials/profile_menu_extra" %>
42
+ <%# Example link below %>
43
+ <%#= render Avo::ProfileItemComponent.new label: 'Profile', path: '/profile', icon: 'user-circle' %>
37
44
  <% if can_destroy_user? %>
38
45
  <%= button_to helpers.main_app.send(destroy_user_session_path),
39
46
  form: { "data-turbo" => "false" },
@@ -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
+ <% end %>
49
56
  </div>
50
57
  </div>
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>