avo 2.44.0 → 3.0.2

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 (411) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +28 -26
  3. data/Gemfile.lock +231 -161
  4. data/README.md +19 -27
  5. data/Rakefile +2 -0
  6. data/app/assets/stylesheets/avo.base.css +1 -1
  7. data/app/assets/svgs/font.svg +1 -0
  8. data/app/assets/svgs/triangle-up.svg +1 -0
  9. data/app/components/avo/actions_component.html.erb +19 -5
  10. data/app/components/avo/actions_component.rb +39 -19
  11. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  12. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  14. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  15. data/app/components/avo/base_component.rb +15 -12
  16. data/app/components/avo/button_component.rb +20 -3
  17. data/app/components/avo/empty_state_component.rb +1 -1
  18. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  19. data/app/components/avo/field_wrapper_component.rb +9 -15
  20. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  21. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +75 -79
  22. data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
  23. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  24. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  25. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  26. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  27. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  28. data/app/components/avo/fields/common/badge_viewer_component.rb +1 -1
  29. data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
  30. data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
  31. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  32. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
  33. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  34. data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
  35. data/app/components/avo/fields/common/heading_component.html.erb +3 -8
  36. data/app/components/avo/fields/common/heading_component.rb +1 -3
  37. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  38. data/app/components/avo/fields/common/key_value_component.rb +2 -2
  39. data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
  40. data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
  41. data/app/components/avo/fields/edit_component.rb +2 -2
  42. data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
  43. data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
  44. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  45. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  46. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  47. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  48. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  49. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
  51. data/app/components/avo/fields/index_component.rb +6 -6
  52. data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
  53. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  54. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  55. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  56. data/app/components/avo/fields/show_component.rb +5 -2
  57. data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
  58. data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
  59. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  60. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  61. data/app/components/avo/filters_component.html.erb +9 -3
  62. data/app/components/avo/filters_component.rb +4 -4
  63. data/app/components/avo/index/field_wrapper_component.rb +1 -13
  64. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  65. data/app/components/avo/index/grid_item_component.rb +43 -16
  66. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  67. data/app/components/avo/index/resource_controls_component.rb +125 -18
  68. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  69. data/app/components/avo/index/resource_grid_component.rb +5 -2
  70. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  71. data/app/components/avo/index/resource_map_component.rb +3 -3
  72. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  73. data/app/components/avo/index/resource_table_component.rb +24 -7
  74. data/app/components/avo/index/table_row_component.html.erb +9 -5
  75. data/app/components/avo/index/table_row_component.rb +3 -2
  76. data/app/components/avo/items/panel_component.html.erb +25 -0
  77. data/app/components/avo/items/panel_component.rb +43 -0
  78. data/app/components/avo/items/switcher_component.html.erb +17 -0
  79. data/app/components/avo/items/switcher_component.rb +79 -0
  80. data/app/components/avo/items/visible_items_component.html.erb +10 -0
  81. data/app/components/avo/items/visible_items_component.rb +11 -0
  82. data/app/components/avo/modal_component.html.erb +3 -4
  83. data/app/components/avo/paginator_component.html.erb +29 -40
  84. data/app/components/avo/paginator_component.rb +23 -5
  85. data/app/components/avo/panel_component.html.erb +7 -5
  86. data/app/components/avo/referrer_params_component.html.erb +1 -1
  87. data/app/components/avo/resource_component.rb +205 -26
  88. data/app/components/avo/resource_sidebar_component.html.erb +15 -18
  89. data/app/components/avo/resource_sidebar_component.rb +5 -3
  90. data/app/components/avo/sidebar/link_component.rb +1 -1
  91. data/app/components/avo/sidebar_component.html.erb +10 -3
  92. data/app/components/avo/sidebar_component.rb +5 -3
  93. data/app/components/avo/sidebar_profile_component.html.erb +18 -12
  94. data/app/components/avo/tab_group_component.html.erb +14 -8
  95. data/app/components/avo/tab_group_component.rb +1 -6
  96. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  97. data/app/components/avo/tab_switcher_component.rb +6 -41
  98. data/app/components/avo/views/resource_edit_component.html.erb +23 -84
  99. data/app/components/avo/views/resource_edit_component.rb +20 -19
  100. data/app/components/avo/views/resource_index_component.html.erb +42 -47
  101. data/app/components/avo/views/resource_index_component.rb +76 -13
  102. data/app/components/avo/views/resource_show_component.html.erb +16 -177
  103. data/app/components/avo/views/resource_show_component.rb +16 -10
  104. data/app/controllers/avo/actions_controller.rb +29 -31
  105. data/app/controllers/avo/application_controller.rb +119 -181
  106. data/app/controllers/avo/associations_controller.rb +34 -43
  107. data/app/controllers/avo/attachments_controller.rb +4 -4
  108. data/app/controllers/avo/base_controller.rb +145 -98
  109. data/app/controllers/avo/debug_controller.rb +17 -5
  110. data/app/controllers/avo/home_controller.rb +1 -1
  111. data/app/controllers/avo/search_controller.rb +56 -50
  112. data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
  113. data/app/helpers/avo/application_helper.rb +18 -8
  114. data/app/helpers/avo/resources_helper.rb +1 -1
  115. data/app/helpers/avo/url_helpers.rb +28 -12
  116. data/app/javascript/avo.base.js +1 -0
  117. data/app/javascript/js/controllers/action_controller.js +3 -1
  118. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  119. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
  120. data/app/javascript/js/controllers/filter_controller.js +1 -1
  121. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  122. data/app/javascript/js/controllers/preview_controller.js +24 -0
  123. data/app/javascript/js/controllers/search_controller.js +4 -2
  124. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  125. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  126. data/app/javascript/js/controllers.js +11 -5
  127. data/app/javascript/js/custom-stream-actions.js +15 -0
  128. data/app/views/avo/actions/show.html.erb +9 -5
  129. data/app/views/avo/associations/new.html.erb +2 -2
  130. data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
  131. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
  132. data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
  133. data/app/views/avo/base/edit.html.erb +1 -1
  134. data/app/views/avo/base/index.html.erb +4 -3
  135. data/app/views/avo/base/new.html.erb +2 -1
  136. data/app/views/avo/base/preview.html.erb +19 -0
  137. data/app/views/avo/base/show.html.erb +2 -2
  138. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  139. data/app/views/avo/debug/report.html.erb +32 -17
  140. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  141. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  142. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +1 -1
  143. data/app/views/avo/partials/_footer.html.erb +1 -1
  144. data/app/views/avo/partials/_javascript.html.erb +5 -0
  145. data/app/views/avo/partials/_logo.html.erb +1 -1
  146. data/app/views/avo/partials/_navbar.html.erb +3 -5
  147. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  148. data/app/views/avo/partials/_table_header.html.erb +5 -11
  149. data/app/views/layouts/avo/application.html.erb +5 -4
  150. data/avo.gemspec +10 -8
  151. data/bin/dev +3 -1
  152. data/bin/prod +0 -0
  153. data/config/i18n-tasks.yml +1 -1
  154. data/config/initializers/pagy.rb +2 -0
  155. data/config/master.key +1 -0
  156. data/config/routes.rb +7 -10
  157. data/db/factories.rb +6 -0
  158. data/lib/avo/asset_manager.rb +30 -0
  159. data/lib/avo/base_action.rb +78 -60
  160. data/lib/avo/base_resource.rb +286 -225
  161. data/lib/avo/base_resource_tool.rb +9 -16
  162. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  163. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  164. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  165. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  166. data/lib/avo/concerns/has_controls.rb +37 -0
  167. data/lib/avo/concerns/has_description.rb +23 -0
  168. data/lib/avo/concerns/has_helpers.rb +18 -0
  169. data/lib/avo/concerns/has_item_type.rb +42 -0
  170. data/lib/avo/concerns/has_items.rb +339 -0
  171. data/lib/avo/concerns/hydration.rb +17 -0
  172. data/lib/avo/concerns/is_resource_item.rb +16 -36
  173. data/lib/avo/concerns/is_visible.rb +15 -0
  174. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  175. data/lib/avo/concerns/pagination.rb +53 -0
  176. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  177. data/lib/avo/concerns/visible_items.rb +7 -38
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +28 -11
  180. data/lib/avo/current.rb +39 -0
  181. data/lib/avo/dsl/field_parser.rb +3 -3
  182. data/lib/avo/dynamic_router.rb +18 -3
  183. data/lib/avo/engine.rb +35 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +14 -15
  186. data/lib/avo/fields/base_field.rb +84 -121
  187. data/lib/avo/fields/belongs_to_field.rb +19 -23
  188. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  189. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  190. data/lib/avo/fields/concerns/has_default.rb +1 -5
  191. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  192. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  193. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  194. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  195. data/lib/avo/fields/concerns/is_required.rb +5 -7
  196. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  199. data/lib/avo/fields/country_field.rb +4 -0
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/external_image_field.rb +2 -2
  202. data/lib/avo/fields/field_manager.rb +55 -0
  203. data/lib/avo/fields/file_field.rb +2 -2
  204. data/lib/avo/fields/gravatar_field.rb +2 -2
  205. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  206. data/lib/avo/fields/has_base_field.rb +21 -17
  207. data/lib/avo/fields/has_many_field.rb +5 -2
  208. data/lib/avo/fields/has_one_field.rb +8 -12
  209. data/lib/avo/fields/heading_field.rb +9 -14
  210. data/lib/avo/fields/hidden_field.rb +1 -1
  211. data/lib/avo/fields/id_field.rb +3 -3
  212. data/lib/avo/fields/location_field.rb +10 -10
  213. data/lib/avo/fields/password_field.rb +1 -1
  214. data/lib/avo/fields/preview_field.rb +14 -0
  215. data/lib/avo/fields/select_field.rb +12 -8
  216. data/lib/avo/fields/status_field.rb +7 -1
  217. data/lib/avo/fields/text_field.rb +2 -2
  218. data/lib/avo/filters/base_filter.rb +9 -4
  219. data/lib/avo/html/builder.rb +8 -8
  220. data/lib/avo/item_grapher.rb +78 -0
  221. data/lib/avo/licensing/h_q.rb +11 -73
  222. data/lib/avo/licensing/license.rb +5 -1
  223. data/lib/avo/licensing/license_manager.rb +1 -1
  224. data/lib/avo/licensing/pro_license.rb +1 -7
  225. data/lib/avo/loaders/fields_loader.rb +7 -1
  226. data/lib/avo/plugin.rb +36 -0
  227. data/lib/avo/plugin_manager.rb +56 -0
  228. data/lib/avo/prefixed_test_helpers.rb +20 -0
  229. data/lib/avo/reloader.rb +3 -0
  230. data/lib/avo/resources/controls/actions_list.rb +7 -12
  231. data/lib/avo/resources/controls/attach_button.rb +15 -0
  232. data/lib/avo/resources/controls/back_button.rb +1 -1
  233. data/lib/avo/resources/controls/base_control.rb +15 -49
  234. data/lib/avo/resources/controls/create_button.rb +15 -0
  235. data/lib/avo/resources/controls/delete_button.rb +5 -1
  236. data/lib/avo/resources/controls/detach_button.rb +4 -1
  237. data/lib/avo/resources/controls/edit_button.rb +4 -1
  238. data/lib/avo/resources/controls/order_controls.rb +8 -0
  239. data/lib/avo/resources/controls/save_button.rb +13 -0
  240. data/lib/avo/resources/controls/show_button.rb +15 -0
  241. data/lib/avo/resources/items/holder.rb +96 -0
  242. data/lib/avo/resources/items/item_group.rb +44 -0
  243. data/lib/avo/resources/items/main_panel.rb +12 -0
  244. data/lib/avo/resources/items/panel.rb +2 -0
  245. data/lib/avo/resources/items/row.rb +42 -0
  246. data/lib/avo/resources/items/sidebar.rb +46 -0
  247. data/lib/avo/resources/items/tab.rb +54 -0
  248. data/lib/avo/resources/items/tab_group.rb +62 -0
  249. data/lib/avo/resources/resource_manager.rb +179 -0
  250. data/lib/avo/services/authorization_service.rb +11 -110
  251. data/lib/avo/services/debug_service.rb +93 -0
  252. data/lib/avo/services/encryption_service.rb +8 -12
  253. data/lib/avo/services/telemetry_service.rb +85 -0
  254. data/lib/avo/test_helpers.rb +362 -0
  255. data/lib/avo/tools/tool_manager.rb +30 -0
  256. data/lib/avo/version.rb +1 -1
  257. data/lib/avo/view_inquirer.rb +36 -0
  258. data/lib/avo.rb +109 -24
  259. data/lib/generators/avo/action_generator.rb +8 -8
  260. data/lib/generators/avo/card_generator.rb +27 -0
  261. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  262. data/lib/generators/avo/controller_generator.rb +3 -0
  263. data/lib/generators/avo/eject_generator.rb +180 -15
  264. data/lib/generators/avo/field_generator.rb +49 -2
  265. data/lib/generators/avo/filter_generator.rb +8 -8
  266. data/lib/generators/avo/js/install_generator.rb +2 -2
  267. data/lib/generators/avo/resource_generator.rb +12 -9
  268. data/lib/generators/avo/scope_generator.rb +15 -0
  269. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  270. data/lib/generators/avo/templates/action.tt +8 -6
  271. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  272. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  273. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  274. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  275. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  276. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  277. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  278. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  279. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  280. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  281. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  282. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  283. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  284. data/lib/generators/avo/templates/locales/avo.ar.yml +7 -6
  285. data/lib/generators/avo/templates/locales/avo.en.yml +6 -3
  286. data/lib/generators/avo/templates/locales/avo.es.yml +127 -0
  287. data/lib/generators/avo/templates/locales/avo.fr.yml +3 -0
  288. data/lib/generators/avo/templates/locales/avo.nb.yml +3 -0
  289. data/lib/generators/avo/templates/locales/avo.nn.yml +3 -0
  290. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +3 -0
  291. data/lib/generators/avo/templates/locales/avo.pt.yml +3 -0
  292. data/lib/generators/avo/templates/locales/avo.ro.yml +8 -5
  293. data/lib/generators/avo/templates/locales/avo.tr.yml +3 -0
  294. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  295. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  296. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  297. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  298. data/lib/generators/avo/templates/scope.tt +6 -0
  299. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  300. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  301. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  302. data/lib/tasks/avo_tasks.rake +72 -4
  303. data/public/avo-assets/avo.base.css +1893 -1187
  304. data/public/avo-assets/avo.base.js +217 -305
  305. data/public/avo-assets/avo.base.js.map +3 -3
  306. data/public/avo-assets/avo.css +9744 -0
  307. data/public/avo-assets/avo.js +513 -0
  308. data/public/avo-assets/avo.js.map +7 -0
  309. data/tailwind.custom.js +47 -0
  310. data/tailwind.preset.js +152 -0
  311. metadata +107 -114
  312. data/app/components/avo/card_component.html.erb +0 -46
  313. data/app/components/avo/card_component.rb +0 -25
  314. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  315. data/app/components/avo/dashboards/divider_component.rb +0 -19
  316. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  317. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  318. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  319. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  320. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  321. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  322. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  323. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  324. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  325. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  326. data/app/components/avo/index/ordering/base_component.rb +0 -9
  327. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  328. data/app/components/avo/index/ordering/button_component.rb +0 -23
  329. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  330. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  331. data/app/components/avo/item_switcher_component.html.erb +0 -27
  332. data/app/components/avo/item_switcher_component.rb +0 -48
  333. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  334. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  335. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  336. data/app/controllers/avo/dashboards_controller.rb +0 -22
  337. data/app/controllers/avo/reorder_controller.rb +0 -25
  338. data/app/javascript/js/controllers/base_controller.js +0 -22
  339. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  340. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  341. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  342. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  343. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  344. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  345. data/app/views/avo/dashboards/show.html.erb +0 -38
  346. data/app/views/avo/partials/_global_search.html.erb +0 -19
  347. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  348. data/lib/avo/app.rb +0 -237
  349. data/lib/avo/base_card.rb +0 -161
  350. data/lib/avo/concerns/fetches_things.rb +0 -150
  351. data/lib/avo/concerns/handles_field_args.rb +0 -47
  352. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  353. data/lib/avo/concerns/has_fields.rb +0 -334
  354. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  355. data/lib/avo/concerns/policy_helpers.rb +0 -31
  356. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  357. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  358. data/lib/avo/dashboards/base_divider.rb +0 -35
  359. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  360. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  361. data/lib/avo/dashboards/metric_card.rb +0 -9
  362. data/lib/avo/dashboards/partial_card.rb +0 -7
  363. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  364. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  365. data/lib/avo/fields/tags_field.rb +0 -102
  366. data/lib/avo/grid_collector.rb +0 -42
  367. data/lib/avo/hosts/association_scope_host.rb +0 -8
  368. data/lib/avo/hosts/base_host.rb +0 -25
  369. data/lib/avo/hosts/card_visibility.rb +0 -20
  370. data/lib/avo/hosts/dashboard_card.rb +0 -22
  371. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  372. data/lib/avo/hosts/ordering.rb +0 -22
  373. data/lib/avo/hosts/record_host.rb +0 -7
  374. data/lib/avo/hosts/resource_record_host.rb +0 -7
  375. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  376. data/lib/avo/hosts/search_scope_host.rb +0 -7
  377. data/lib/avo/hosts/view_record_host.rb +0 -7
  378. data/lib/avo/hosts/visibility_host.rb +0 -12
  379. data/lib/avo/items_holder.rb +0 -96
  380. data/lib/avo/main_panel.rb +0 -3
  381. data/lib/avo/menu/base_item.rb +0 -25
  382. data/lib/avo/menu/builder.rb +0 -82
  383. data/lib/avo/menu/dashboard.rb +0 -22
  384. data/lib/avo/menu/group.rb +0 -2
  385. data/lib/avo/menu/link.rb +0 -6
  386. data/lib/avo/menu/menu.rb +0 -2
  387. data/lib/avo/menu/resource.rb +0 -22
  388. data/lib/avo/menu/section.rb +0 -2
  389. data/lib/avo/panel.rb +0 -24
  390. data/lib/avo/panel_builder.rb +0 -25
  391. data/lib/avo/resources/controls/action.rb +0 -38
  392. data/lib/avo/resources/controls/execution_context.rb +0 -58
  393. data/lib/avo/resources/controls/items_holder.rb +0 -19
  394. data/lib/avo/resources/controls/link_to.rb +0 -27
  395. data/lib/avo/row.rb +0 -26
  396. data/lib/avo/row_builder.rb +0 -24
  397. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  398. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  399. data/lib/avo/sidebar.rb +0 -30
  400. data/lib/avo/sidebar_builder.rb +0 -24
  401. data/lib/avo/tab.rb +0 -72
  402. data/lib/avo/tab_builder.rb +0 -25
  403. data/lib/avo/tab_group.rb +0 -42
  404. data/lib/avo/tab_group_builder.rb +0 -43
  405. data/lib/avo/tools_manager.rb +0 -11
  406. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  407. data/lib/generators/avo/card/metric_generator.rb +0 -18
  408. data/lib/generators/avo/card/partial_generator.rb +0 -19
  409. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  410. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  411. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -25,26 +25,32 @@
25
25
  # On edit screens we want to load each tab because we wnst the DOM to have the fields present on form submission.
26
26
  # If you have a field which is in the second tab and it's required, the form submission will fail because the required field is not in view, and we don't want that.
27
27
  # We also want to load the current tab
28
- should_lazy_load = if @view.to_s.in?(['edit', 'new', 'update', 'create'])
28
+ should_lazy_load = if @view.in?(%w[edit new update create])
29
29
  false
30
30
  else
31
31
  !is_current_tab
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::Items::SwitcherComponent.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,36 +9,35 @@ 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
 
36
35
  def is_edit?
37
- @view.in?([:edit, :update])
36
+ @view.in?(%w[edit update])
38
37
  end
39
38
 
40
39
  def is_new?
41
- @view.in?([:new, :create])
40
+ @view.in?(%w[new create])
42
41
  end
43
42
 
44
43
  def is_initial_load?
@@ -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
@@ -3,11 +3,12 @@
3
3
  data: {
4
4
  model_name: @resource.model_name.to_s,
5
5
  resource_name: @resource.class.to_s,
6
- model_id: @resource.model.id,
6
+ record_id: @resource.record.id,
7
7
  selected_resources_name: @resource.model_key,
8
- selected_resources: [@resource.model.id],
8
+ selected_resources: [@resource.record.id],
9
9
  **@resource.stimulus_data_attributes
10
10
  } do %>
11
+ <%= render_cards_component %>
11
12
  <%= form_with model: @resource.record,
12
13
  scope: @resource.form_scope,
13
14
  url: form_url,
@@ -19,92 +20,30 @@
19
20
  multipart: true do |form| %>
20
21
  <%= render Avo::ReferrerParamsComponent.new back_path: back_path %>
21
22
  <%= 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| %>
25
- <% 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 %>
59
- <% end %>
60
- <% end %>
61
- <%# Extract the main panel and display the fields here. %>
62
- <%# This way we'll be able to render the footer buttons under the main fields. %>
63
- <% if main_panel.present? %>
64
- <% c.with_body do %>
65
- <div class="divide-y">
66
- <% main_panel.items.each_with_index do |field, index| %>
67
- <%= render field
68
- .hydrate(resource: @resource, model: @resource.model, user: @resource.user, view: view_for(field))
69
- .component_for_view(view_for field)
70
- .new(field: field, resource: @resource, index: index, form: form, compact: sidebar.present?)
71
- %>
72
- <% end %>
73
- </div>
74
- <% end %>
75
- <% end %>
76
- <% if sidebar.present? && sidebar.visible_items.present? %>
77
- <% c.with_sidebar do %>
78
- <%= render sidebar_component form: form %>
79
- <% end %>
80
- <% end %>
81
- <% if Avo.configuration.buttons_on_form_footers %>
23
+ <% @resource.get_items.each_with_index do |item, index| %>
24
+ <%= render Avo::Items::SwitcherComponent.new(
25
+ resource: @resource,
26
+ reflection: @reflection,
27
+ item: item,
28
+ index: index + 1,
29
+ view: @view,
30
+ parent_resource: @parent_resource,
31
+ parent_record: @parent_record,
32
+ form: form,
33
+ parent_component: self,
34
+ actions: @actions
35
+ )%>
36
+ <% end %>
37
+
38
+ <% if Avo.configuration.buttons_on_form_footers %>
39
+ <%= render Avo::PanelComponent.new do |c| %>
82
40
  <% c.with_footer_tools do %>
83
- <div class="mt-4">
84
- <%= a_link back_path,
85
- style: :text,
86
- icon: 'arrow-left' do %>
87
- <%= t('avo.cancel').capitalize %>
88
- <% end %>
89
- <% if can_see_the_save_button? %>
90
- <%= a_button color: :primary,
91
- style: :primary,
92
- loading: true,
93
- type: :submit,
94
- icon: 'save' do %>
95
- <%= t('avo.save').capitalize %>
96
- <% end %>
97
- <% end %>
98
- </div>
41
+ <% @resource.render_edit_controls.each do |control| %>
42
+ <%= render_control control %>
43
+ <% end %>
99
44
  <% end %>
100
45
  <% end %>
101
46
  <% end %>
102
- <%= content_tag :div, class: 'space-y-12' do %>
103
- <% @resource.get_items.each_with_index do |item, index| %>
104
- <% next if item.nil? %>
105
- <%= render Avo::ItemSwitcherComponent.new resource: @resource, item: item, index: index + 1, view: @view, form: form %>
106
- <% end %>
107
- <% end %>
108
47
  <% end %>
109
48
  <% end %>
110
49
  <% end %>
@@ -1,15 +1,16 @@
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
+ attr_reader :actions, :display_breadcrumbs
7
+
8
+ def initialize(resource: nil, record: nil, actions: [], view: "edit", display_breadcrumbs: true)
8
9
  @resource = resource
9
- @model = model
10
+ @record = record
10
11
  @actions = actions
11
- @view = view
12
- @display_breadcrumbs = display_breadcrumbs
12
+ @view = Avo::ViewInquirer.new(view)
13
+ @display_breadcrumbs = @reflection.blank? && display_breadcrumbs
13
14
  end
14
15
 
15
16
  def title
@@ -21,8 +22,8 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
21
22
  return resource_view_path if via_resource?
22
23
  return resources_path if via_index?
23
24
 
24
- 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)
25
+ if is_edit? && Avo.configuration.resource_default_view.show? # via resource show or edit page
26
+ return helpers.resource_path(record: @resource.record, resource: @resource)
26
27
  end
27
28
 
28
29
  resources_path
@@ -33,11 +34,11 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
33
34
  end
34
35
 
35
36
  def resource_view_path
36
- helpers.resource_view_path(model: association_resource.model, resource: association_resource)
37
+ helpers.resource_view_path(record: association_resource.record, resource: association_resource)
37
38
  end
38
39
 
39
40
  def can_see_the_destroy_button?
40
- return super if is_edit? && Avo.configuration.resource_default_view == :edit
41
+ return super if is_edit? && Avo.configuration.resource_default_view.edit?
41
42
 
42
43
  false
43
44
  end
@@ -48,8 +49,13 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
48
49
  @resource.authorization.authorize_action @view, raise_exception: false
49
50
  end
50
51
 
51
- def display_breadcrumbs?
52
- @reflection.blank? && @display_breadcrumbs
52
+ def controls
53
+ @resource.render_edit_controls
54
+ end
55
+
56
+ # Render :show view for read only trix fields
57
+ def view_for(field)
58
+ field.is_a?(Avo::Fields::TrixField) && field.is_disabled? ? :show : view
53
59
  end
54
60
 
55
61
  private
@@ -63,7 +69,7 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
63
69
  end
64
70
 
65
71
  def is_edit?
66
- view.in?([:edit, :update])
72
+ view.in?(%w[edit update])
67
73
  end
68
74
 
69
75
  def form_method
@@ -75,7 +81,7 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
75
81
  def form_url
76
82
  if is_edit?
77
83
  helpers.resource_path(
78
- model: @resource.model,
84
+ record: @resource.record,
79
85
  resource: @resource
80
86
  )
81
87
  else
@@ -83,13 +89,8 @@ class Avo::Views::ResourceEditComponent < Avo::ResourceComponent
83
89
  resource: @resource,
84
90
  via_relation_class: params[:via_relation_class],
85
91
  via_relation: params[:via_relation],
86
- via_resource_id: params[:via_resource_id]
92
+ via_record_id: params[:via_record_id]
87
93
  )
88
94
  end
89
95
  end
90
-
91
- # Render :show view for read only trix fields
92
- def view_for(field)
93
- (field.is_a?(Avo::Fields::TrixField) && field.is_readonly?) ? :show : view
94
- end
95
96
  end
@@ -1,82 +1,77 @@
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 %>
8
+ <%= render_cards_component %>
7
9
  <%= render Avo::PanelComponent.new(name: title, description: description, data: { component: 'resources-index' }, display_breadcrumbs: @reflection.blank?) do |c| %>
8
10
  <% 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 %>
11
+ <% @resource.render_index_controls(item: singular_resource_name.downcase).each do |control| %>
12
+ <%= render_control control %>
30
13
  <% end %>
31
14
  <% end %>
32
15
  <% 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 %>
16
+ <div class="flex flex-col">
17
+ <%= render scopes_list if can_render_scopes? %>
18
+ <div class="flex flex-col">
19
+ <div class="flex flex-col xs:flex-row xs:justify-between space-y-2 xs:space-y-0 py-4 <%= 'hidden' unless header_visible? %>">
20
+ <div class="flex items-center px-4 w-64">
21
+ <% if show_search_input %>
22
+ <%= render partial: 'avo/partials/resource_search', locals: {resource: @resource.route_key, via_reflection: via_reflection} %>
23
+ <% else %>
24
+ <%# Offset for the space-y-2 property when the search is missing %>
25
+ <div class="-mb-2"></div>
26
+ <% end %>
27
+ </div>
28
+
29
+ <div class="justify-self-end flex justify-start xs:justify-end items-center px-4 space-x-3">
30
+ <%= render_dynamic_filters_button %>
31
+
32
+ <%= render Avo::FiltersComponent.new filters: @filters, resource: @resource, applied_filters: @applied_filters, parent_record: parent_record %>
33
+
34
+ <%= render partial: 'avo/partials/view_toggle_button', locals: { available_view_types: available_view_types, view_type: view_type, turbo_frame: turbo_frame } %>
35
+ </div>
46
36
  </div>
47
- <% end %>
37
+ <% if has_dynamic_filters? %>
38
+ <%= render Avo::DynamicFilters::FiltersComponent.new resource: resource, turbo_frame: turbo_frame, dynamic_filters_component_id: dynamic_filters_component_id %>
39
+ <% end %>
40
+ </div>
48
41
  </div>
49
- <% if view_type.to_sym == :map %>
42
+ <% if view_type.to_sym == :table %>
50
43
  <% 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)) %>
44
+ <div class="w-full relative flex-1 flex mt-0">
45
+ <%= 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
46
  </div>
54
47
  <% else %>
55
48
  <%= helpers.empty_state by_association: params[:related_name].present?, view_type: view_type, add_background: true %>
56
49
  <% end %>
57
50
  <% end %>
58
- <% if view_type.to_sym == :table %>
51
+ <% end %>
52
+ <% c.with_bare_content do %>
53
+ <% if view_type.to_sym == :map %>
59
54
  <% 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)) %>
55
+ <div>
56
+ <%= render(Avo::Index::ResourceMapComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_record: @parent_record, parent_resource: @parent_resource, pagy: @pagy, query: @query)) %>
62
57
  </div>
63
58
  <% else %>
64
59
  <%= helpers.empty_state by_association: params[:related_name].present?, view_type: view_type, add_background: true %>
65
60
  <% end %>
66
61
  <% end %>
67
- <% end %>
68
- <% c.with_bare_content do %>
69
62
  <% if view_type.to_sym == :table || view_type.to_sym == :map %>
70
- <% if @models.present? %>
63
+ <% if @records.present? %>
71
64
  <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 %>
65
+ <%= 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
66
  </div>
74
67
  <% end %>
75
68
  <% end %>
76
69
  <% 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) %>
70
+ <div id="records_panel">
71
+ <%= render Avo::Index::ResourceGridComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_record: parent_record, parent_resource: parent_resource, actions: actions) %>
72
+ </div>
78
73
  <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 %>
74
+ <%= 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
75
  </div>
81
76
  <% end %>
82
77
  <% end %>