avo 2.46.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 (409) 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 +12 -29
  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 +3 -2
  73. data/app/components/avo/index/resource_table_component.rb +8 -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 +1 -1
  84. data/app/components/avo/paginator_component.rb +6 -6
  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 -86
  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 -180
  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 +139 -91
  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 +5 -3
  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 +10 -6
  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/_footer.html.erb +1 -1
  143. data/app/views/avo/partials/_javascript.html.erb +5 -0
  144. data/app/views/avo/partials/_logo.html.erb +1 -1
  145. data/app/views/avo/partials/_navbar.html.erb +3 -5
  146. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  147. data/app/views/avo/partials/_table_header.html.erb +5 -11
  148. data/app/views/layouts/avo/application.html.erb +5 -4
  149. data/avo.gemspec +10 -8
  150. data/bin/dev +3 -1
  151. data/bin/prod +0 -0
  152. data/config/master.key +1 -0
  153. data/config/routes.rb +7 -10
  154. data/db/factories.rb +6 -0
  155. data/lib/avo/asset_manager.rb +30 -0
  156. data/lib/avo/base_action.rb +82 -67
  157. data/lib/avo/base_resource.rb +286 -226
  158. data/lib/avo/base_resource_tool.rb +9 -16
  159. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  160. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  161. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  162. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  163. data/lib/avo/concerns/has_controls.rb +37 -0
  164. data/lib/avo/concerns/has_description.rb +23 -0
  165. data/lib/avo/concerns/has_helpers.rb +18 -0
  166. data/lib/avo/concerns/has_item_type.rb +42 -0
  167. data/lib/avo/concerns/has_items.rb +339 -0
  168. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  169. data/lib/avo/concerns/hydration.rb +17 -0
  170. data/lib/avo/concerns/is_resource_item.rb +16 -36
  171. data/lib/avo/concerns/is_visible.rb +15 -0
  172. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  173. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  174. data/lib/avo/concerns/visible_items.rb +7 -38
  175. data/lib/avo/configuration/branding.rb +0 -12
  176. data/lib/avo/configuration.rb +28 -11
  177. data/lib/avo/current.rb +39 -0
  178. data/lib/avo/dsl/field_parser.rb +3 -3
  179. data/lib/avo/dynamic_router.rb +18 -3
  180. data/lib/avo/engine.rb +35 -30
  181. data/lib/avo/error_manager.rb +25 -0
  182. data/lib/avo/execution_context.rb +14 -15
  183. data/lib/avo/fields/base_field.rb +84 -122
  184. data/lib/avo/fields/belongs_to_field.rb +19 -23
  185. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  186. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  187. data/lib/avo/fields/concerns/has_default.rb +1 -5
  188. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  189. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  190. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  191. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  192. data/lib/avo/fields/concerns/is_required.rb +5 -7
  193. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  194. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  195. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  196. data/lib/avo/fields/country_field.rb +4 -0
  197. data/lib/avo/fields/date_time_field.rb +1 -5
  198. data/lib/avo/fields/external_image_field.rb +2 -2
  199. data/lib/avo/fields/field_manager.rb +55 -0
  200. data/lib/avo/fields/file_field.rb +2 -2
  201. data/lib/avo/fields/gravatar_field.rb +2 -2
  202. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  203. data/lib/avo/fields/has_base_field.rb +21 -17
  204. data/lib/avo/fields/has_many_field.rb +5 -2
  205. data/lib/avo/fields/has_one_field.rb +8 -12
  206. data/lib/avo/fields/heading_field.rb +9 -14
  207. data/lib/avo/fields/hidden_field.rb +1 -1
  208. data/lib/avo/fields/id_field.rb +3 -3
  209. data/lib/avo/fields/location_field.rb +10 -10
  210. data/lib/avo/fields/password_field.rb +1 -1
  211. data/lib/avo/fields/preview_field.rb +14 -0
  212. data/lib/avo/fields/select_field.rb +12 -8
  213. data/lib/avo/fields/status_field.rb +7 -1
  214. data/lib/avo/fields/text_field.rb +2 -2
  215. data/lib/avo/filters/base_filter.rb +9 -4
  216. data/lib/avo/html/builder.rb +8 -8
  217. data/lib/avo/item_grapher.rb +78 -0
  218. data/lib/avo/licensing/h_q.rb +11 -73
  219. data/lib/avo/licensing/license.rb +5 -1
  220. data/lib/avo/licensing/license_manager.rb +1 -1
  221. data/lib/avo/licensing/pro_license.rb +1 -7
  222. data/lib/avo/loaders/fields_loader.rb +7 -1
  223. data/lib/avo/plugin.rb +36 -0
  224. data/lib/avo/plugin_manager.rb +56 -0
  225. data/lib/avo/prefixed_test_helpers.rb +20 -0
  226. data/lib/avo/reloader.rb +3 -0
  227. data/lib/avo/resources/controls/actions_list.rb +7 -12
  228. data/lib/avo/resources/controls/attach_button.rb +15 -0
  229. data/lib/avo/resources/controls/back_button.rb +1 -1
  230. data/lib/avo/resources/controls/base_control.rb +15 -49
  231. data/lib/avo/resources/controls/create_button.rb +15 -0
  232. data/lib/avo/resources/controls/delete_button.rb +5 -1
  233. data/lib/avo/resources/controls/detach_button.rb +4 -1
  234. data/lib/avo/resources/controls/edit_button.rb +4 -1
  235. data/lib/avo/resources/controls/order_controls.rb +8 -0
  236. data/lib/avo/resources/controls/save_button.rb +13 -0
  237. data/lib/avo/resources/controls/show_button.rb +15 -0
  238. data/lib/avo/resources/items/holder.rb +96 -0
  239. data/lib/avo/resources/items/item_group.rb +44 -0
  240. data/lib/avo/resources/items/main_panel.rb +12 -0
  241. data/lib/avo/resources/items/panel.rb +2 -0
  242. data/lib/avo/resources/items/row.rb +42 -0
  243. data/lib/avo/resources/items/sidebar.rb +46 -0
  244. data/lib/avo/resources/items/tab.rb +54 -0
  245. data/lib/avo/resources/items/tab_group.rb +62 -0
  246. data/lib/avo/resources/resource_manager.rb +179 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +93 -0
  249. data/lib/avo/services/encryption_service.rb +8 -12
  250. data/lib/avo/services/telemetry_service.rb +85 -0
  251. data/lib/avo/test_helpers.rb +362 -0
  252. data/lib/avo/tools/tool_manager.rb +30 -0
  253. data/lib/avo/version.rb +1 -1
  254. data/lib/avo/view_inquirer.rb +36 -0
  255. data/lib/avo.rb +109 -24
  256. data/lib/generators/avo/action_generator.rb +8 -8
  257. data/lib/generators/avo/card_generator.rb +27 -0
  258. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  259. data/lib/generators/avo/controller_generator.rb +3 -0
  260. data/lib/generators/avo/eject_generator.rb +180 -15
  261. data/lib/generators/avo/field_generator.rb +49 -2
  262. data/lib/generators/avo/filter_generator.rb +8 -8
  263. data/lib/generators/avo/js/install_generator.rb +2 -2
  264. data/lib/generators/avo/resource_generator.rb +12 -9
  265. data/lib/generators/avo/scope_generator.rb +15 -0
  266. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  267. data/lib/generators/avo/templates/action.tt +8 -6
  268. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  269. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  270. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  271. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  272. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  273. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  274. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  275. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  276. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  277. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  278. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  279. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  280. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  281. data/lib/generators/avo/templates/locales/avo.ar.yml +1 -0
  282. data/lib/generators/avo/templates/locales/avo.en.yml +4 -3
  283. data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
  284. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
  285. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
  286. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
  287. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
  288. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
  289. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -5
  290. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -0
  291. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  292. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  293. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  294. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  295. data/lib/generators/avo/templates/scope.tt +6 -0
  296. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  297. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  298. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  299. data/lib/tasks/avo_tasks.rake +72 -4
  300. data/public/avo-assets/avo.base.css +1893 -1187
  301. data/public/avo-assets/avo.base.js +217 -305
  302. data/public/avo-assets/avo.base.js.map +3 -3
  303. data/public/avo-assets/avo.css +9744 -0
  304. data/public/avo-assets/avo.js +513 -0
  305. data/public/avo-assets/avo.js.map +7 -0
  306. data/tailwind.custom.js +47 -0
  307. data/tailwind.preset.js +152 -0
  308. metadata +106 -116
  309. data/app/components/avo/card_component.html.erb +0 -46
  310. data/app/components/avo/card_component.rb +0 -25
  311. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  312. data/app/components/avo/dashboards/divider_component.rb +0 -19
  313. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  314. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  315. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  316. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  317. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  318. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  319. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  320. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  321. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  322. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  323. data/app/components/avo/index/ordering/base_component.rb +0 -9
  324. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  325. data/app/components/avo/index/ordering/button_component.rb +0 -23
  326. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  327. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  328. data/app/components/avo/item_switcher_component.html.erb +0 -27
  329. data/app/components/avo/item_switcher_component.rb +0 -48
  330. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  331. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  332. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  333. data/app/controllers/avo/dashboards_controller.rb +0 -22
  334. data/app/controllers/avo/reorder_controller.rb +0 -25
  335. data/app/javascript/js/controllers/base_controller.js +0 -22
  336. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  337. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  338. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  339. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  340. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  341. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  342. data/app/views/avo/dashboards/show.html.erb +0 -38
  343. data/app/views/avo/partials/_global_search.html.erb +0 -19
  344. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  345. data/lib/avo/app.rb +0 -237
  346. data/lib/avo/base_card.rb +0 -161
  347. data/lib/avo/concerns/fetches_things.rb +0 -150
  348. data/lib/avo/concerns/handles_field_args.rb +0 -47
  349. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  350. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  351. data/lib/avo/concerns/has_fields.rb +0 -334
  352. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  353. data/lib/avo/concerns/policy_helpers.rb +0 -31
  354. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  355. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  356. data/lib/avo/dashboards/base_divider.rb +0 -35
  357. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  358. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  359. data/lib/avo/dashboards/metric_card.rb +0 -9
  360. data/lib/avo/dashboards/partial_card.rb +0 -7
  361. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  362. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  363. data/lib/avo/fields/tags_field.rb +0 -102
  364. data/lib/avo/grid_collector.rb +0 -42
  365. data/lib/avo/hosts/association_scope_host.rb +0 -8
  366. data/lib/avo/hosts/base_host.rb +0 -25
  367. data/lib/avo/hosts/card_visibility.rb +0 -20
  368. data/lib/avo/hosts/dashboard_card.rb +0 -22
  369. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  370. data/lib/avo/hosts/ordering.rb +0 -22
  371. data/lib/avo/hosts/record_host.rb +0 -7
  372. data/lib/avo/hosts/resource_record_host.rb +0 -7
  373. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  374. data/lib/avo/hosts/search_scope_host.rb +0 -7
  375. data/lib/avo/hosts/view_record_host.rb +0 -7
  376. data/lib/avo/hosts/visibility_host.rb +0 -12
  377. data/lib/avo/items_holder.rb +0 -96
  378. data/lib/avo/main_panel.rb +0 -3
  379. data/lib/avo/menu/base_item.rb +0 -25
  380. data/lib/avo/menu/builder.rb +0 -82
  381. data/lib/avo/menu/dashboard.rb +0 -22
  382. data/lib/avo/menu/group.rb +0 -2
  383. data/lib/avo/menu/link.rb +0 -6
  384. data/lib/avo/menu/menu.rb +0 -2
  385. data/lib/avo/menu/resource.rb +0 -22
  386. data/lib/avo/menu/section.rb +0 -2
  387. data/lib/avo/panel.rb +0 -24
  388. data/lib/avo/panel_builder.rb +0 -25
  389. data/lib/avo/resources/controls/action.rb +0 -38
  390. data/lib/avo/resources/controls/execution_context.rb +0 -58
  391. data/lib/avo/resources/controls/items_holder.rb +0 -19
  392. data/lib/avo/resources/controls/link_to.rb +0 -27
  393. data/lib/avo/row.rb +0 -26
  394. data/lib/avo/row_builder.rb +0 -24
  395. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  396. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  397. data/lib/avo/sidebar.rb +0 -30
  398. data/lib/avo/sidebar_builder.rb +0 -24
  399. data/lib/avo/tab.rb +0 -72
  400. data/lib/avo/tab_builder.rb +0 -25
  401. data/lib/avo/tab_group.rb +0 -42
  402. data/lib/avo/tab_group_builder.rb +0 -43
  403. data/lib/avo/tools_manager.rb +0 -11
  404. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  405. data/lib/generators/avo/card/metric_generator.rb +0 -18
  406. data/lib/generators/avo/card/partial_generator.rb +0 -19
  407. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  408. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  409. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -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,94 +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
- <% if back_path.present? %>
85
- <%= a_link back_path,
86
- style: :text,
87
- icon: 'arrow-left' do %>
88
- <%= t('avo.cancel').capitalize %>
89
- <% end %>
90
- <% end %>
91
- <% if can_see_the_save_button? %>
92
- <%= a_button color: :primary,
93
- style: :primary,
94
- loading: true,
95
- type: :submit,
96
- icon: 'save' do %>
97
- <%= t('avo.save').capitalize %>
98
- <% end %>
99
- <% end %>
100
- </div>
41
+ <% @resource.render_edit_controls.each do |control| %>
42
+ <%= render_control control %>
43
+ <% end %>
101
44
  <% end %>
102
45
  <% end %>
103
46
  <% end %>
104
- <%= content_tag :div, class: 'space-y-12' do %>
105
- <% @resource.get_items.each_with_index do |item, index| %>
106
- <% next if item.nil? %>
107
- <%= render Avo::ItemSwitcherComponent.new resource: @resource, item: item, index: index + 1, view: @view, form: form %>
108
- <% end %>
109
- <% end %>
110
47
  <% end %>
111
48
  <% end %>
112
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 %>
@@ -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
- @view = :index
37
+ @view = Avo::ViewInquirer.new("index")
35
38
  @query = query
39
+ @scopes = scopes
36
40
  end
37
41
 
38
42
  def title
@@ -73,8 +77,9 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
73
77
 
74
78
  if @reflection.present?
75
79
  args = {
80
+ via_resource_class: @parent_resource.class,
76
81
  via_relation_class: reflection_model_class,
77
- via_resource_id: @parent_model.to_param
82
+ via_record_id: @parent_record.to_param
78
83
  }
79
84
 
80
85
  if @reflection.is_a? ActiveRecord::Reflection::ThroughReflection
@@ -96,7 +101,7 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
96
101
  def attach_path
97
102
  current_path = CGI.unescape(request.env["PATH_INFO"]).split("/").select(&:present?)
98
103
 
99
- Avo::App.root_path(paths: [*current_path, "new"])
104
+ Avo.root_path(paths: [*current_path, "new"])
100
105
  end
101
106
 
102
107
  def singular_resource_name
@@ -117,12 +122,12 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
117
122
  return
118
123
  end
119
124
 
120
- @resource.resource_description
125
+ @resource.description
121
126
  end
122
127
 
123
128
  def show_search_input
124
129
  return false unless authorized_to_search?
125
- return false unless @resource.search_query.present?
130
+ return false unless resource.class.search_query.present?
126
131
  return false if field&.hide_search_input
127
132
 
128
133
  true
@@ -130,9 +135,40 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
130
135
 
131
136
  def authorized_to_search?
132
137
  # Hide the search if the authorization prevents it
133
- return true unless @resource.authorization.has_action_method?("search")
138
+ return true unless resource.authorization.respond_to?(:has_action_method?)
139
+ return true unless resource.authorization.has_action_method?("search")
140
+
141
+ resource.authorization.authorize_action("search", raise_exception: false)
142
+ end
143
+
144
+ def render_dynamic_filters_button
145
+ return unless Avo.avo_dynamic_filters_installed?
146
+ return unless resource.has_filters?
147
+ return if Avo::DynamicFilters.configuration.always_expanded
148
+
149
+ a_button size: :sm,
150
+ color: :primary,
151
+ icon: "filter",
152
+ data: {
153
+ controller: "avo-filters",
154
+ action: "click->avo-filters#toggleFiltersArea",
155
+ avo_filters_dynamic_filters_component_id_value: dynamic_filters_component_id
156
+ } do
157
+ Avo::DynamicFilters.configuration.button_label
158
+ end
159
+ end
160
+
161
+ def scopes_list
162
+ Avo::Pro::Scopes::ListComponent.new(
163
+ scopes: scopes,
164
+ resource: resource,
165
+ turbo_frame: turbo_frame,
166
+ parent_record: parent_record
167
+ )
168
+ end
134
169
 
135
- @resource.authorization.authorize_action("search", raise_exception: false)
170
+ def can_render_scopes?
171
+ defined?(Avo::Pro)
136
172
  end
137
173
 
138
174
  private
@@ -152,7 +188,34 @@ class Avo::Views::ResourceIndexComponent < Avo::ResourceComponent
152
188
  association: "has_many",
153
189
  association_id: @reflection.name,
154
190
  class: reflection_model_class,
155
- id: @parent_model.to_param
191
+ id: @parent_record.to_param,
192
+ view: @parent_resource.view
156
193
  }
157
194
  end
195
+
196
+ def header_visible?
197
+ search_query_present? || filters_present? || has_many_view_types? || has_dynamic_filters?
198
+ end
199
+
200
+ def has_dynamic_filters?
201
+ Avo.avo_dynamic_filters_installed? && resource.has_filters?
202
+ end
203
+
204
+ def search_query_present?
205
+ @resource.class.search_query.present?
206
+ end
207
+
208
+ def filters_present?
209
+ @filters.present?
210
+ end
211
+
212
+ def has_many_view_types?
213
+ available_view_types.count > 1
214
+ end
215
+
216
+ # Generate a unique component id for the current component.
217
+ # This is used to identify the component in the DOM.
218
+ def dynamic_filters_component_id
219
+ @dynamic_filters_component_id ||= "dynamic_filters_component_id_#{SecureRandom.hex(3)}"
220
+ end
158
221
  end