avo 2.45.0 → 3.0.0.beta1

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

Potentially problematic release.


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

Files changed (371) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +8 -8
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/index_component.rb +5 -5
  40. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  41. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  42. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  43. data/app/components/avo/fields/show_component.rb +4 -1
  44. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  45. data/app/components/avo/filters_component.html.erb +9 -3
  46. data/app/components/avo/filters_component.rb +4 -4
  47. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  48. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  49. data/app/components/avo/index/grid_item_component.rb +43 -16
  50. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  51. data/app/components/avo/index/resource_controls_component.rb +124 -17
  52. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  53. data/app/components/avo/index/resource_grid_component.rb +5 -2
  54. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  55. data/app/components/avo/index/resource_map_component.rb +3 -3
  56. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  57. data/app/components/avo/index/resource_table_component.rb +14 -20
  58. data/app/components/avo/index/table_row_component.html.erb +8 -4
  59. data/app/components/avo/index/table_row_component.rb +3 -2
  60. data/app/components/avo/item_switcher_component.rb +2 -2
  61. data/app/components/avo/modal_component.html.erb +7 -12
  62. data/app/components/avo/modal_component.rb +0 -21
  63. data/app/components/avo/paginator_component.html.erb +40 -29
  64. data/app/components/avo/paginator_component.rb +5 -23
  65. data/app/components/avo/panel_component.html.erb +8 -6
  66. data/app/components/avo/referrer_params_component.html.erb +1 -2
  67. data/app/components/avo/resource_component.rb +189 -14
  68. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  69. data/app/components/avo/resource_sidebar_component.rb +1 -1
  70. data/app/components/avo/sidebar/link_component.rb +1 -1
  71. data/app/components/avo/sidebar_component.html.erb +10 -3
  72. data/app/components/avo/sidebar_component.rb +5 -3
  73. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  74. data/app/components/avo/tab_group_component.html.erb +13 -7
  75. data/app/components/avo/tab_group_component.rb +1 -6
  76. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  77. data/app/components/avo/tab_switcher_component.rb +4 -39
  78. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  79. data/app/components/avo/views/resource_edit_component.rb +7 -18
  80. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  81. data/app/components/avo/views/resource_index_component.rb +62 -12
  82. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  83. data/app/components/avo/views/resource_show_component.rb +6 -11
  84. data/app/controllers/avo/actions_controller.rb +27 -24
  85. data/app/controllers/avo/application_controller.rb +105 -151
  86. data/app/controllers/avo/associations_controller.rb +34 -43
  87. data/app/controllers/avo/attachments_controller.rb +4 -4
  88. data/app/controllers/avo/base_controller.rb +102 -102
  89. data/app/controllers/avo/debug_controller.rb +17 -5
  90. data/app/controllers/avo/home_controller.rb +1 -1
  91. data/app/controllers/avo/search_controller.rb +30 -51
  92. data/app/controllers/avo/team_users_controller.rb +4 -0
  93. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  94. data/app/helpers/avo/application_helper.rb +15 -9
  95. data/app/helpers/avo/resources_helper.rb +1 -1
  96. data/app/helpers/avo/url_helpers.rb +27 -11
  97. data/app/javascript/avo.base.js +1 -0
  98. data/app/javascript/js/application.js +0 -3
  99. data/app/javascript/js/controllers/action_controller.js +5 -3
  100. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  101. data/app/javascript/js/controllers/filter_controller.js +1 -1
  102. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  103. data/app/javascript/js/controllers/preview_controller.js +24 -0
  104. data/app/javascript/js/controllers/search_controller.js +2 -2
  105. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  106. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  107. data/app/javascript/js/controllers.js +10 -6
  108. data/app/javascript/js/custom-stream-actions.js +15 -0
  109. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  110. data/app/views/avo/actions/show.html.erb +9 -6
  111. data/app/views/avo/associations/new.html.erb +2 -2
  112. data/app/views/avo/base/index.html.erb +3 -2
  113. data/app/views/avo/base/new.html.erb +2 -1
  114. data/app/views/avo/base/preview.html.erb +19 -0
  115. data/app/views/avo/base/show.html.erb +1 -1
  116. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  117. data/app/views/avo/debug/report.html.erb +32 -17
  118. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  119. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  120. data/app/views/avo/partials/_footer.html.erb +1 -1
  121. data/app/views/avo/partials/_javascript.html.erb +5 -0
  122. data/app/views/avo/partials/_logo.html.erb +1 -1
  123. data/app/views/avo/partials/_navbar.html.erb +3 -5
  124. data/app/views/avo/partials/_table_header.html.erb +5 -11
  125. data/app/views/layouts/avo/application.html.erb +4 -2
  126. data/avo.gemspec +7 -7
  127. data/bin/dev +1 -1
  128. data/bin/prod +0 -0
  129. data/config/i18n-tasks.yml +1 -1
  130. data/config/initializers/pagy.rb +0 -2
  131. data/config/master.key +1 -0
  132. data/config/routes.rb +6 -10
  133. data/db/factories.rb +7 -1
  134. data/lib/avo/action_model.rb +20 -0
  135. data/lib/avo/asset_manager.rb +30 -0
  136. data/lib/avo/base_action.rb +57 -41
  137. data/lib/avo/base_resource.rb +263 -226
  138. data/lib/avo/base_resource_tool.rb +9 -16
  139. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  140. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  141. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  142. data/lib/avo/concerns/has_controls.rb +37 -0
  143. data/lib/avo/concerns/has_description.rb +23 -0
  144. data/lib/avo/concerns/has_item_type.rb +42 -0
  145. data/lib/avo/concerns/has_items.rb +325 -0
  146. data/lib/avo/concerns/is_resource_item.rb +24 -36
  147. data/lib/avo/concerns/is_visible.rb +15 -0
  148. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  149. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  150. data/lib/avo/configuration/branding.rb +0 -12
  151. data/lib/avo/configuration.rb +1 -37
  152. data/lib/avo/current.rb +39 -0
  153. data/lib/avo/dsl/field_parser.rb +1 -1
  154. data/lib/avo/dynamic_router.rb +18 -3
  155. data/lib/avo/engine.rb +35 -30
  156. data/lib/avo/error_manager.rb +25 -0
  157. data/lib/avo/execution_context.rb +10 -14
  158. data/lib/avo/fields/badge_field.rb +1 -1
  159. data/lib/avo/fields/base_field.rb +91 -105
  160. data/lib/avo/fields/belongs_to_field.rb +18 -22
  161. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  162. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  163. data/lib/avo/fields/concerns/has_default.rb +1 -5
  164. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  165. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  166. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  167. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  168. data/lib/avo/fields/concerns/is_required.rb +5 -7
  169. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  170. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  171. data/lib/avo/fields/country_field.rb +4 -0
  172. data/lib/avo/fields/date_time_field.rb +1 -5
  173. data/lib/avo/fields/field_manager.rb +55 -0
  174. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  175. data/lib/avo/fields/has_base_field.rb +12 -15
  176. data/lib/avo/fields/has_many_field.rb +5 -2
  177. data/lib/avo/fields/has_one_field.rb +6 -10
  178. data/lib/avo/fields/heading_field.rb +4 -1
  179. data/lib/avo/fields/hidden_field.rb +1 -1
  180. data/lib/avo/fields/id_field.rb +1 -1
  181. data/lib/avo/fields/location_field.rb +8 -8
  182. data/lib/avo/fields/password_field.rb +1 -1
  183. data/lib/avo/fields/preview_field.rb +14 -0
  184. data/lib/avo/fields/select_field.rb +12 -8
  185. data/lib/avo/fields/status_field.rb +4 -0
  186. data/lib/avo/filters/base_filter.rb +8 -4
  187. data/lib/avo/html/builder.rb +7 -8
  188. data/lib/avo/item_grapher.rb +78 -0
  189. data/lib/avo/licensing/h_q.rb +7 -66
  190. data/lib/avo/licensing/license.rb +1 -1
  191. data/lib/avo/licensing/pro_license.rb +1 -7
  192. data/lib/avo/loaders/fields_loader.rb +7 -1
  193. data/lib/avo/plugin.rb +16 -0
  194. data/lib/avo/plugin_manager.rb +56 -0
  195. data/lib/avo/prefixed_test_helpers.rb +20 -0
  196. data/lib/avo/reloader.rb +3 -0
  197. data/lib/avo/resources/controls/actions_list.rb +7 -12
  198. data/lib/avo/resources/controls/attach_button.rb +15 -0
  199. data/lib/avo/resources/controls/back_button.rb +1 -1
  200. data/lib/avo/resources/controls/base_control.rb +15 -49
  201. data/lib/avo/resources/controls/create_button.rb +15 -0
  202. data/lib/avo/resources/controls/delete_button.rb +5 -1
  203. data/lib/avo/resources/controls/detach_button.rb +4 -1
  204. data/lib/avo/resources/controls/edit_button.rb +4 -1
  205. data/lib/avo/resources/controls/order_controls.rb +8 -0
  206. data/lib/avo/resources/controls/save_button.rb +13 -0
  207. data/lib/avo/resources/controls/show_button.rb +15 -0
  208. data/lib/avo/resources/items/holder.rb +84 -0
  209. data/lib/avo/resources/items/item_group.rb +49 -0
  210. data/lib/avo/resources/items/main_panel.rb +2 -0
  211. data/lib/avo/resources/items/panel.rb +2 -0
  212. data/lib/avo/resources/items/row.rb +54 -0
  213. data/lib/avo/resources/items/sidebar.rb +47 -0
  214. data/lib/avo/resources/items/tab.rb +60 -0
  215. data/lib/avo/resources/items/tab_group.rb +68 -0
  216. data/lib/avo/resources/resource_manager.rb +174 -0
  217. data/lib/avo/services/authorization_service.rb +11 -110
  218. data/lib/avo/services/debug_service.rb +93 -0
  219. data/lib/avo/services/telemetry_service.rb +85 -0
  220. data/lib/avo/test_helpers.rb +362 -0
  221. data/lib/avo/tools/tool_manager.rb +30 -0
  222. data/lib/avo/version.rb +1 -1
  223. data/lib/avo.rb +115 -24
  224. data/lib/generators/avo/action_generator.rb +8 -8
  225. data/lib/generators/avo/card_generator.rb +27 -0
  226. data/lib/generators/avo/filter_generator.rb +8 -8
  227. data/lib/generators/avo/resource_generator.rb +4 -4
  228. data/lib/generators/avo/scope_generator.rb +15 -0
  229. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  230. data/lib/generators/avo/templates/action.tt +8 -6
  231. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  232. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  233. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  234. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  235. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  236. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  237. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  238. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  239. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  240. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  241. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  242. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  243. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  244. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  245. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  246. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  247. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  248. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  249. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  250. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  251. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  252. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  253. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  254. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  255. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  256. data/lib/generators/avo/templates/scope.tt +6 -0
  257. data/lib/generators/avo/templates/tool/view.tt +2 -2
  258. data/lib/tasks/avo_tasks.rake +27 -0
  259. data/public/avo-assets/avo.base.css +1810 -1189
  260. data/public/avo-assets/avo.base.js +217 -305
  261. data/public/avo-assets/avo.base.js.map +3 -3
  262. data/public/avo-assets/avo.css +9744 -0
  263. data/public/avo-assets/avo.js +513 -0
  264. data/public/avo-assets/avo.js.map +7 -0
  265. metadata +96 -137
  266. data/app/assets/stylesheets/css/tags.css +0 -32
  267. data/app/components/avo/card_component.html.erb +0 -46
  268. data/app/components/avo/card_component.rb +0 -25
  269. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  270. data/app/components/avo/dashboards/divider_component.rb +0 -19
  271. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  272. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  273. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  274. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  275. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  276. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  277. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  278. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  279. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  280. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  281. data/app/components/avo/index/ordering/base_component.rb +0 -9
  282. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  283. data/app/components/avo/index/ordering/button_component.rb +0 -23
  284. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  285. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  286. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  287. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  288. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  289. data/app/controllers/avo/dashboards_controller.rb +0 -22
  290. data/app/controllers/avo/reorder_controller.rb +0 -25
  291. data/app/javascript/js/controllers/base_controller.js +0 -22
  292. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  293. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  294. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  295. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  296. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  297. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  298. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  299. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  300. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  301. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  302. data/app/views/avo/dashboards/show.html.erb +0 -38
  303. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  304. data/app/views/avo/partials/_global_search.html.erb +0 -19
  305. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  306. data/lib/avo/app.rb +0 -237
  307. data/lib/avo/base_card.rb +0 -161
  308. data/lib/avo/concerns/fetches_things.rb +0 -150
  309. data/lib/avo/concerns/handles_field_args.rb +0 -47
  310. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  311. data/lib/avo/concerns/has_fields.rb +0 -334
  312. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  313. data/lib/avo/concerns/pagination.rb +0 -53
  314. data/lib/avo/concerns/policy_helpers.rb +0 -31
  315. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  316. data/lib/avo/concerns/visible_items.rb +0 -51
  317. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  318. data/lib/avo/dashboards/base_divider.rb +0 -35
  319. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  320. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  321. data/lib/avo/dashboards/metric_card.rb +0 -9
  322. data/lib/avo/dashboards/partial_card.rb +0 -7
  323. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  324. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  325. data/lib/avo/fields/tags_field.rb +0 -102
  326. data/lib/avo/grid_collector.rb +0 -42
  327. data/lib/avo/hosts/association_scope_host.rb +0 -8
  328. data/lib/avo/hosts/base_host.rb +0 -25
  329. data/lib/avo/hosts/card_visibility.rb +0 -20
  330. data/lib/avo/hosts/dashboard_card.rb +0 -22
  331. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  332. data/lib/avo/hosts/ordering.rb +0 -22
  333. data/lib/avo/hosts/record_host.rb +0 -7
  334. data/lib/avo/hosts/resource_record_host.rb +0 -7
  335. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  336. data/lib/avo/hosts/search_scope_host.rb +0 -7
  337. data/lib/avo/hosts/view_record_host.rb +0 -7
  338. data/lib/avo/hosts/visibility_host.rb +0 -12
  339. data/lib/avo/items_holder.rb +0 -96
  340. data/lib/avo/main_panel.rb +0 -3
  341. data/lib/avo/menu/base_item.rb +0 -25
  342. data/lib/avo/menu/builder.rb +0 -82
  343. data/lib/avo/menu/dashboard.rb +0 -22
  344. data/lib/avo/menu/group.rb +0 -2
  345. data/lib/avo/menu/link.rb +0 -6
  346. data/lib/avo/menu/menu.rb +0 -2
  347. data/lib/avo/menu/resource.rb +0 -22
  348. data/lib/avo/menu/section.rb +0 -2
  349. data/lib/avo/panel.rb +0 -24
  350. data/lib/avo/panel_builder.rb +0 -25
  351. data/lib/avo/resources/controls/action.rb +0 -38
  352. data/lib/avo/resources/controls/execution_context.rb +0 -58
  353. data/lib/avo/resources/controls/items_holder.rb +0 -19
  354. data/lib/avo/resources/controls/link_to.rb +0 -27
  355. data/lib/avo/row.rb +0 -26
  356. data/lib/avo/row_builder.rb +0 -24
  357. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  358. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  359. data/lib/avo/sidebar.rb +0 -30
  360. data/lib/avo/sidebar_builder.rb +0 -24
  361. data/lib/avo/tab.rb +0 -72
  362. data/lib/avo/tab_builder.rb +0 -25
  363. data/lib/avo/tab_group.rb +0 -42
  364. data/lib/avo/tab_group_builder.rb +0 -43
  365. data/lib/avo/tools_manager.rb +0 -11
  366. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  367. data/lib/generators/avo/card/metric_generator.rb +0 -18
  368. data/lib/generators/avo/card/partial_generator.rb +0 -19
  369. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  370. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  371. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -1,12 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
4
- def initialize(resource: nil, reflection: nil, parent_model: nil, parent_resource: nil, view_type: :table)
4
+ include Avo::ApplicationHelper
5
+
6
+ def initialize(resource: nil, reflection: nil, parent_record: nil, parent_resource: nil, view_type: :table, actions: nil)
5
7
  @resource = resource
6
8
  @reflection = reflection
7
- @parent_model = parent_model
9
+ @parent_record = parent_record
8
10
  @parent_resource = parent_resource
9
11
  @view_type = view_type
12
+ @actions = actions
10
13
  end
11
14
 
12
15
  def can_detach?
@@ -28,37 +31,31 @@ class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
28
31
  @resource.authorization.authorize_action(:show, raise_exception: false)
29
32
  end
30
33
 
31
- def can_reorder?
32
- return authorize_association_for(:reorder) if @reflection.present?
33
-
34
- @resource.authorization.authorize_action(:reorder, raise_exception: false)
35
- end
36
-
37
34
  def show_path
38
35
  args = {}
39
36
 
40
- if @parent_model.present?
37
+ if @parent_record.present?
41
38
  args = {
42
39
  via_resource_class: parent_resource.class.to_s,
43
- via_resource_id: @parent_model.to_param
40
+ via_record_id: @parent_record.to_param
44
41
  }
45
42
  end
46
43
 
47
- helpers.resource_path(model: @resource.model, resource: parent_or_child_resource , **args)
44
+ helpers.resource_path(record: @resource.record, resource: parent_or_child_resource, **args)
48
45
  end
49
46
 
50
47
  def edit_path
51
48
  # Add the `view` param to let Avo know where to redirect back when the user clicks the `Cancel` button.
52
49
  args = {via_view: "index"}
53
50
 
54
- if @parent_model.present?
51
+ if @parent_record.present?
55
52
  args = {
56
53
  via_resource_class: parent_resource.class.to_s,
57
- via_resource_id: @parent_model.to_param
54
+ via_record_id: @parent_record.to_param
58
55
  }
59
56
  end
60
57
 
61
- helpers.edit_resource_path(model: @resource.model, resource: parent_or_child_resource, **args)
58
+ helpers.edit_resource_path(record: @resource.record, resource: parent_or_child_resource, **args)
62
59
  end
63
60
 
64
61
  def singular_resource_name
@@ -71,9 +68,9 @@ class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
71
68
 
72
69
  def parent_resource
73
70
  return @parent_resource if @parent_resource.present?
74
- return nil if @parent_model.blank?
71
+ return nil if @parent_record.blank?
75
72
 
76
- ::Avo::App.get_resource_by_model_name @parent_model.class
73
+ Avo.resource_manager.get_resource_by_model_class @parent_record.class
77
74
  end
78
75
 
79
76
  def is_has_many_association?
@@ -81,6 +78,116 @@ class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
81
78
  end
82
79
 
83
80
  def referrer_path
84
- Avo::App.root_path(paths: ["resources", params[:resource_name], params[:id], params[:related_name]], query: request.query_parameters.to_h)
81
+ Avo.root_path(paths: ["resources", params[:resource_name], params[:id], params[:related_name]], query: request.query_parameters.to_h)
82
+ end
83
+
84
+ def can_reorder?
85
+ return false unless Object.const_defined? "Avo::Pro::Ordering"
86
+
87
+ return authorize_association_for(:reorder) if @reflection.present?
88
+
89
+ @resource.authorization.authorize_action(:reorder, raise_exception: false)
90
+ end
91
+
92
+ private
93
+
94
+ def render_edit_button(control)
95
+ return unless can_edit?
96
+
97
+ link_to helpers.svg("edit", class: svg_classes),
98
+ edit_path,
99
+ class: "flex items-center",
100
+ title: control.title,
101
+ data: {
102
+ target: "control:edit",
103
+ control: :edit,
104
+ "resource-id": @resource.record.id,
105
+ tippy: "tooltip",
106
+ }
107
+ end
108
+
109
+ def render_show_button(control)
110
+ return unless can_view?
111
+
112
+ link_to helpers.svg("eye", class: svg_classes),
113
+ show_path,
114
+ class: "flex items-center",
115
+ title: control.title,
116
+ data: {
117
+ target: "control:view",
118
+ control: :show,
119
+ tippy: "tooltip",
120
+ }
121
+ end
122
+
123
+ def render_delete_button(control)
124
+ # If the resource is a related resource, we use the can_delete? policy method because it uses
125
+ # authorize_association_for(:destroy).
126
+ # Otherwise we use the can_see_the_destroy_button? policy method becuse it do no check for assiciation
127
+ # only for authorize_action .
128
+ policy_method = is_a_related_resource? ? :can_delete? : :can_see_the_destroy_button?
129
+ return unless send policy_method
130
+
131
+ a_button url: helpers.resource_path(record: @resource.record, resource: @resource),
132
+ style: :icon,
133
+ color: :gray,
134
+ icon: "trash",
135
+ form_class: "flex flex-col sm:flex-row sm:inline-flex",
136
+ title: control.title,
137
+ method: :delete,
138
+ params: hidden_params,
139
+ data: {
140
+ turbo_frame: params[:turbo_frame],
141
+ turbo_confirm: control.confirmation_message,
142
+ turbo_method: :delete,
143
+ target: "control:destroy",
144
+ control: :destroy,
145
+ tippy: control.title ? :tooltip : nil,
146
+ "resource-id": @resource.record.id,
147
+ }
148
+ end
149
+
150
+ def render_detach_button(control)
151
+ return unless can_detach?
152
+
153
+ a_button url: helpers.resource_detach_path(params[:resource_name], params[:id], params[:related_name], @resource.record.id),
154
+ style: :icon,
155
+ color: :gray,
156
+ icon: "detach",
157
+ form_class: "flex items-center",
158
+ title: control.title,
159
+ method: :delete,
160
+ params: hidden_params,
161
+ data: {
162
+ turbo_frame: params[:turbo_frame],
163
+ turbo_confirm: control.confirmation_message,
164
+ target: "control:detach",
165
+ control: :detach,
166
+ "resource-id": @resource.record.id,
167
+ tippy: :tooltip,
168
+ }
169
+ end
170
+
171
+ def render_order_controls(control)
172
+ if can_reorder?
173
+ render Avo::Pro::Ordering::ButtonsComponent.new resource: @resource, reflection: @reflection, view_type: @view_type
174
+ end
175
+ end
176
+
177
+ def svg_classes
178
+ "text-gray-600 h-6 hover:text-gray-600"
179
+ end
180
+
181
+ def hidden_params
182
+ hidden = {}
183
+
184
+ hidden[:view_type] = params[:view_type] if params[:view_type]
185
+
186
+ if params[:turbo_frame]
187
+ hidden[:turbo_frame] = params[:turbo_frame]
188
+ hidden[:referrer] = referrer_path
189
+ end
190
+
191
+ hidden
85
192
  end
86
193
  end
@@ -1,14 +1,16 @@
1
1
  <% if @resources.present?%>
2
2
  <div class="w-full grid grid-cols-1 xs:grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-6 gap-6 mt-8"
3
+ data-component-name="<%= self.class.to_s.underscore %>"
3
4
  data-selected-resources-name="<%= @resource.model_key %>" data-selected-resources="[]">
4
5
  <% @resources.each_with_index do |resource, index| %>
5
- <% cache_if Avo.configuration.cache_resources_on_index_view, resource.cache_hash(@parent_model) do %>
6
- <%= render(Avo::Index::GridItemComponent.new(resource: resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource)) %>
6
+ <% cache_if Avo.configuration.cache_resources_on_index_view, resource.cache_hash(@parent_record) do %>
7
+ <%= render(Avo::Index::GridItemComponent.new(resource: resource, reflection: @reflection, parent_record: @parent_record, parent_resource: @parent_resource, actions: actions)) %>
7
8
  <% end %>
8
9
  <% end %>
9
10
  </div>
10
11
  <% else %>
11
- <div class="bg-white rounded shadow-panel">
12
+ <div class="bg-white rounded shadow-panel"
13
+ data-component-name="<%= self.class.to_s.underscore %>">
12
14
  <%= helpers.empty_state by_association: params[:related_name].present?, view_type: :grid %>
13
15
  </div>
14
16
  <% end %>
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Index::ResourceGridComponent < ViewComponent::Base
4
- def initialize(resources: nil, resource: nil, reflection: nil, parent_model: nil, parent_resource: nil)
4
+ attr_reader :actions
5
+
6
+ def initialize(resources: nil, resource: nil, reflection: nil, parent_record: nil, parent_resource: nil, actions: nil)
5
7
  @resources = resources
6
8
  @resource = resource
7
9
  @reflection = reflection
8
- @parent_model = parent_model
10
+ @parent_record = parent_record
9
11
  @parent_resource = parent_resource
12
+ @actions = actions
10
13
  end
11
14
  end
@@ -5,7 +5,7 @@
5
5
  </div>
6
6
  <% if render_table? %>
7
7
  <div class="overflow-auto <%= table_component_order_class %>">
8
- <%= render(Avo::Index::ResourceTableComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource, pagy: @pagy, query: @query)) %>
8
+ <%= render(Avo::Index::ResourceTableComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_record: @parent_record, parent_resource: @parent_resource, pagy: @pagy, query: @query)) %>
9
9
  </div>
10
10
  <% end %>
11
11
  </div>
@@ -7,12 +7,12 @@ module Avo
7
7
  class ResourceMapComponent < ViewComponent::Base
8
8
  attr_reader :resources
9
9
 
10
- def initialize(resources: nil, resource: nil, reflection: nil, parent_model: nil, parent_resource: nil, pagy: nil, query: nil)
10
+ def initialize(resources: nil, resource: nil, reflection: nil, parent_record: nil, parent_resource: nil, pagy: nil, query: nil)
11
11
  super
12
12
  @resources = resources
13
13
  @resource = resource
14
14
  @reflection = reflection
15
- @parent_model = parent_model
15
+ @parent_record = parent_record
16
16
  @parent_resource = parent_resource
17
17
  @pagy = pagy
18
18
  @query = query
@@ -66,7 +66,7 @@ module Avo
66
66
 
67
67
  resources
68
68
  .map do |resource|
69
- Avo::Hosts::ResourceRecordHost.new(block: marker_proc, resource: resource, record: resource.record).handle
69
+ Avo::ExecutionContext.new(target: marker_proc, record: resource.record).handle
70
70
  end
71
71
  .compact
72
72
  .filter do |coordinates|
@@ -1,4 +1,5 @@
1
1
  <div class="w-full relative overflow-auto mac-styled-scrollbar"
2
+ data-component-name="<%= self.class.to_s.underscore %>"
2
3
  data-controller="item-select-all"
3
4
  data-resource-name="<%= @resource.model_key %>"
4
5
  data-item-select-all-selected-all-value="false"
@@ -11,7 +12,7 @@
11
12
  <div class="absolute z-30 w-full ml-10 pt-px hidden" data-item-select-all-target="selectAllOverlay">
12
13
  <div class="bg-white flex items-center h-9 mt-0.5">
13
14
  <div class="mt-1.5" data-item-select-all-target="unselectedMessage">
14
- <%= selected_page_label %>
15
+ <%= t "avo.x_records_selected_from_a_total_of_x_html", selected: pagy.in, count: pagy.count %>
15
16
  <%= a_link request.url,
16
17
  size: :xs,
17
18
  color: :primary,
@@ -22,7 +23,7 @@
22
23
  <% end %>
23
24
  </div>
24
25
  <div class="mt-1.5" data-item-select-all-target="selectedMessage" class="hidden">
25
- <%= selected_all_label %>
26
+ <%= t "avo.x_records_selected_from_all_pages_html", count: pagy.count %>
26
27
  <%= a_link request.url,
27
28
  size: :xs,
28
29
  color: :primary,
@@ -39,8 +40,8 @@
39
40
  <%= render partial: 'avo/partials/table_header', locals: {fields: @resource.get_fields(reflection: @reflection, only_root: true)} %>
40
41
  <tbody class="divide-y">
41
42
  <% @resources.each_with_index do |resource, index| %>
42
- <% cache_if Avo.configuration.cache_resources_on_index_view, resource.cache_hash(@parent_model), expires_in: 1.day do %>
43
- <%= render Avo::Index::TableRowComponent.new(resource: resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource) %>
43
+ <% cache_if Avo.configuration.cache_resources_on_index_view, resource.cache_hash(@parent_record), expires_in: 1.day do %>
44
+ <%= render Avo::Index::TableRowComponent.new(resource: resource, reflection: @reflection, parent_record: @parent_record, parent_resource: @parent_resource, actions: @actions) %>
44
45
  <% end %>
45
46
  <% end %>
46
47
  </tbody>
@@ -4,38 +4,32 @@ class Avo::Index::ResourceTableComponent < ViewComponent::Base
4
4
  include Avo::ApplicationHelper
5
5
  attr_reader :pagy, :query
6
6
 
7
- def initialize(resources: nil, resource: nil, reflection: nil, parent_model: nil, parent_resource: nil, pagy: nil, query: nil)
7
+ def initialize(resources: nil, resource: nil, reflection: nil, parent_record: nil, parent_resource: nil, pagy: nil, query: nil, actions: nil)
8
8
  @resources = resources
9
9
  @resource = resource
10
10
  @reflection = reflection
11
- @parent_model = parent_model
11
+ @parent_record = parent_record
12
12
  @parent_resource = parent_resource
13
13
  @pagy = pagy
14
14
  @query = query
15
+ @actions = actions
15
16
  end
16
17
 
17
18
  def encrypted_query
18
- return :select_all_disabled if query.nil? || !query.respond_to?(:all) || !query.all.respond_to?(:to_sql)
19
+ # TODO: move this to the resource where we can apply the adapter pattern
20
+ serialized_query = if Module.const_defined?("Ransack::Search") && query.instance_of?(Ransack::Search)
21
+ query.context.object.to_sql
22
+ else
23
+ return :select_all_disabled if query.nil? || !query.respond_to?(:all) || !query.all.respond_to?(:to_sql)
24
+
25
+ query.all.to_sql
26
+ end
27
+
28
+ return if serialized_query.nil?
19
29
 
20
30
  Avo::Services::EncryptionService.encrypt(
21
- message: query.all.to_sql,
31
+ message: serialized_query,
22
32
  purpose: :select_all
23
33
  )
24
34
  end
25
-
26
- def selected_page_label
27
- if @resource.pagination_type.countless?
28
- t "avo.x_records_selected_from_page_html", selected: pagy.in
29
- else
30
- t "avo.x_records_selected_from_a_total_of_x_html", selected: pagy.in, count: pagy.count
31
- end
32
- end
33
-
34
- def selected_all_label
35
- if @resource.pagination_type.countless?
36
- t "avo.records_selected_from_all_pages_html"
37
- else
38
- t "avo.x_records_selected_from_all_pages_html", count: pagy.count
39
- end
40
- end
41
35
  end
@@ -1,6 +1,10 @@
1
+ <%# hover:z-[21] removed from tr class to solve flickering actions component on row controls and z-20 changed to z-21%>
1
2
  <tr
2
- class="bg-white hover:bg-gray-50 hover:shadow-row hover:z-[21] relative z-20 border-b"
3
+ class="bg-white hover:bg-gray-50 hover:shadow-row relative z-21 border-b"
4
+ data-component-name="<%= self.class.to_s.underscore %>"
3
5
  <%== item_selector_init @resource %>
6
+ data-resource-name="<%= @resource.class.to_s %>"
7
+ data-record-id="<%= @resource.record.id %>"
4
8
  >
5
9
  <% if @resource.record_selector %>
6
10
  <td class="w-10">
@@ -12,17 +16,17 @@
12
16
  <% if Avo.configuration.resource_controls_on_the_left? %>
13
17
  <td class="text-right whitespace-nowrap px-2" data-control="resource-controls">
14
18
  <div class="flex items-center justify-end flex-grow-0 h-full w-full">
15
- <%= render(Avo::Index::ResourceControlsComponent.new(resource: @resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource, view_type: :table)) %>
19
+ <%= render(Avo::Index::ResourceControlsComponent.new(resource: @resource, reflection: @reflection, parent_record: @parent_record, parent_resource: @parent_resource, view_type: :table, actions: @actions)) %>
16
20
  </div>
17
21
  </td>
18
22
  <% end %>
19
23
  <% @resource.get_fields(reflection: @reflection, only_root: true).each_with_index do |field, index| %>
20
- <%= render field.component_for_view(:index).new(field: field, resource: @resource, reflection: @reflection, index: index, parent_model: @parent_model, parent_resource: @parent_resource) %>
24
+ <%= render field.component_for_view(:index).new(field: field, resource: @resource, reflection: @reflection, index: index, parent_record: @parent_record, parent_resource: @parent_resource) %>
21
25
  <% end %>
22
26
  <% if Avo.configuration.resource_controls_on_the_right? %>
23
27
  <td class="text-right whitespace-nowrap px-2" data-control="resource-controls">
24
28
  <div class="flex items-center justify-end flex-grow-0 h-full w-full">
25
- <%= render(Avo::Index::ResourceControlsComponent.new(resource: @resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource, view_type: :table)) %>
29
+ <%= render(Avo::Index::ResourceControlsComponent.new(resource: @resource, reflection: @reflection, parent_record: @parent_record, parent_resource: @parent_resource, view_type: :table, actions: @actions)) %>
26
30
  </div>
27
31
  </td>
28
32
  <% end %>
@@ -3,10 +3,11 @@
3
3
  class Avo::Index::TableRowComponent < ViewComponent::Base
4
4
  include Avo::ResourcesHelper
5
5
 
6
- def initialize(resource: nil, reflection: nil, parent_model: nil, parent_resource: nil)
6
+ def initialize(resource: nil, reflection: nil, parent_record: nil, parent_resource: nil, actions: nil)
7
7
  @resource = resource
8
8
  @reflection = reflection
9
- @parent_model = parent_model
9
+ @parent_record = parent_record
10
10
  @parent_resource = parent_resource
11
+ @actions = actions
11
12
  end
12
13
  end
@@ -38,11 +38,11 @@ class Avo::ItemSwitcherComponent < Avo::BaseComponent
38
38
  end
39
39
 
40
40
  def tab_group_component
41
- Avo::TabGroupComponent.new resource: @resource, group: item.hydrate(view: view), index: index, params: params, form: form, view: view, tabs_style: item.style
41
+ Avo::TabGroupComponent.new resource: @resource, group: item.hydrate(view: view), index: index, params: params, form: form, view: view
42
42
  end
43
43
 
44
44
  def field_component
45
- final_item = item.dup.hydrate(resource: @resource, model: @resource.model, user: resource.user, view: view)
45
+ final_item = item.dup.hydrate(resource: @resource, record: @resource.record, user: resource.user, view: view)
46
46
  final_item.component_for_view(@view).new(field: final_item, resource: @resource, index: index, form: form)
47
47
  end
48
48
  end
@@ -3,20 +3,15 @@
3
3
  data-modal-target="modal"
4
4
  >
5
5
  <div aria-expanded="true" class="modal-overlay absolute w-full h-full bg-opacity-25 bg-gray-800 flex justify-center items-center" data-action="click->modal#close"></div>
6
- <div aria-expanded="true" role="dialog" aria-modal="true" class="modal-body rounded-lg inset-auto bg-white flex z-50 relative shadow-modal overflow-auto <%= width_classes %> <%= height_classes %>">
6
+ <div aria-expanded="true" role="dialog" aria-modal="true" class="modal-body rounded-lg inset-auto w-11/12 lg:w-1/2 sm:max-w-168 min-h-1/4 bg-white flex z-50 relative shadow-modal overflow-auto max-h-full">
7
7
  <div class="flex-1 flex flex-col justify-between">
8
8
  <div>
9
- <% if heading? %>
10
- <div class="p-6 text-2xl tracking-normal font-semibold text-black">
11
- <%= heading %>
12
- </div>
13
- <% end %>
14
-
15
- <% if content? %>
16
- <div class="px-6 text-base text-gray-500 <%= body_class %>">
17
- <%= content %>
18
- </div>
19
- <% end %>
9
+ <div class="p-6 text-2xl tracking-normal font-semibold text-black">
10
+ <%= heading %>
11
+ </div>
12
+ <div class="px-6 text-base text-gray-500">
13
+ <%= content %>
14
+ </div>
20
15
  </div>
21
16
  <% if controls? %>
22
17
  <div class="flex justify-end items-baseline space-x-4 p-4 bg-gray-100">
@@ -3,25 +3,4 @@
3
3
  class Avo::ModalComponent < ViewComponent::Base
4
4
  renders_one :heading
5
5
  renders_one :controls
6
-
7
- attr_reader :width
8
- attr_reader :body_class
9
-
10
- def initialize(width: :md, body_class: nil)
11
- @width = width
12
- @body_class = body_class
13
- end
14
-
15
- def width_classes
16
- case width.to_sym
17
- when :md
18
- "w-11/12 lg:w-1/2 sm:max-w-168"
19
- when :xl
20
- "w-11/12 lg:w-3/4"
21
- end
22
- end
23
-
24
- def height_classes
25
- "max-h-full min-h-1/4 max-h-11/12"
26
- end
27
6
  end
@@ -1,36 +1,47 @@
1
- <div class="flex flex-col sm:flex-row items-center justify-between aborder-t aborder-slate-200 rounded-xl space-y-2 sm:space-y-0">
2
- <div class="flex-2 sm:flex sm:items-center sm:justify-between">
3
- <div>
4
- <div class="text-sm leading-5 text-slate-600 flex items-center">
5
- <div data-controller="per-page">
6
- <div class="flex items-center">
7
- <%= select_tag 'per_page',
8
- options_for_select(per_page_options, index_params[:per_page]),
9
- class: 'appearance-none inline-flex bg-white-100 disabled:bg-white-400 disabled:cursor-not-allowed focus:bg-white text-slate-700 disabled:text-slate-600 rounded-md py-1 px-2 leading-tight border border-slate-300 outline-none focus:border-slate-400 outline w-16 mr-1 text-sm',
10
- data: {
11
- 'turbo-frame': turbo_frame,
12
- 'per-page-target': 'selector',
13
- action: 'change->per-page#reload'
14
- }
15
- %> <%= t('avo.per_page').downcase %>
1
+ <%
2
+ per_page_options = [*Avo.configuration.per_page_steps, Avo.configuration.per_page.to_i, index_params[:per_page].to_i]
3
+
4
+ if parent_record.present?
5
+ per_page_options.prepend Avo.configuration.via_per_page
6
+ end
7
+
8
+ per_page_options = per_page_options.sort.uniq
9
+ %>
10
+ <% unless @pagy.pages <= 1 && discreet_pagination %>
11
+ <div class="flex flex-col sm:flex-row items-center justify-between aborder-t aborder-slate-200 rounded-xl space-y-2 sm:space-y-0">
12
+ <div class="flex-2 sm:flex sm:items-center sm:justify-between">
13
+ <div>
14
+ <div class="text-sm leading-5 text-slate-600 flex items-center">
15
+ <div data-controller="per-page">
16
+ <div class="flex items-center">
17
+ <%= select_tag 'per_page',
18
+ options_for_select(per_page_options, index_params[:per_page]),
19
+ class: 'appearance-none inline-flex bg-white-100 disabled:bg-white-400 disabled:cursor-not-allowed focus:bg-white text-slate-700 disabled:text-slate-600 rounded-md py-1 px-2 leading-tight border border-slate-300 outline-none focus:border-slate-400 outline w-16 mr-1 text-sm',
20
+ data: {
21
+ 'turbo-frame': turbo_frame,
22
+ 'per-page-target': 'selector',
23
+ action: 'change->per-page#reload'
24
+ }
25
+ %> <%= t('avo.per_page').downcase %>
26
+ </div>
27
+ <% per_page_options.each do |option| %>
28
+ <%= link_to "Change to #{option} items per page", change_items_per_page_url(option), class: 'hidden', 'data-per-page-option': option, 'data-turbo-frame': turbo_frame %>
29
+ <% end %>
16
30
  </div>
17
- <% per_page_options.each do |option| %>
18
- <%= link_to "Change to #{option} items per page", change_items_per_page_url(option), class: 'hidden', 'data-per-page-option': option, 'data-turbo-frame': turbo_frame %>
19
- <% end %>
20
31
  </div>
21
32
  </div>
22
33
  </div>
23
- </div>
24
- <div class="flex">
25
- <div class="flex-2 sm:flex sm:items-center sm:justify-between space-y-2 sm:space-y-0 text-center sm:text-left">
26
- <% if @resource.pagination_type.default? %>
27
- <div class="text-sm text-slate-600 mr-4"><%== helpers.pagy_info @pagy %></div>
28
- <% end %>
34
+ <div class="flex">
35
+ <div class="flex-2 sm:flex sm:items-center sm:justify-between space-y-2 sm:space-y-0 text-center sm:text-left">
36
+ <% if @pagy.count > 0 %>
37
+ <div class="text-sm text-slate-600 mr-4"><%== helpers.pagy_info @pagy %></div>
38
+ <% end %>
29
39
 
30
- <% if pagy.pages > 1 %>
31
- <%# @todo: add first & last page. make the first and last buttons rounded %>
32
- <%== helpers.pagy_nav @pagy %>
33
- <% end %>
40
+ <% if @pagy.pages > 1 %>
41
+ <%# @todo: add first & last page. make the first and last buttons rounded %>
42
+ <%== helpers.pagy_nav @pagy %>
43
+ <% end %>
44
+ </div>
34
45
  </div>
35
46
  </div>
36
- </div>
47
+ <% end %>
@@ -5,41 +5,23 @@ class Avo::PaginatorComponent < ViewComponent::Base
5
5
  attr_reader :turbo_frame
6
6
  attr_reader :index_params
7
7
  attr_reader :resource
8
- attr_reader :parent_model
8
+ attr_reader :parent_record
9
9
  attr_reader :discreet_pagination
10
10
 
11
- def initialize(resource: nil, parent_model: nil, pagy: nil, turbo_frame: nil, index_params: nil, discreet_pagination: nil)
11
+ def initialize(resource: nil, parent_record: nil, pagy: nil, turbo_frame: nil, index_params: nil, discreet_pagination: nil)
12
12
  @pagy = pagy
13
13
  @turbo_frame = turbo_frame
14
14
  @index_params = index_params
15
15
  @resource = resource
16
- @parent_model = parent_model
16
+ @parent_record = parent_record
17
17
  @discreet_pagination = discreet_pagination
18
18
  end
19
19
 
20
20
  def change_items_per_page_url(option)
21
- if parent_model.present?
22
- helpers.related_resources_path(parent_model, parent_model, per_page: option, keep_query_params: true, page: 1)
21
+ if parent_record.present?
22
+ helpers.related_resources_path(parent_record, parent_record, per_page: option, keep_query_params: true, page: 1)
23
23
  else
24
24
  helpers.resources_path(resource: resource, per_page: option, keep_query_params: true, page: 1)
25
25
  end
26
26
  end
27
-
28
- def render?
29
- return false if discreet_pagination && pagy.pages <= 1
30
-
31
- @pagy.items > 0
32
- end
33
-
34
- def per_page_options
35
- @per_page_options ||= begin
36
- options = [*Avo.configuration.per_page_steps, Avo.configuration.per_page.to_i, index_params[:per_page].to_i]
37
-
38
- if parent_model.present?
39
- options.prepend Avo.configuration.via_per_page
40
- end
41
-
42
- options.sort.uniq
43
- end
44
- end
45
27
  end
@@ -1,6 +1,6 @@
1
1
  <%= content_tag :div, data: data_attributes, class: classes do %>
2
2
  <% if render_header? %>
3
- <div class="flex-1 flex flex-col xl:flex-row justify-between mb-4">
3
+ <div data-target="panel-header" class="flex-1 flex flex-col xl:flex-row justify-between mb-4">
4
4
  <div class="overflow-hidden flex flex-col">
5
5
  <% if display_breadcrumbs? %>
6
6
  <div class="breadcrumbs truncate mb-2">
@@ -24,7 +24,7 @@
24
24
  </div>
25
25
  <% end %>
26
26
  <% if body? %>
27
- <div class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:gap-4 w-full">
27
+ <div data-target="panel-body" class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:gap-4 w-full">
28
28
  <div class="relative flex-1 w-full <% if sidebar? %> sm:w-2/3 <% end %>">
29
29
  <% # The body is wrapped inside another div in order to avoid long & tall panels next to sidebars when the sidebar taller. %>
30
30
  <div class="relative <%= white_panel_classes %> <%= @body_classes %>">
@@ -32,24 +32,26 @@
32
32
  </div>
33
33
  </div>
34
34
  <% if sidebar? %>
35
- <div class="max-w-full sm:w-1/3 flex-shrink-0 h-full <%= white_panel_classes %>">
35
+ <div class="w-full sm:w-1/3 flex-shrink-0 h-full <%= white_panel_classes %>">
36
36
  <%= sidebar %>
37
37
  </div>
38
38
  <% end %>
39
39
  <% if bare_sidebar? %>
40
- <div class="max-w-full sm:w-1/3 flex-shrink-0 h-full">
40
+ <div class="w-full sm:w-1/3 flex-shrink-0 h-full">
41
41
  <%= bare_sidebar %>
42
42
  </div>
43
43
  <% end %>
44
44
  </div>
45
45
  <% end %>
46
46
  <% if bare_content? %>
47
- <div class="relative">
47
+ <div data-target="panel-bare-content" class="relative">
48
48
  <%= bare_content %>
49
49
  </div>
50
50
  <% end %>
51
51
  <% if footer_tools? %>
52
- <div class="flex-1 w-full flex flex-col sm:flex-row xl:justify-end sm:items-end space-y-2 sm:space-y-0 sm:space-x-2 mt-4 xl:mt-0">
52
+ <div
53
+ data-target="panel-footer-tools"
54
+ class="flex-1 w-full flex flex-col sm:flex-row xl:justify-end sm:items-end space-y-2 sm:space-y-0 sm:space-x-2 mt-4 xl:mt-0">
53
55
  <%= footer_tools %>
54
56
  </div>
55
57
  <% end %>
@@ -1,7 +1,6 @@
1
1
  <%# via_association_type is used in has_one create actions %>
2
2
  <%= hidden_field_tag :via_association_type, params[:via_association_type] if params[:via_association_type] %>
3
3
  <%= hidden_field_tag :via_resource_class, params[:via_resource_class] if params[:via_resource_class] %>
4
- <%= hidden_field_tag :via_resource_id, params[:via_resource_id] if params[:via_resource_id] %>
4
+ <%= hidden_field_tag :via_record_id, params[:via_record_id] if params[:via_record_id] %>
5
5
  <%= hidden_field_tag :via_relation, params[:via_relation] if params[:via_relation] %>
6
- <%= hidden_field_tag :via_belongs_to_resource_class, params[:via_belongs_to_resource_class] if params[:via_belongs_to_resource_class] %>
7
6
  <%= hidden_field_tag :referrer, back_path if params[:via_resource_class] %>