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
@@ -1,11 +1,10 @@
1
1
  <%= content_tag :div,
2
- id: helpers.frame_id(@resource),
3
2
  data: {
4
3
  model_name: @resource.model_name.to_s,
5
4
  resource_name: @resource.class.to_s,
6
- model_id: @resource.model.id,
5
+ record_id: @resource.record.id,
7
6
  selected_resources_name: @resource.model_key,
8
- selected_resources: [@resource.model.id],
7
+ selected_resources: [@resource.record.id],
9
8
  **@resource.stimulus_data_attributes
10
9
  } do %>
11
10
  <%= form_with model: @resource.record,
@@ -19,43 +18,10 @@
19
18
  multipart: true do |form| %>
20
19
  <%= render Avo::ReferrerParamsComponent.new back_path: back_path %>
21
20
  <%= content_tag :div, class: 'space-y-12' do %>
22
- <%= render Avo::PanelComponent.new(name: title, description: @resource.resource_description,
23
- display_breadcrumbs: display_breadcrumbs?,
24
- index: 0, data: { panel_id: "main" }) do |c| %>
21
+ <%= render Avo::PanelComponent.new(name: title, description: @resource.description, display_breadcrumbs: @reflection.blank?, index: 0, data: { panel_id: "main" }) do |c| %>
25
22
  <% c.with_tools do %>
26
- <% if back_path.present? %>
27
- <%= a_link back_path,
28
- style: :text,
29
- icon: 'arrow-left' do %>
30
- <%= t('avo.cancel').capitalize %>
31
- <% end %>
32
- <% end %>
33
- <% if can_see_the_destroy_button? %>
34
- <%= a_link destroy_path,
35
- style: :text,
36
- color: :red,
37
- icon: 'trash',
38
- form_class: 'flex flex-col sm:flex-row sm:inline-flex',
39
- data: {
40
- turbo_confirm: t('avo.are_you_sure', item: @resource.model.model_name.name.downcase),
41
- turbo_method: :delete,
42
- control: :destroy,
43
- 'resource-id': @resource.model.id,
44
- } do %>
45
- <%= t('avo.delete').capitalize %>
46
- <% end %>
47
- <% end %>
48
- <% if can_act_on? %>
49
- <%= render Avo::ActionsComponent.new actions: @actions, resource: @resource, view: @view %>
50
- <% end %>
51
- <% if can_see_the_save_button? %>
52
- <%= a_button color: :primary,
53
- style: :primary,
54
- loading: true,
55
- type: :submit,
56
- icon: 'save' do %>
57
- <%= t('avo.save').capitalize %>
58
- <% end %>
23
+ <% @resource.render_edit_controls.each do |control| %>
24
+ <%= render_control control %>
59
25
  <% end %>
60
26
  <% end %>
61
27
  <%# Extract the main panel and display the fields here. %>
@@ -65,7 +31,7 @@
65
31
  <div class="divide-y">
66
32
  <% main_panel.items.each_with_index do |field, index| %>
67
33
  <%= render field
68
- .hydrate(resource: @resource, model: @resource.model, user: @resource.user, view: view_for(field))
34
+ .hydrate(resource: @resource, record: @resource.record, user: @resource.user, view: view_for(field))
69
35
  .component_for_view(view_for field)
70
36
  .new(field: field, resource: @resource, index: index, form: form, compact: sidebar.present?)
71
37
  %>
@@ -73,7 +39,7 @@
73
39
  </div>
74
40
  <% end %>
75
41
  <% end %>
76
- <% if sidebar.present? && sidebar.visible_items.present? %>
42
+ <% if sidebar.present? %>
77
43
  <% c.with_sidebar do %>
78
44
  <%= render sidebar_component form: form %>
79
45
  <% end %>
@@ -81,12 +47,10 @@
81
47
  <% if Avo.configuration.buttons_on_form_footers %>
82
48
  <% c.with_footer_tools do %>
83
49
  <div class="mt-4">
84
- <% if back_path.present? %>
85
- <%= a_link back_path,
86
- style: :text,
87
- icon: 'arrow-left' do %>
88
- <%= t('avo.cancel').capitalize %>
89
- <% end %>
50
+ <%= a_link back_path,
51
+ style: :text,
52
+ icon: 'arrow-left' do %>
53
+ <%= t('avo.cancel').capitalize %>
90
54
  <% end %>
91
55
  <% if can_see_the_save_button? %>
92
56
  <%= a_button color: :primary,
@@ -104,7 +68,7 @@
104
68
  <%= content_tag :div, class: 'space-y-12' do %>
105
69
  <% @resource.get_items.each_with_index do |item, index| %>
106
70
  <% next if item.nil? %>
107
- <%= render Avo::ItemSwitcherComponent.new resource: @resource, item: item, index: index + 1, view: @view, form: form %>
71
+ <%= render Avo::ItemSwitcherComponent.new resource: @resource, item: item, index: index + 1, view: view, form: form %>
108
72
  <% end %>
109
73
  <% end %>
110
74
  <% end %>
@@ -1,15 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
4
- include Avo::ResourcesHelper
5
4
  include Avo::ApplicationHelper
6
5
 
7
- def initialize(resource: nil, model: nil, actions: [], view: :edit, display_breadcrumbs: true)
6
+ def initialize(resource: nil, record: nil, actions: [], view: :edit)
8
7
  @resource = resource
9
- @model = model
8
+ @record = record
10
9
  @actions = actions
11
10
  @view = view
12
- @display_breadcrumbs = display_breadcrumbs
13
11
  end
14
12
 
15
13
  def title
@@ -17,12 +15,11 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
17
15
  end
18
16
 
19
17
  def back_path
20
- return if via_belongs_to?
21
18
  return resource_view_path if via_resource?
22
19
  return resources_path if via_index?
23
20
 
24
21
  if is_edit? && Avo.configuration.resource_default_view == :show # via resource show or edit page
25
- return helpers.resource_path(model: @resource.model, resource: @resource)
22
+ return helpers.resource_path(record: @resource.record, resource: @resource)
26
23
  end
27
24
 
28
25
  resources_path
@@ -33,7 +30,7 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
33
30
  end
34
31
 
35
32
  def resource_view_path
36
- helpers.resource_view_path(model: association_resource.model, resource: association_resource)
33
+ helpers.resource_view_path(record: association_resource.record, resource: association_resource)
37
34
  end
38
35
 
39
36
  def can_see_the_destroy_button?
@@ -48,20 +45,12 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
48
45
  @resource.authorization.authorize_action @view, raise_exception: false
49
46
  end
50
47
 
51
- def display_breadcrumbs?
52
- @reflection.blank? && @display_breadcrumbs
53
- end
54
-
55
48
  private
56
49
 
57
50
  def via_index?
58
51
  params[:via_view] == "index"
59
52
  end
60
53
 
61
- def via_belongs_to?
62
- params[:via_belongs_to_resource_class].present?
63
- end
64
-
65
54
  def is_edit?
66
55
  view.in?([:edit, :update])
67
56
  end
@@ -75,7 +64,7 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
75
64
  def form_url
76
65
  if is_edit?
77
66
  helpers.resource_path(
78
- model: @resource.model,
67
+ record: @resource.record,
79
68
  resource: @resource
80
69
  )
81
70
  else
@@ -83,13 +72,13 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
83
72
  resource: @resource,
84
73
  via_relation_class: params[:via_relation_class],
85
74
  via_relation: params[:via_relation],
86
- via_resource_id: params[:via_resource_id]
75
+ via_record_id: params[:via_record_id]
87
76
  )
88
77
  end
89
78
  end
90
79
 
91
80
  # Render :show view for read only trix fields
92
81
  def view_for(field)
93
- (field.is_a?(Avo::Fields::TrixField) && field.is_readonly?) ? :show : view
82
+ field.is_a?(Avo::Fields::TrixField) && field.is_disabled? ? :show : view
94
83
  end
95
84
  end
@@ -1,82 +1,76 @@
1
1
  <%= content_tag :div,
2
2
  data: {
3
+ component_name: self.class.to_s.underscore,
3
4
  model_name: @resource.model_name.to_s,
4
5
  resource_name: @resource.class.to_s,
5
6
  **@resource.stimulus_data_attributes
6
7
  } do %>
7
8
  <%= render Avo::PanelComponent.new(name: title, description: description, data: { component: 'resources-index' }, display_breadcrumbs: @reflection.blank?) do |c| %>
8
9
  <% c.with_tools do %>
9
- <% if can_attach? %>
10
- <%= a_link attach_path,
11
- icon: 'heroicons/outline/link',
12
- color: :primary,
13
- style: :text,
14
- 'data-turbo-frame': 'attach_modal',
15
- 'data-target': 'attach' do %>
16
- <%= t('avo.attach_item', item: singular_resource_name).humanize %>
17
- <% end %>
18
- <% end %>
19
- <% if can_act_on? %>
20
- <%= render Avo::ActionsComponent.new actions: @actions, resource: @resource, view: @view %>
21
- <% end %>
22
- <% if can_see_the_create_button? %>
23
- <%= a_link create_path,
24
- icon: 'heroicons/outline/plus',
25
- 'data-target': 'create',
26
- style: :primary,
27
- color: :primary do %>
28
- <%= t('avo.create_new_item', item: singular_resource_name.humanize(capitalize: false) ) %>
29
- <% end %>
10
+ <% @resource.render_index_controls(item: singular_resource_name.downcase).each do |control| %>
11
+ <%= render_control control %>
30
12
  <% end %>
31
13
  <% end %>
32
14
  <% c.with_body do %>
33
- <div class="flex flex-col xs:flex-row xs:justify-between space-y-2 xs:space-y-0 py-4 <%= 'hidden' if @resource.search_query.nil? && @filters.empty? && available_view_types.count <= 1 %>">
34
- <% if show_search_input %>
35
- <div class="flex items-center px-4 w-64">
36
- <%= render partial: 'avo/partials/resource_search', locals: {resource: @resource.route_key, via_reflection: via_reflection} %>
37
- </div>
38
- <% else %>
39
- <%# Offset for the space-y-2 property when the search is missing %>
40
- <div class="-mb-2"></div>
41
- <% end %>
42
- <% if @filters.present? || available_view_types.count > 1 %>
43
- <div class="justify-self-end flex justify-start xs:justify-end items-center px-4 space-x-3">
44
- <%= render Avo::FiltersComponent.new filters: @filters, resource: @resource, applied_filters: @applied_filters, parent_model: @parent_model %>
45
- <%= render partial: 'avo/partials/view_toggle_button', locals: { available_view_types: available_view_types, view_type: view_type, turbo_frame: @turbo_frame } if available_view_types.count > 1 %>
15
+ <div class="flex flex-col">
16
+ <%= render scopes_list if can_render_scopes? %>
17
+ <div class="flex flex-col">
18
+ <div class="flex flex-col xs:flex-row xs:justify-between space-y-2 xs:space-y-0 py-4 <%= 'hidden' unless header_visible? %>">
19
+ <div class="flex items-center px-4 w-64">
20
+ <% if show_search_input %>
21
+ <%= render partial: 'avo/partials/resource_search', locals: {resource: @resource.route_key, via_reflection: via_reflection} %>
22
+ <% else %>
23
+ <%# Offset for the space-y-2 property when the search is missing %>
24
+ <div class="-mb-2"></div>
25
+ <% end %>
26
+ </div>
27
+
28
+ <div class="justify-self-end flex justify-start xs:justify-end items-center px-4 space-x-3">
29
+ <%= render_dynamic_filters_button %>
30
+
31
+ <%= render Avo::FiltersComponent.new filters: @filters, resource: @resource, applied_filters: @applied_filters, parent_record: parent_record %>
32
+
33
+ <%= render partial: 'avo/partials/view_toggle_button', locals: { available_view_types: available_view_types, view_type: view_type, turbo_frame: turbo_frame } %>
34
+ </div>
46
35
  </div>
47
- <% end %>
36
+ <% if Avo.avo_filters_installed? && resource.has_filters? %>
37
+ <%= render Avo::DynamicFilters::FiltersComponent.new resource: resource, turbo_frame: turbo_frame %>
38
+ <% end %>
39
+ </div>
48
40
  </div>
49
- <% if view_type.to_sym == :map %>
41
+ <% if view_type.to_sym == :table %>
50
42
  <% if @resources.present? %>
51
- <div>
52
- <%= render(Avo::Index::ResourceMapComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource, pagy: @pagy, query: @query)) %>
43
+ <div class="w-full relative flex-1 flex mt-0">
44
+ <%= render(Avo::Index::ResourceTableComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_record: parent_record, parent_resource: parent_resource, pagy: @pagy, query: query, actions: actions)) %>
53
45
  </div>
54
46
  <% else %>
55
47
  <%= helpers.empty_state by_association: params[:related_name].present?, view_type: view_type, add_background: true %>
56
48
  <% end %>
57
49
  <% end %>
58
- <% if view_type.to_sym == :table %>
50
+ <% end %>
51
+ <% c.with_bare_content do %>
52
+ <% if view_type.to_sym == :map %>
59
53
  <% if @resources.present? %>
60
- <div class="w-full relative flex-1 flex mt-0">
61
- <%= render(Avo::Index::ResourceTableComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource, pagy: @pagy, query: @query)) %>
54
+ <div>
55
+ <%= render(Avo::Index::ResourceMapComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_record: @parent_record, parent_resource: @parent_resource, pagy: @pagy, query: @query)) %>
62
56
  </div>
63
57
  <% else %>
64
58
  <%= helpers.empty_state by_association: params[:related_name].present?, view_type: view_type, add_background: true %>
65
59
  <% end %>
66
60
  <% end %>
67
- <% end %>
68
- <% c.with_bare_content do %>
69
61
  <% if view_type.to_sym == :table || view_type.to_sym == :map %>
70
- <% if @models.present? %>
62
+ <% if @records.present? %>
71
63
  <div class="mt-4">
72
- <%= render Avo::PaginatorComponent.new pagy: @pagy, turbo_frame: @turbo_frame || 'none', index_params: @index_params, resource: @resource, parent_model: @parent_model, discreet_pagination: field&.discreet_pagination %>
64
+ <%= render Avo::PaginatorComponent.new pagy: @pagy, turbo_frame: turbo_frame || 'none', index_params: @index_params, resource: @resource, parent_record: parent_record, discreet_pagination: field&.discreet_pagination %>
73
65
  </div>
74
66
  <% end %>
75
67
  <% end %>
76
68
  <% if view_type.to_sym == :grid %>
77
- <%= render Avo::Index::ResourceGridComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource) %>
69
+ <div id="records_panel">
70
+ <%= render Avo::Index::ResourceGridComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_record: parent_record, parent_resource: parent_resource, actions: actions) %>
71
+ </div>
78
72
  <div class="mt-6">
79
- <%= render Avo::PaginatorComponent.new pagy: @pagy, turbo_frame: @turbo_frame || 'none', index_params: @index_params, resource: @resource, parent_model: @parent_model, discreet_pagination: field&.discreet_pagination %>
73
+ <%= render Avo::PaginatorComponent.new pagy: @pagy, turbo_frame: turbo_frame || 'none', index_params: @index_params, resource: @resource, parent_record: parent_record, discreet_pagination: field&.discreet_pagination %>
80
74
  </div>
81
75
  <% end %>
82
76
  <% end %>
@@ -4,35 +4,39 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
4
4
  include Avo::ResourcesHelper
5
5
  include Avo::ApplicationHelper
6
6
 
7
+ attr_reader :scopes, :query, :turbo_frame, :parent_record, :parent_resource, :resource, :actions
8
+
7
9
  def initialize(
8
10
  resource: nil,
9
11
  resources: nil,
10
- models: [],
12
+ records: [],
11
13
  pagy: nil,
12
14
  index_params: {},
13
15
  filters: [],
14
16
  actions: [],
15
17
  reflection: nil,
16
18
  turbo_frame: "",
17
- parent_model: nil,
19
+ parent_record: nil,
18
20
  parent_resource: nil,
19
21
  applied_filters: [],
20
- query: nil
22
+ query: nil,
23
+ scopes: nil
21
24
  )
22
25
  @resource = resource
23
26
  @resources = resources
24
- @models = models
27
+ @records = records
25
28
  @pagy = pagy
26
29
  @index_params = index_params
27
30
  @filters = filters
28
31
  @actions = actions
29
32
  @reflection = reflection
30
33
  @turbo_frame = turbo_frame
31
- @parent_model = parent_model
34
+ @parent_record = parent_record
32
35
  @parent_resource = parent_resource
33
36
  @applied_filters = applied_filters
34
37
  @view = :index
35
38
  @query = query
39
+ @scopes = scopes
36
40
  end
37
41
 
38
42
  def title
@@ -74,7 +78,7 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
74
78
  if @reflection.present?
75
79
  args = {
76
80
  via_relation_class: reflection_model_class,
77
- via_resource_id: @parent_model.to_param
81
+ via_record_id: @parent_record.to_param
78
82
  }
79
83
 
80
84
  if @reflection.is_a? ActiveRecord::Reflection::ThroughReflection
@@ -96,7 +100,7 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
96
100
  def attach_path
97
101
  current_path = CGI.unescape(request.env["PATH_INFO"]).split("/").select(&:present?)
98
102
 
99
- Avo::App.root_path(paths: [*current_path, "new"])
103
+ Avo.root_path(paths: [*current_path, "new"])
100
104
  end
101
105
 
102
106
  def singular_resource_name
@@ -117,12 +121,12 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
117
121
  return
118
122
  end
119
123
 
120
- @resource.resource_description
124
+ @resource.description
121
125
  end
122
126
 
123
127
  def show_search_input
124
128
  return false unless authorized_to_search?
125
- return false unless @resource.search_query.present?
129
+ return false unless resource.class.search_query.present?
126
130
  return false if field&.hide_search_input
127
131
 
128
132
  true
@@ -130,9 +134,39 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
130
134
 
131
135
  def authorized_to_search?
132
136
  # Hide the search if the authorization prevents it
133
- return true unless @resource.authorization.has_action_method?("search")
137
+ return true unless resource.authorization.respond_to?(:has_action_method?)
138
+ return true unless resource.authorization.has_action_method?("search")
139
+
140
+ resource.authorization.authorize_action("search", raise_exception: false)
141
+ end
142
+
143
+ def render_dynamic_filters_button
144
+ return unless Avo.avo_filters_installed?
145
+ return unless resource.has_filters?
146
+ return if Avo::DynamicFilters.configuration.always_expanded
147
+
148
+ a_button size: :sm,
149
+ color: :primary,
150
+ icon: "filter",
151
+ data: {
152
+ controller: "avo-filters",
153
+ action: "click->avo-filters#toggleFiltersArea",
154
+ } do
155
+ Avo::DynamicFilters.configuration.button_label
156
+ end
157
+ end
158
+
159
+ def scopes_list
160
+ Avo::Pro::Scopes::ListComponent.new(
161
+ scopes: scopes,
162
+ resource: resource,
163
+ turbo_frame: turbo_frame,
164
+ parent_record: parent_record
165
+ )
166
+ end
134
167
 
135
- @resource.authorization.authorize_action("search", raise_exception: false)
168
+ def can_render_scopes?
169
+ defined?(Avo::Pro)
136
170
  end
137
171
 
138
172
  private
@@ -152,7 +186,23 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
152
186
  association: "has_many",
153
187
  association_id: @reflection.name,
154
188
  class: reflection_model_class,
155
- id: @parent_model.to_param
189
+ id: @parent_record.to_param
156
190
  }
157
191
  end
192
+
193
+ def header_visible?
194
+ search_query_present? || filters_present? || has_many_view_types? || (Avo.avo_filters_installed? && resource.has_filters? && Avo::DynamicFilters.configuration.always_expanded)
195
+ end
196
+
197
+ def search_query_present?
198
+ @resource.class.search_query.present?
199
+ end
200
+
201
+ def filters_present?
202
+ @filters.present?
203
+ end
204
+
205
+ def has_many_view_types?
206
+ available_view_types.count > 1
207
+ end
158
208
  end
@@ -2,158 +2,15 @@
2
2
  data: {
3
3
  model_name: @resource.model_name.to_s,
4
4
  resource_name: @resource.class.to_s,
5
- model_id: @resource.model.id,
5
+ record_id: @resource.record.id,
6
6
  selected_resources_name: @resource.model_key,
7
- selected_resources: [@resource.model.id],
7
+ selected_resources: [@resource.record.id],
8
8
  **@resource.stimulus_data_attributes
9
9
  } do %>
10
- <%= render Avo::PanelComponent.new(name: title, description: @resource.resource_description, display_breadcrumbs: @reflection.blank?, index: 0, data: { panel_id: "main" }) do |c| %>
10
+ <%= render Avo::PanelComponent.new(name: title, description: @resource.description, display_breadcrumbs: @reflection.blank?, index: 0, data: { panel_id: "main" }) do |c| %>
11
11
  <% c.with_tools do %>
12
- <% if @resource.has_show_controls? %>
13
- <% @resource.render_show_controls.each do |control| %>
14
- <% if control.back_button? %>
15
- <%= a_link back_path,
16
- style: :text,
17
- title: control.title,
18
- data: {
19
- tippy: control.title ? :tooltip : nil,
20
- },
21
- icon: 'arrow-left' do %>
22
- <%= control.label %>
23
- <% end %>
24
- <% elsif control.delete_button? %>
25
- <% if can_see_the_destroy_button? %>
26
- <%= a_link helpers.resource_path(model: @resource.model, resource: @resource),
27
- style: :text,
28
- color: :red,
29
- icon: 'trash',
30
- form_class: 'flex flex-col sm:flex-row sm:inline-flex',
31
- title: control.title,
32
- data: {
33
- turbo_confirm: t('avo.are_you_sure', item: @resource.model.model_name.name.downcase),
34
- turbo_method: :delete,
35
- control: :destroy,
36
- tippy: control.title ? :tooltip : nil,
37
- 'resource-id': @resource.model.id,
38
- } do %>
39
- <%= control.label %>
40
- <% end %>
41
- <% end %>
42
- <% elsif can_act_on? && control.actions_list? %>
43
- <%= render Avo::ActionsComponent.new actions: @actions, resource: @resource, view: @view, exclude: control.exclude, include: control.include, style: control.style, color: control.color, label: control.label %>
44
- <% elsif control.edit_button? %>
45
- <% if @resource.authorization.authorize_action(:edit, raise_exception: false) %>
46
- <%= a_link edit_path,
47
- color: :primary,
48
- style: :primary,
49
- title: control.title,
50
- data: {
51
- tippy: control.title ? :tooltip : nil,
52
- },
53
- icon: 'edit' do %>
54
- <%= control.label %>
55
- <% end %>
56
- <% end %>
57
- <% elsif control.action? %>
58
- <% if render_action_control?(control.action) %>
59
- <%= a_link control.path,
60
- color: control.color,
61
- style: control.style,
62
- icon: control.icon,
63
- title: control.title,
64
- data: {
65
- tippy: control.title ? :tooltip : nil,
66
- 'turbo-frame': 'actions_show',
67
- 'action': 'click->actions-picker#visitAction',
68
- } do %>
69
- <%= control.label %>
70
- <% end %>
71
- <% end %>
72
- <% elsif control.link_to? %>
73
- <%= a_link control.path,
74
- color: control.color,
75
- style: control.style,
76
- icon: control.icon,
77
- title: control.title,
78
- target: control.target,
79
- class: control.class,
80
- data: {
81
- **control.data,
82
- tippy: control.title ? :tooltip : nil,
83
- } do %>
84
- <%= control.label %>
85
- <% end %>
86
- <% elsif control.detach_button? %>
87
- <% if @reflection.present? && @resource.model.present? && can_detach? %>
88
- <%= a_button url: detach_path,
89
- icon: 'detach',
90
- method: :delete,
91
- form_class: 'flex flex-col sm:flex-row sm:inline-flex',
92
- style: :text,
93
- data: {
94
- confirm: "Are you sure you want to detach this #{title}."
95
- } do %>
96
- <%= control.label %>
97
- <% end %>
98
- <% end %>
99
- <% end %>
100
- <% end %>
101
- <% else %>
102
- <% if @reflection.present? && @resource.model.present? %>
103
- <% if can_detach? %>
104
- <%= a_button url: detach_path,
105
- icon: 'detach',
106
- method: :delete,
107
- form_class: 'flex flex-col sm:flex-row sm:inline-flex',
108
- style: :text,
109
- data: {
110
- confirm: "Are you sure you want to detach this #{title}."
111
- } do %>
112
- <%= t('avo.detach_item', item: title).humanize %>
113
- <% end %>
114
- <% end %>
115
- <%= render Avo::ActionsComponent.new actions: @actions, resource: @resource, view: @view %>
116
- <% if can_see_the_edit_button? %>
117
- <%= a_link edit_path,
118
- color: :primary,
119
- style: :primary,
120
- icon: 'edit' do %>
121
- <%= t('avo.edit').capitalize %>
122
- <% end %>
123
- <% end %>
124
- <% else %>
125
- <%= a_link back_path,
126
- style: :text,
127
- icon: 'arrow-left' do %>
128
- <%= t('avo.go_back') %>
129
- <% end %>
130
- <% if can_see_the_destroy_button? %>
131
- <%= a_link destroy_path,
132
- style: :text,
133
- color: :red,
134
- icon: 'trash',
135
- form_class: 'flex flex-col sm:flex-row sm:inline-flex',
136
- data: {
137
- turbo_confirm: t('avo.are_you_sure', item: @resource.model.model_name.name.downcase),
138
- turbo_method: :delete,
139
- control: :destroy,
140
- 'resource-id': @resource.model.id,
141
- } do %>
142
- <%= t('avo.delete').capitalize %>
143
- <% end %>
144
- <% end %>
145
- <% if can_act_on? %>
146
- <%= render Avo::ActionsComponent.new actions: @actions, resource: @resource, view: @view %>
147
- <% end %>
148
- <% if @resource.authorization.authorize_action(:edit, raise_exception: false) %>
149
- <%= a_link edit_path,
150
- color: :primary,
151
- style: :primary,
152
- icon: 'edit' do %>
153
- <%= t('avo.edit').capitalize %>
154
- <% end %>
155
- <% end %>
156
- <% end %>
12
+ <% @resource.render_show_controls.each do |control| %>
13
+ <%= render_control control %>
157
14
  <% end %>
158
15
  <% end %>
159
16
  <% if main_panel.present? %>
@@ -162,7 +19,7 @@
162
19
  <div class="divide-y overflow-auto">
163
20
  <% main_panel.items.each_with_index do |field, index| %>
164
21
  <%= render field
165
- .hydrate(resource: @resource, model: @resource.model, user: @resource.user, view: view)
22
+ .hydrate(resource: @resource, record: @resource.record, user: @resource.user, view: view)
166
23
  .component_for_view(view)
167
24
  .new(field: field, resource: @resource, index: index, compact: sidebar.present?)
168
25
  %>