avo 2.45.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 (371) 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 +8 -8
  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/index_component.rb +5 -5
  40. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  41. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  42. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  43. data/app/components/avo/fields/show_component.rb +4 -1
  44. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  45. data/app/components/avo/filters_component.html.erb +9 -3
  46. data/app/components/avo/filters_component.rb +4 -4
  47. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  48. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  49. data/app/components/avo/index/grid_item_component.rb +43 -16
  50. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  51. data/app/components/avo/index/resource_controls_component.rb +124 -17
  52. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  53. data/app/components/avo/index/resource_grid_component.rb +5 -2
  54. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  55. data/app/components/avo/index/resource_map_component.rb +3 -3
  56. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  57. data/app/components/avo/index/resource_table_component.rb +14 -20
  58. data/app/components/avo/index/table_row_component.html.erb +8 -4
  59. data/app/components/avo/index/table_row_component.rb +3 -2
  60. data/app/components/avo/item_switcher_component.rb +2 -2
  61. data/app/components/avo/modal_component.html.erb +7 -12
  62. data/app/components/avo/modal_component.rb +0 -21
  63. data/app/components/avo/paginator_component.html.erb +40 -29
  64. data/app/components/avo/paginator_component.rb +5 -23
  65. data/app/components/avo/panel_component.html.erb +8 -6
  66. data/app/components/avo/referrer_params_component.html.erb +1 -2
  67. data/app/components/avo/resource_component.rb +189 -14
  68. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  69. data/app/components/avo/resource_sidebar_component.rb +1 -1
  70. data/app/components/avo/sidebar/link_component.rb +1 -1
  71. data/app/components/avo/sidebar_component.html.erb +10 -3
  72. data/app/components/avo/sidebar_component.rb +5 -3
  73. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  74. data/app/components/avo/tab_group_component.html.erb +13 -7
  75. data/app/components/avo/tab_group_component.rb +1 -6
  76. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  77. data/app/components/avo/tab_switcher_component.rb +4 -39
  78. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  79. data/app/components/avo/views/resource_edit_component.rb +7 -18
  80. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  81. data/app/components/avo/views/resource_index_component.rb +62 -12
  82. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  83. data/app/components/avo/views/resource_show_component.rb +6 -11
  84. data/app/controllers/avo/actions_controller.rb +27 -24
  85. data/app/controllers/avo/application_controller.rb +105 -151
  86. data/app/controllers/avo/associations_controller.rb +34 -43
  87. data/app/controllers/avo/attachments_controller.rb +4 -4
  88. data/app/controllers/avo/base_controller.rb +102 -102
  89. data/app/controllers/avo/debug_controller.rb +17 -5
  90. data/app/controllers/avo/home_controller.rb +1 -1
  91. data/app/controllers/avo/search_controller.rb +30 -51
  92. data/app/controllers/avo/team_users_controller.rb +4 -0
  93. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  94. data/app/helpers/avo/application_helper.rb +15 -9
  95. data/app/helpers/avo/resources_helper.rb +1 -1
  96. data/app/helpers/avo/url_helpers.rb +27 -11
  97. data/app/javascript/avo.base.js +1 -0
  98. data/app/javascript/js/application.js +0 -3
  99. data/app/javascript/js/controllers/action_controller.js +5 -3
  100. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  101. data/app/javascript/js/controllers/filter_controller.js +1 -1
  102. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  103. data/app/javascript/js/controllers/preview_controller.js +24 -0
  104. data/app/javascript/js/controllers/search_controller.js +2 -2
  105. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  106. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  107. data/app/javascript/js/controllers.js +10 -6
  108. data/app/javascript/js/custom-stream-actions.js +15 -0
  109. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  110. data/app/views/avo/actions/show.html.erb +9 -6
  111. data/app/views/avo/associations/new.html.erb +2 -2
  112. data/app/views/avo/base/index.html.erb +3 -2
  113. data/app/views/avo/base/new.html.erb +2 -1
  114. data/app/views/avo/base/preview.html.erb +19 -0
  115. data/app/views/avo/base/show.html.erb +1 -1
  116. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  117. data/app/views/avo/debug/report.html.erb +32 -17
  118. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  119. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  120. data/app/views/avo/partials/_footer.html.erb +1 -1
  121. data/app/views/avo/partials/_javascript.html.erb +5 -0
  122. data/app/views/avo/partials/_logo.html.erb +1 -1
  123. data/app/views/avo/partials/_navbar.html.erb +3 -5
  124. data/app/views/avo/partials/_table_header.html.erb +5 -11
  125. data/app/views/layouts/avo/application.html.erb +4 -2
  126. data/avo.gemspec +7 -7
  127. data/bin/dev +1 -1
  128. data/bin/prod +0 -0
  129. data/config/i18n-tasks.yml +1 -1
  130. data/config/initializers/pagy.rb +0 -2
  131. data/config/master.key +1 -0
  132. data/config/routes.rb +6 -10
  133. data/db/factories.rb +7 -1
  134. data/lib/avo/action_model.rb +20 -0
  135. data/lib/avo/asset_manager.rb +30 -0
  136. data/lib/avo/base_action.rb +57 -41
  137. data/lib/avo/base_resource.rb +263 -226
  138. data/lib/avo/base_resource_tool.rb +9 -16
  139. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  140. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  141. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  142. data/lib/avo/concerns/has_controls.rb +37 -0
  143. data/lib/avo/concerns/has_description.rb +23 -0
  144. data/lib/avo/concerns/has_item_type.rb +42 -0
  145. data/lib/avo/concerns/has_items.rb +325 -0
  146. data/lib/avo/concerns/is_resource_item.rb +24 -36
  147. data/lib/avo/concerns/is_visible.rb +15 -0
  148. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  149. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  150. data/lib/avo/configuration/branding.rb +0 -12
  151. data/lib/avo/configuration.rb +1 -37
  152. data/lib/avo/current.rb +39 -0
  153. data/lib/avo/dsl/field_parser.rb +1 -1
  154. data/lib/avo/dynamic_router.rb +18 -3
  155. data/lib/avo/engine.rb +35 -30
  156. data/lib/avo/error_manager.rb +25 -0
  157. data/lib/avo/execution_context.rb +10 -14
  158. data/lib/avo/fields/badge_field.rb +1 -1
  159. data/lib/avo/fields/base_field.rb +91 -105
  160. data/lib/avo/fields/belongs_to_field.rb +18 -22
  161. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  162. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  163. data/lib/avo/fields/concerns/has_default.rb +1 -5
  164. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  165. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  166. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  167. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  168. data/lib/avo/fields/concerns/is_required.rb +5 -7
  169. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  170. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  171. data/lib/avo/fields/country_field.rb +4 -0
  172. data/lib/avo/fields/date_time_field.rb +1 -5
  173. data/lib/avo/fields/field_manager.rb +55 -0
  174. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  175. data/lib/avo/fields/has_base_field.rb +12 -15
  176. data/lib/avo/fields/has_many_field.rb +5 -2
  177. data/lib/avo/fields/has_one_field.rb +6 -10
  178. data/lib/avo/fields/heading_field.rb +4 -1
  179. data/lib/avo/fields/hidden_field.rb +1 -1
  180. data/lib/avo/fields/id_field.rb +1 -1
  181. data/lib/avo/fields/location_field.rb +8 -8
  182. data/lib/avo/fields/password_field.rb +1 -1
  183. data/lib/avo/fields/preview_field.rb +14 -0
  184. data/lib/avo/fields/select_field.rb +12 -8
  185. data/lib/avo/fields/status_field.rb +4 -0
  186. data/lib/avo/filters/base_filter.rb +8 -4
  187. data/lib/avo/html/builder.rb +7 -8
  188. data/lib/avo/item_grapher.rb +78 -0
  189. data/lib/avo/licensing/h_q.rb +7 -66
  190. data/lib/avo/licensing/license.rb +1 -1
  191. data/lib/avo/licensing/pro_license.rb +1 -7
  192. data/lib/avo/loaders/fields_loader.rb +7 -1
  193. data/lib/avo/plugin.rb +16 -0
  194. data/lib/avo/plugin_manager.rb +56 -0
  195. data/lib/avo/prefixed_test_helpers.rb +20 -0
  196. data/lib/avo/reloader.rb +3 -0
  197. data/lib/avo/resources/controls/actions_list.rb +7 -12
  198. data/lib/avo/resources/controls/attach_button.rb +15 -0
  199. data/lib/avo/resources/controls/back_button.rb +1 -1
  200. data/lib/avo/resources/controls/base_control.rb +15 -49
  201. data/lib/avo/resources/controls/create_button.rb +15 -0
  202. data/lib/avo/resources/controls/delete_button.rb +5 -1
  203. data/lib/avo/resources/controls/detach_button.rb +4 -1
  204. data/lib/avo/resources/controls/edit_button.rb +4 -1
  205. data/lib/avo/resources/controls/order_controls.rb +8 -0
  206. data/lib/avo/resources/controls/save_button.rb +13 -0
  207. data/lib/avo/resources/controls/show_button.rb +15 -0
  208. data/lib/avo/resources/items/holder.rb +84 -0
  209. data/lib/avo/resources/items/item_group.rb +49 -0
  210. data/lib/avo/resources/items/main_panel.rb +2 -0
  211. data/lib/avo/resources/items/panel.rb +2 -0
  212. data/lib/avo/resources/items/row.rb +54 -0
  213. data/lib/avo/resources/items/sidebar.rb +47 -0
  214. data/lib/avo/resources/items/tab.rb +60 -0
  215. data/lib/avo/resources/items/tab_group.rb +68 -0
  216. data/lib/avo/resources/resource_manager.rb +174 -0
  217. data/lib/avo/services/authorization_service.rb +11 -110
  218. data/lib/avo/services/debug_service.rb +93 -0
  219. data/lib/avo/services/telemetry_service.rb +85 -0
  220. data/lib/avo/test_helpers.rb +362 -0
  221. data/lib/avo/tools/tool_manager.rb +30 -0
  222. data/lib/avo/version.rb +1 -1
  223. data/lib/avo.rb +115 -24
  224. data/lib/generators/avo/action_generator.rb +8 -8
  225. data/lib/generators/avo/card_generator.rb +27 -0
  226. data/lib/generators/avo/filter_generator.rb +8 -8
  227. data/lib/generators/avo/resource_generator.rb +4 -4
  228. data/lib/generators/avo/scope_generator.rb +15 -0
  229. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  230. data/lib/generators/avo/templates/action.tt +8 -6
  231. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  232. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  233. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  234. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  235. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  236. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  237. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  238. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  239. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  240. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  241. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  242. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  243. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  244. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  245. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  246. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  247. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  248. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  249. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  250. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  251. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  252. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  253. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  254. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  255. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  256. data/lib/generators/avo/templates/scope.tt +6 -0
  257. data/lib/generators/avo/templates/tool/view.tt +2 -2
  258. data/lib/tasks/avo_tasks.rake +27 -0
  259. data/public/avo-assets/avo.base.css +1810 -1189
  260. data/public/avo-assets/avo.base.js +217 -305
  261. data/public/avo-assets/avo.base.js.map +3 -3
  262. data/public/avo-assets/avo.css +9744 -0
  263. data/public/avo-assets/avo.js +513 -0
  264. data/public/avo-assets/avo.js.map +7 -0
  265. metadata +96 -137
  266. data/app/assets/stylesheets/css/tags.css +0 -32
  267. data/app/components/avo/card_component.html.erb +0 -46
  268. data/app/components/avo/card_component.rb +0 -25
  269. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  270. data/app/components/avo/dashboards/divider_component.rb +0 -19
  271. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  272. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  273. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  274. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  275. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  276. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  277. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  278. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  279. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  280. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  281. data/app/components/avo/index/ordering/base_component.rb +0 -9
  282. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  283. data/app/components/avo/index/ordering/button_component.rb +0 -23
  284. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  285. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  286. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  287. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  288. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  289. data/app/controllers/avo/dashboards_controller.rb +0 -22
  290. data/app/controllers/avo/reorder_controller.rb +0 -25
  291. data/app/javascript/js/controllers/base_controller.js +0 -22
  292. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  293. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  294. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  295. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  296. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  297. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  298. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  299. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  300. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  301. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  302. data/app/views/avo/dashboards/show.html.erb +0 -38
  303. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  304. data/app/views/avo/partials/_global_search.html.erb +0 -19
  305. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  306. data/lib/avo/app.rb +0 -237
  307. data/lib/avo/base_card.rb +0 -161
  308. data/lib/avo/concerns/fetches_things.rb +0 -150
  309. data/lib/avo/concerns/handles_field_args.rb +0 -47
  310. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  311. data/lib/avo/concerns/has_fields.rb +0 -334
  312. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  313. data/lib/avo/concerns/pagination.rb +0 -53
  314. data/lib/avo/concerns/policy_helpers.rb +0 -31
  315. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  316. data/lib/avo/concerns/visible_items.rb +0 -51
  317. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  318. data/lib/avo/dashboards/base_divider.rb +0 -35
  319. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  320. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  321. data/lib/avo/dashboards/metric_card.rb +0 -9
  322. data/lib/avo/dashboards/partial_card.rb +0 -7
  323. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  324. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  325. data/lib/avo/fields/tags_field.rb +0 -102
  326. data/lib/avo/grid_collector.rb +0 -42
  327. data/lib/avo/hosts/association_scope_host.rb +0 -8
  328. data/lib/avo/hosts/base_host.rb +0 -25
  329. data/lib/avo/hosts/card_visibility.rb +0 -20
  330. data/lib/avo/hosts/dashboard_card.rb +0 -22
  331. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  332. data/lib/avo/hosts/ordering.rb +0 -22
  333. data/lib/avo/hosts/record_host.rb +0 -7
  334. data/lib/avo/hosts/resource_record_host.rb +0 -7
  335. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  336. data/lib/avo/hosts/search_scope_host.rb +0 -7
  337. data/lib/avo/hosts/view_record_host.rb +0 -7
  338. data/lib/avo/hosts/visibility_host.rb +0 -12
  339. data/lib/avo/items_holder.rb +0 -96
  340. data/lib/avo/main_panel.rb +0 -3
  341. data/lib/avo/menu/base_item.rb +0 -25
  342. data/lib/avo/menu/builder.rb +0 -82
  343. data/lib/avo/menu/dashboard.rb +0 -22
  344. data/lib/avo/menu/group.rb +0 -2
  345. data/lib/avo/menu/link.rb +0 -6
  346. data/lib/avo/menu/menu.rb +0 -2
  347. data/lib/avo/menu/resource.rb +0 -22
  348. data/lib/avo/menu/section.rb +0 -2
  349. data/lib/avo/panel.rb +0 -24
  350. data/lib/avo/panel_builder.rb +0 -25
  351. data/lib/avo/resources/controls/action.rb +0 -38
  352. data/lib/avo/resources/controls/execution_context.rb +0 -58
  353. data/lib/avo/resources/controls/items_holder.rb +0 -19
  354. data/lib/avo/resources/controls/link_to.rb +0 -27
  355. data/lib/avo/row.rb +0 -26
  356. data/lib/avo/row_builder.rb +0 -24
  357. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  358. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  359. data/lib/avo/sidebar.rb +0 -30
  360. data/lib/avo/sidebar_builder.rb +0 -24
  361. data/lib/avo/tab.rb +0 -72
  362. data/lib/avo/tab_builder.rb +0 -25
  363. data/lib/avo/tab_group.rb +0 -42
  364. data/lib/avo/tab_group_builder.rb +0 -43
  365. data/lib/avo/tools_manager.rb +0 -11
  366. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  367. data/lib/generators/avo/card/metric_generator.rb +0 -18
  368. data/lib/generators/avo/card/partial_generator.rb +0 -19
  369. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  370. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  371. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -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>
@@ -9,27 +9,26 @@ class Avo::TabSwitcherComponent < Avo::BaseComponent
9
9
  attr_reader :current_tab
10
10
  attr_reader :tabs
11
11
  attr_reader :view
12
- attr_reader :style
13
12
 
14
13
  delegate :white_panel_classes, to: :helpers
15
14
 
16
- def initialize(resource:, group:, current_tab:, active_tab_name:, view:, style:)
15
+ def initialize(resource:, group:, current_tab:, active_tab_name:, view:)
17
16
  @active_tab_name = active_tab_name
18
17
  @resource = resource
19
18
  @group = group
20
19
  @current_tab = current_tab
21
20
  @tabs = group.items
22
21
  @view = view
23
- @style = style
24
22
  end
25
23
 
24
+ #TOD: helper to record:
26
25
  def tab_path(tab)
27
26
  if is_edit?
28
- helpers.edit_resource_path(resource: @resource, model: @resource.model, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
27
+ helpers.edit_resource_path(resource: @resource, record: @resource.record, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
29
28
  elsif is_new?
30
29
  helpers.new_resource_path(resource: @resource, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
31
30
  else
32
- helpers.resource_path(resource: @resource, model: @resource.model, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
31
+ helpers.resource_path(resource: @resource, record: @resource.record, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
33
32
  end
34
33
  end
35
34
 
@@ -54,38 +53,4 @@ class Avo::TabSwitcherComponent < Avo::BaseComponent
54
53
  tab.name.to_s == active_tab_name.to_s
55
54
  end
56
55
  end
57
-
58
- # Goes through all items and removes the ones that are not supposed to be visible.
59
- # Example below:
60
- # tabs do
61
- # field :comments, as: :has_many
62
- # end
63
- # Because the developer hasn't specified that it should be visible on edit views (with the show_on: :edit option),
64
- # the field should not be visible in the item switcher either.
65
- def visible_items
66
- tabs.select do |tab|
67
- next false if tab.items.blank?
68
- next false if tab.is_field? && !tab.authorized?
69
- next false if tab.has_a_single_item? && !single_item_visible?(tab.items.first)
70
- next false if !tab.visible?
71
- next false if !tab.visible_on?(view)
72
-
73
- true
74
- end
75
- end
76
-
77
- private
78
-
79
- def single_item_visible?(item)
80
- # Item is visible if is not a field or don't have its own panel
81
- return true if !item.is_field?
82
- return true if !item.has_own_panel?
83
-
84
- return false if !item.visible_on?(view)
85
-
86
- # If item is hydrated with the correct resource and is not authorized, it's not visible
87
- return false if item.resource.present? && !item.authorized?
88
-
89
- true
90
- end
91
56
  end