avo 2.46.0 → 3.0.0.pre1

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

Potentially problematic release.


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

Files changed (417) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +12 -23
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +12 -11
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -36
  167. data/lib/avo/base_resource.rb +108 -96
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  175. data/lib/avo/concerns/is_resource_item.rb +24 -36
  176. data/lib/avo/concerns/is_visible.rb +15 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +8 -45
  180. data/lib/avo/current.rb +5 -0
  181. data/lib/avo/dsl/field_parser.rb +1 -1
  182. data/lib/avo/dynamic_router.rb +6 -2
  183. data/lib/avo/engine.rb +37 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +9 -15
  186. data/lib/avo/fields/badge_field.rb +1 -1
  187. data/lib/avo/fields/base_field.rb +72 -124
  188. data/lib/avo/fields/belongs_to_field.rb +14 -25
  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 +110 -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 +13 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/country_field.rb +4 -0
  199. data/lib/avo/fields/date_field.rb +3 -16
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/field_manager.rb +45 -0
  202. data/lib/avo/fields/file_field.rb +0 -2
  203. data/lib/avo/fields/files_field.rb +0 -6
  204. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  205. data/lib/avo/fields/has_base_field.rb +11 -14
  206. data/lib/avo/fields/has_many_field.rb +5 -2
  207. data/lib/avo/fields/has_one_field.rb +5 -10
  208. data/lib/avo/fields/heading_field.rb +4 -1
  209. data/lib/avo/fields/hidden_field.rb +1 -1
  210. data/lib/avo/fields/id_field.rb +2 -3
  211. data/lib/avo/fields/password_field.rb +1 -1
  212. data/lib/avo/fields/preview_field.rb +14 -0
  213. data/lib/avo/fields/select_field.rb +12 -8
  214. data/lib/avo/fields/status_field.rb +4 -0
  215. data/lib/avo/filters/base_filter.rb +3 -8
  216. data/lib/avo/grid_collector.rb +7 -9
  217. data/lib/avo/html/builder.rb +5 -8
  218. data/lib/avo/item_grapher.rb +78 -0
  219. data/lib/avo/licensing/h_q.rb +4 -68
  220. data/lib/avo/licensing/license.rb +2 -2
  221. data/lib/avo/licensing/license_manager.rb +1 -1
  222. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  223. data/lib/avo/licensing/pro_license.rb +1 -7
  224. data/lib/avo/plugin.rb +6 -0
  225. data/lib/avo/plugin_manager.rb +58 -0
  226. data/lib/avo/prefixed_test_helpers.rb +20 -0
  227. data/lib/avo/reloader.rb +3 -0
  228. data/lib/avo/resources/controls/actions_list.rb +6 -12
  229. data/lib/avo/resources/controls/attach_button.rb +15 -0
  230. data/lib/avo/resources/controls/back_button.rb +1 -1
  231. data/lib/avo/resources/controls/base_control.rb +15 -49
  232. data/lib/avo/resources/controls/create_button.rb +15 -0
  233. data/lib/avo/resources/controls/delete_button.rb +5 -1
  234. data/lib/avo/resources/controls/detach_button.rb +4 -1
  235. data/lib/avo/resources/controls/edit_button.rb +4 -1
  236. data/lib/avo/resources/controls/order_controls.rb +8 -0
  237. data/lib/avo/resources/controls/save_button.rb +13 -0
  238. data/lib/avo/resources/controls/show_button.rb +15 -0
  239. data/lib/avo/resources/items/holder.rb +76 -0
  240. data/lib/avo/resources/items/item_group.rb +48 -0
  241. data/lib/avo/resources/items/main_panel.rb +2 -0
  242. data/lib/avo/resources/items/panel.rb +2 -0
  243. data/lib/avo/resources/items/sidebar.rb +47 -0
  244. data/lib/avo/resources/items/tab.rb +60 -0
  245. data/lib/avo/resources/items/tab_group.rb +68 -0
  246. data/lib/avo/resources/resource_manager.rb +181 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +92 -0
  249. data/lib/avo/services/telemetry_service.rb +84 -0
  250. data/lib/avo/test_helpers.rb +362 -0
  251. data/lib/avo/tools/tool_manager.rb +30 -0
  252. data/lib/avo/version.rb +1 -1
  253. data/lib/avo.rb +7 -0
  254. data/lib/generators/avo/eject_generator.rb +0 -1
  255. data/lib/generators/avo/install_generator.rb +1 -11
  256. data/lib/generators/avo/resource_generator.rb +5 -23
  257. data/lib/generators/avo/scope_generator.rb +15 -0
  258. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  259. data/lib/generators/avo/templates/action.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  261. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  263. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  265. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  266. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  267. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  268. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  271. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  272. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  273. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  274. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  275. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  280. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  281. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  282. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  283. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  284. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  285. data/lib/generators/avo/templates/scope.tt +6 -0
  286. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  287. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  288. data/lib/generators/avo/templates/tool/view.tt +2 -2
  289. data/lib/tasks/avo_tasks.rake +22 -0
  290. metadata +82 -161
  291. data/app/assets/stylesheets/css/tags.css +0 -32
  292. data/app/assets/svgs/map-empty-state.svg +0 -35
  293. data/app/assets/svgs/map-view-type.svg +0 -3
  294. data/app/components/avo/card_component.html.erb +0 -46
  295. data/app/components/avo/card_component.rb +0 -25
  296. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  297. data/app/components/avo/dashboards/divider_component.rb +0 -19
  298. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  299. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  300. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  301. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  303. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  304. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  305. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  306. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  307. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  309. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  311. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  312. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  313. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  314. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  315. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  317. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  318. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  319. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  320. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  321. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  322. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  323. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  324. data/app/components/avo/index/ordering/base_component.rb +0 -9
  325. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  326. data/app/components/avo/index/ordering/button_component.rb +0 -23
  327. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  328. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  329. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  330. data/app/components/avo/index/resource_map_component.rb +0 -109
  331. data/app/components/avo/row_component.html.erb +0 -3
  332. data/app/components/avo/row_component.rb +0 -12
  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/reload_belongs_to_field_controller.js +0 -51
  340. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  341. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  342. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  343. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  344. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  345. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  346. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  347. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  348. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  349. data/app/views/avo/dashboards/show.html.erb +0 -38
  350. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  351. data/app/views/avo/partials/_global_search.html.erb +0 -19
  352. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  353. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  354. data/lib/avo/base_card.rb +0 -161
  355. data/lib/avo/concerns/fetches_things.rb +0 -150
  356. data/lib/avo/concerns/handles_field_args.rb +0 -47
  357. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  358. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  359. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  360. data/lib/avo/concerns/pagination.rb +0 -53
  361. data/lib/avo/concerns/policy_helpers.rb +0 -31
  362. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  363. data/lib/avo/concerns/visible_items.rb +0 -51
  364. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  365. data/lib/avo/dashboards/base_divider.rb +0 -35
  366. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  367. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  368. data/lib/avo/dashboards/metric_card.rb +0 -9
  369. data/lib/avo/dashboards/partial_card.rb +0 -7
  370. data/lib/avo/fields/area_field.rb +0 -39
  371. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  372. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  373. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  374. data/lib/avo/fields/location_field.rb +0 -86
  375. data/lib/avo/fields/tags_field.rb +0 -102
  376. data/lib/avo/hosts/association_scope_host.rb +0 -8
  377. data/lib/avo/hosts/base_host.rb +0 -25
  378. data/lib/avo/hosts/card_visibility.rb +0 -20
  379. data/lib/avo/hosts/dashboard_card.rb +0 -22
  380. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  381. data/lib/avo/hosts/ordering.rb +0 -22
  382. data/lib/avo/hosts/record_host.rb +0 -7
  383. data/lib/avo/hosts/resource_record_host.rb +0 -7
  384. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  385. data/lib/avo/hosts/search_scope_host.rb +0 -7
  386. data/lib/avo/hosts/view_record_host.rb +0 -7
  387. data/lib/avo/hosts/visibility_host.rb +0 -12
  388. data/lib/avo/items_holder.rb +0 -96
  389. data/lib/avo/main_panel.rb +0 -3
  390. data/lib/avo/menu/base_item.rb +0 -25
  391. data/lib/avo/menu/builder.rb +0 -82
  392. data/lib/avo/menu/dashboard.rb +0 -22
  393. data/lib/avo/menu/group.rb +0 -2
  394. data/lib/avo/menu/link.rb +0 -6
  395. data/lib/avo/menu/menu.rb +0 -2
  396. data/lib/avo/menu/resource.rb +0 -22
  397. data/lib/avo/menu/section.rb +0 -2
  398. data/lib/avo/panel.rb +0 -24
  399. data/lib/avo/panel_builder.rb +0 -25
  400. data/lib/avo/resources/controls/action.rb +0 -38
  401. data/lib/avo/resources/controls/execution_context.rb +0 -58
  402. data/lib/avo/resources/controls/items_holder.rb +0 -19
  403. data/lib/avo/resources/controls/link_to.rb +0 -27
  404. data/lib/avo/row.rb +0 -26
  405. data/lib/avo/row_builder.rb +0 -24
  406. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  407. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  408. data/lib/avo/sidebar.rb +0 -30
  409. data/lib/avo/sidebar_builder.rb +0 -24
  410. data/lib/avo/tab.rb +0 -72
  411. data/lib/avo/tab_builder.rb +0 -25
  412. data/lib/avo/tab_group.rb +0 -42
  413. data/lib/avo/tab_group_builder.rb +0 -43
  414. data/lib/avo/tools_manager.rb +0 -11
  415. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  416. data/public/avo-assets/avo.base.js +0 -1037
  417. data/public/avo-assets/avo.base.js.map +0 -7
@@ -9,27 +9,26 @@ class Avo::TabSwitcherComponent < Avo::BaseComponent
9
9
  attr_reader :current_tab
10
10
  attr_reader :tabs
11
11
  attr_reader :view
12
- attr_reader :style
13
12
 
14
13
  delegate :white_panel_classes, to: :helpers
15
14
 
16
- def initialize(resource:, group:, current_tab:, active_tab_name:, view:, style:)
15
+ def initialize(resource:, group:, current_tab:, active_tab_name:, view:)
17
16
  @active_tab_name = active_tab_name
18
17
  @resource = resource
19
18
  @group = group
20
19
  @current_tab = current_tab
21
20
  @tabs = group.items
22
21
  @view = view
23
- @style = style
24
22
  end
25
23
 
24
+ #TOD: helper to record:
26
25
  def tab_path(tab)
27
26
  if is_edit?
28
- helpers.edit_resource_path(resource: @resource, model: @resource.model, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
27
+ helpers.edit_resource_path(resource: @resource, record: @resource.record, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
29
28
  elsif is_new?
30
29
  helpers.new_resource_path(resource: @resource, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
31
30
  else
32
- helpers.resource_path(resource: @resource, model: @resource.model, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
31
+ helpers.resource_path(resource: @resource, record: @resource.record, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
33
32
  end
34
33
  end
35
34
 
@@ -54,38 +53,4 @@ class Avo::TabSwitcherComponent < Avo::BaseComponent
54
53
  tab.name.to_s == active_tab_name.to_s
55
54
  end
56
55
  end
57
-
58
- # Goes through all items and removes the ones that are not supposed to be visible.
59
- # Example below:
60
- # tabs do
61
- # field :comments, as: :has_many
62
- # end
63
- # Because the developer hasn't specified that it should be visible on edit views (with the show_on: :edit option),
64
- # the field should not be visible in the item switcher either.
65
- def visible_items
66
- tabs.select do |tab|
67
- next false if tab.items.blank?
68
- next false if tab.is_field? && !tab.authorized?
69
- next false if tab.has_a_single_item? && !single_item_visible?(tab.items.first)
70
- next false if !tab.visible?
71
- next false if !tab.visible_on?(view)
72
-
73
- true
74
- end
75
- end
76
-
77
- private
78
-
79
- def single_item_visible?(item)
80
- # Item is visible if is not a field or don't have its own panel
81
- return true if !item.is_field?
82
- return true if !item.has_own_panel?
83
-
84
- return false if !item.visible_on?(view)
85
-
86
- # If item is hydrated with the correct resource and is not authorized, it's not visible
87
- return false if item.resource.present? && !item.authorized?
88
-
89
- true
90
- end
91
56
  end
@@ -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,53 +18,20 @@
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| %>
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 %>
21
+ <%= render Avo::PanelComponent.new(name: title, description: @resource.resource_description, display_breadcrumbs: @reflection.blank?, index: 0, data: { panel_id: "main" }) do |c| %>
22
+ <% c.tools do %>
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. %>
62
28
  <%# This way we'll be able to render the footer buttons under the main fields. %>
63
29
  <% if main_panel.present? %>
64
- <% c.with_body do %>
30
+ <% c.body do %>
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,20 +39,18 @@
73
39
  </div>
74
40
  <% end %>
75
41
  <% end %>
76
- <% if sidebar.present? && sidebar.visible_items.present? %>
77
- <% c.with_sidebar do %>
42
+ <% if sidebar.present? %>
43
+ <% c.sidebar do %>
78
44
  <%= render sidebar_component form: form %>
79
45
  <% end %>
80
46
  <% end %>
81
47
  <% if Avo.configuration.buttons_on_form_footers %>
82
- <% c.with_footer_tools do %>
48
+ <% c.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_readonly? ? :show : view
94
83
  end
95
84
  end
@@ -1,82 +1,67 @@
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
- <% 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 %>
9
+ <% c.tools do %>
10
+ <% @resource.render_index_controls(item: singular_resource_name.downcase).each do |control| %>
11
+ <%= render_control control %>
30
12
  <% end %>
31
13
  <% end %>
32
- <% 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} %>
14
+ <% c.body do %>
15
+ <div class="flex flex-col">
16
+ <%= render scopes_list if can_render_scopes? %>
17
+ <div class="flex flex-col py-4 gap-4">
18
+ <div class="flex flex-col xs:flex-row xs:justify-between space-y-2 xs:space-y-0 <%= 'hidden' unless header_visible? %>">
19
+ <div class="flex items-center px-4 w-64">
20
+ <% if hide_search_input %>
21
+ <%# Offset for the space-y-2 property when the search is missing %>
22
+ <div class="-mb-2"></div>
23
+ <% else %>
24
+ <%= render partial: 'avo/partials/resource_search', locals: {resource: @resource.route_key, via_reflection: via_reflection} %>
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>
37
35
  </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 %>
46
- </div>
47
- <% end %>
36
+ <% if Avo.avo_filters_installed? && resource.has_filters? %>
37
+ <%= render AvoFilters::FiltersComponent.new resource: resource %>
38
+ <% end %>
39
+ </div>
48
40
  </div>
49
- <% if view_type.to_sym == :map %>
50
- <% 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)) %>
53
- </div>
54
- <% else %>
55
- <%= helpers.empty_state by_association: params[:related_name].present?, view_type: view_type, add_background: true %>
56
- <% end %>
57
- <% end %>
58
41
  <% if view_type.to_sym == :table %>
59
42
  <% if @resources.present? %>
60
43
  <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)) %>
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)) %>
62
45
  </div>
63
46
  <% else %>
64
47
  <%= helpers.empty_state by_association: params[:related_name].present?, view_type: view_type, add_background: true %>
65
48
  <% end %>
66
49
  <% end %>
67
50
  <% end %>
68
- <% c.with_bare_content do %>
69
- <% if view_type.to_sym == :table || view_type.to_sym == :map %>
70
- <% if @models.present? %>
51
+ <% c.bare_content do %>
52
+ <% if view_type.to_sym == :table %>
53
+ <% if @records.present? %>
71
54
  <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 %>
55
+ <%= 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
56
  </div>
74
57
  <% end %>
75
58
  <% end %>
76
59
  <% 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) %>
60
+ <div id="records_panel">
61
+ <%= render Avo::Index::ResourceGridComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_record: parent_record, parent_resource: parent_resource, actions: actions) %>
62
+ </div>
78
63
  <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 %>
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 %>
80
65
  </div>
81
66
  <% end %>
82
67
  <% 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
@@ -85,6 +89,10 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
85
89
  args[:via_relation] = @reflection.name
86
90
  end
87
91
 
92
+ if @reflection.parent_reflection.present? && @reflection.parent_reflection.inverse_of.present?
93
+ args[:via_relation] = @reflection.parent_reflection.inverse_of.name
94
+ end
95
+
88
96
  if @reflection.inverse_of.present?
89
97
  args[:via_relation] = @reflection.inverse_of.name
90
98
  end
@@ -120,19 +128,39 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
120
128
  @resource.resource_description
121
129
  end
122
130
 
123
- def show_search_input
124
- return false unless authorized_to_search?
125
- return false unless @resource.search_query.present?
126
- return false if field&.hide_search_input
131
+ def hide_search_input
132
+ return true unless @resource.search_query.present?
133
+
134
+ field&.hide_search_input || false
135
+ end
127
136
 
128
- true
137
+ def render_dynamic_filters_button
138
+ return unless Avo.avo_filters_installed?
139
+ return unless resource.has_filters?
140
+ return if AvoFilters.configuration.always_expanded
141
+
142
+ a_button size: :sm,
143
+ color: :primary,
144
+ icon: "filter",
145
+ data: {
146
+ controller: "avo-filters",
147
+ action: "click->avo-filters#toggleFiltersArea",
148
+ } do
149
+ AvoFilters.configuration.button_label
150
+ end
129
151
  end
130
152
 
131
- def authorized_to_search?
132
- # Hide the search if the authorization prevents it
133
- return true unless @resource.authorization.has_action_method?("search")
153
+ def scopes_list
154
+ AvoPro::Scopes::ListComponent.new(
155
+ scopes: scopes,
156
+ resource: resource,
157
+ turbo_frame: turbo_frame,
158
+ parent_record: parent_record,
159
+ )
160
+ end
134
161
 
135
- @resource.authorization.authorize_action("search", raise_exception: false)
162
+ def can_render_scopes?
163
+ defined?(AvoPro)
136
164
  end
137
165
 
138
166
  private
@@ -152,7 +180,23 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
152
180
  association: "has_many",
153
181
  association_id: @reflection.name,
154
182
  class: reflection_model_class,
155
- id: @parent_model.to_param
183
+ id: @parent_record.to_param
156
184
  }
157
185
  end
186
+
187
+ def header_visible?
188
+ search_query_present? || filters_present? || has_many_view_types? || (Avo.avo_filters_installed? && resource.has_filters? && AvoFilters.configuration.always_expanded)
189
+ end
190
+
191
+ def search_query_present?
192
+ @resource.search_query.present?
193
+ end
194
+
195
+ def filters_present?
196
+ @filters.present?
197
+ end
198
+
199
+ def has_many_view_types?
200
+ available_view_types.count > 1
201
+ end
158
202
  end