avo 2.49.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 (377) 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 +15 -26
  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/hidden_field/edit_component.html.erb +1 -2
  40. data/app/components/avo/fields/index_component.rb +5 -5
  41. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  42. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  43. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  44. data/app/components/avo/fields/show_component.rb +4 -1
  45. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  46. data/app/components/avo/filters_component.html.erb +9 -3
  47. data/app/components/avo/filters_component.rb +4 -4
  48. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  49. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  50. data/app/components/avo/index/grid_item_component.rb +43 -16
  51. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  52. data/app/components/avo/index/resource_controls_component.rb +124 -17
  53. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  54. data/app/components/avo/index/resource_grid_component.rb +5 -2
  55. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  56. data/app/components/avo/index/resource_map_component.rb +3 -3
  57. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  58. data/app/components/avo/index/resource_table_component.rb +14 -20
  59. data/app/components/avo/index/table_row_component.html.erb +8 -4
  60. data/app/components/avo/index/table_row_component.rb +3 -2
  61. data/app/components/avo/item_switcher_component.rb +2 -2
  62. data/app/components/avo/modal_component.html.erb +7 -12
  63. data/app/components/avo/modal_component.rb +0 -21
  64. data/app/components/avo/paginator_component.html.erb +40 -29
  65. data/app/components/avo/paginator_component.rb +5 -23
  66. data/app/components/avo/panel_component.html.erb +8 -6
  67. data/app/components/avo/referrer_params_component.html.erb +1 -2
  68. data/app/components/avo/resource_component.rb +189 -14
  69. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  70. data/app/components/avo/resource_sidebar_component.rb +1 -1
  71. data/app/components/avo/sidebar/link_component.rb +1 -1
  72. data/app/components/avo/sidebar_component.html.erb +10 -3
  73. data/app/components/avo/sidebar_component.rb +5 -3
  74. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  75. data/app/components/avo/tab_group_component.html.erb +13 -7
  76. data/app/components/avo/tab_group_component.rb +1 -6
  77. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  78. data/app/components/avo/tab_switcher_component.rb +4 -39
  79. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  80. data/app/components/avo/views/resource_edit_component.rb +7 -18
  81. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  82. data/app/components/avo/views/resource_index_component.rb +62 -12
  83. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  84. data/app/components/avo/views/resource_show_component.rb +6 -11
  85. data/app/controllers/avo/actions_controller.rb +27 -24
  86. data/app/controllers/avo/application_controller.rb +105 -151
  87. data/app/controllers/avo/associations_controller.rb +34 -43
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +102 -102
  90. data/app/controllers/avo/debug_controller.rb +17 -5
  91. data/app/controllers/avo/home_controller.rb +1 -1
  92. data/app/controllers/avo/search_controller.rb +30 -51
  93. data/app/controllers/avo/team_users_controller.rb +4 -0
  94. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  95. data/app/helpers/avo/application_helper.rb +15 -9
  96. data/app/helpers/avo/resources_helper.rb +1 -1
  97. data/app/helpers/avo/url_helpers.rb +27 -11
  98. data/app/javascript/avo.base.js +1 -0
  99. data/app/javascript/js/application.js +0 -3
  100. data/app/javascript/js/controllers/action_controller.js +5 -3
  101. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  102. data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
  103. data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
  104. data/app/javascript/js/controllers/filter_controller.js +1 -1
  105. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  106. data/app/javascript/js/controllers/preview_controller.js +24 -0
  107. data/app/javascript/js/controllers/search_controller.js +2 -2
  108. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  109. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  110. data/app/javascript/js/controllers.js +10 -6
  111. data/app/javascript/js/custom-stream-actions.js +15 -0
  112. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  113. data/app/views/avo/actions/show.html.erb +10 -7
  114. data/app/views/avo/associations/new.html.erb +2 -2
  115. data/app/views/avo/base/index.html.erb +3 -2
  116. data/app/views/avo/base/new.html.erb +2 -1
  117. data/app/views/avo/base/preview.html.erb +19 -0
  118. data/app/views/avo/base/show.html.erb +1 -1
  119. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  120. data/app/views/avo/debug/report.html.erb +32 -17
  121. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  122. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  123. data/app/views/avo/partials/_footer.html.erb +1 -1
  124. data/app/views/avo/partials/_javascript.html.erb +5 -0
  125. data/app/views/avo/partials/_logo.html.erb +1 -1
  126. data/app/views/avo/partials/_navbar.html.erb +3 -5
  127. data/app/views/avo/partials/_table_header.html.erb +5 -11
  128. data/app/views/layouts/avo/application.html.erb +4 -2
  129. data/avo.gemspec +11 -12
  130. data/bin/dev +1 -1
  131. data/bin/prod +0 -0
  132. data/config/i18n-tasks.yml +1 -1
  133. data/config/initializers/pagy.rb +0 -2
  134. data/config/master.key +1 -0
  135. data/config/routes.rb +6 -10
  136. data/db/factories.rb +7 -1
  137. data/lib/avo/action_model.rb +20 -0
  138. data/lib/avo/asset_manager.rb +30 -0
  139. data/lib/avo/base_action.rb +57 -42
  140. data/lib/avo/base_resource.rb +264 -227
  141. data/lib/avo/base_resource_tool.rb +9 -16
  142. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  143. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  144. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  145. data/lib/avo/concerns/has_controls.rb +37 -0
  146. data/lib/avo/concerns/has_description.rb +23 -0
  147. data/lib/avo/concerns/has_item_type.rb +42 -0
  148. data/lib/avo/concerns/has_items.rb +325 -0
  149. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  150. data/lib/avo/concerns/is_resource_item.rb +24 -36
  151. data/lib/avo/concerns/is_visible.rb +15 -0
  152. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  153. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  154. data/lib/avo/configuration/branding.rb +0 -12
  155. data/lib/avo/configuration.rb +1 -37
  156. data/lib/avo/current.rb +39 -0
  157. data/lib/avo/dsl/field_parser.rb +1 -1
  158. data/lib/avo/dynamic_router.rb +18 -3
  159. data/lib/avo/engine.rb +35 -30
  160. data/lib/avo/error_manager.rb +25 -0
  161. data/lib/avo/execution_context.rb +10 -14
  162. data/lib/avo/fields/badge_field.rb +1 -1
  163. data/lib/avo/fields/base_field.rb +91 -106
  164. data/lib/avo/fields/belongs_to_field.rb +18 -22
  165. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  166. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  167. data/lib/avo/fields/concerns/has_default.rb +1 -5
  168. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  169. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  170. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  171. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  172. data/lib/avo/fields/concerns/is_required.rb +5 -7
  173. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  174. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  175. data/lib/avo/fields/country_field.rb +4 -0
  176. data/lib/avo/fields/date_time_field.rb +3 -14
  177. data/lib/avo/fields/field_manager.rb +55 -0
  178. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  179. data/lib/avo/fields/has_base_field.rb +12 -15
  180. data/lib/avo/fields/has_many_field.rb +5 -2
  181. data/lib/avo/fields/has_one_field.rb +6 -10
  182. data/lib/avo/fields/heading_field.rb +4 -1
  183. data/lib/avo/fields/hidden_field.rb +1 -1
  184. data/lib/avo/fields/id_field.rb +1 -1
  185. data/lib/avo/fields/location_field.rb +8 -8
  186. data/lib/avo/fields/password_field.rb +1 -1
  187. data/lib/avo/fields/preview_field.rb +14 -0
  188. data/lib/avo/fields/select_field.rb +12 -8
  189. data/lib/avo/fields/status_field.rb +4 -0
  190. data/lib/avo/filters/base_filter.rb +8 -4
  191. data/lib/avo/html/builder.rb +7 -8
  192. data/lib/avo/item_grapher.rb +78 -0
  193. data/lib/avo/licensing/h_q.rb +8 -67
  194. data/lib/avo/licensing/license.rb +1 -1
  195. data/lib/avo/licensing/pro_license.rb +1 -7
  196. data/lib/avo/loaders/fields_loader.rb +7 -1
  197. data/lib/avo/plugin.rb +16 -0
  198. data/lib/avo/plugin_manager.rb +56 -0
  199. data/lib/avo/prefixed_test_helpers.rb +20 -0
  200. data/lib/avo/reloader.rb +3 -0
  201. data/lib/avo/resources/controls/actions_list.rb +7 -12
  202. data/lib/avo/resources/controls/attach_button.rb +15 -0
  203. data/lib/avo/resources/controls/back_button.rb +1 -1
  204. data/lib/avo/resources/controls/base_control.rb +15 -49
  205. data/lib/avo/resources/controls/create_button.rb +15 -0
  206. data/lib/avo/resources/controls/delete_button.rb +5 -1
  207. data/lib/avo/resources/controls/detach_button.rb +4 -1
  208. data/lib/avo/resources/controls/edit_button.rb +4 -1
  209. data/lib/avo/resources/controls/order_controls.rb +8 -0
  210. data/lib/avo/resources/controls/save_button.rb +13 -0
  211. data/lib/avo/resources/controls/show_button.rb +15 -0
  212. data/lib/avo/resources/items/holder.rb +84 -0
  213. data/lib/avo/resources/items/item_group.rb +49 -0
  214. data/lib/avo/resources/items/main_panel.rb +2 -0
  215. data/lib/avo/resources/items/panel.rb +2 -0
  216. data/lib/avo/resources/items/row.rb +54 -0
  217. data/lib/avo/resources/items/sidebar.rb +47 -0
  218. data/lib/avo/resources/items/tab.rb +60 -0
  219. data/lib/avo/resources/items/tab_group.rb +68 -0
  220. data/lib/avo/resources/resource_manager.rb +174 -0
  221. data/lib/avo/services/authorization_service.rb +11 -110
  222. data/lib/avo/services/debug_service.rb +93 -0
  223. data/lib/avo/services/encryption_service.rb +5 -1
  224. data/lib/avo/services/telemetry_service.rb +85 -0
  225. data/lib/avo/test_helpers.rb +362 -0
  226. data/lib/avo/tools/tool_manager.rb +30 -0
  227. data/lib/avo/version.rb +1 -1
  228. data/lib/avo.rb +115 -24
  229. data/lib/generators/avo/action_generator.rb +8 -8
  230. data/lib/generators/avo/card_generator.rb +27 -0
  231. data/lib/generators/avo/filter_generator.rb +8 -8
  232. data/lib/generators/avo/resource_generator.rb +4 -4
  233. data/lib/generators/avo/scope_generator.rb +15 -0
  234. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  235. data/lib/generators/avo/templates/action.tt +8 -6
  236. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  237. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  238. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  239. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  240. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  241. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  242. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  243. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  244. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  245. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  246. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  247. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  248. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  249. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  250. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  251. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  252. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  253. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  254. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  255. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  256. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  257. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  258. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  259. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  260. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  261. data/lib/generators/avo/templates/scope.tt +6 -0
  262. data/lib/generators/avo/templates/tool/view.tt +2 -2
  263. data/lib/tasks/avo_tasks.rake +27 -0
  264. data/public/avo-assets/avo.base.css +1810 -1189
  265. data/public/avo-assets/avo.base.js +217 -307
  266. data/public/avo-assets/avo.base.js.map +3 -3
  267. data/public/avo-assets/avo.css +9744 -0
  268. data/public/avo-assets/avo.js +513 -0
  269. data/public/avo-assets/avo.js.map +7 -0
  270. metadata +102 -146
  271. data/app/assets/stylesheets/css/tags.css +0 -32
  272. data/app/components/avo/card_component.html.erb +0 -46
  273. data/app/components/avo/card_component.rb +0 -25
  274. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  275. data/app/components/avo/dashboards/divider_component.rb +0 -19
  276. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  277. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  278. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  279. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  280. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  281. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  282. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  283. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  284. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  285. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  286. data/app/components/avo/index/ordering/base_component.rb +0 -9
  287. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  288. data/app/components/avo/index/ordering/button_component.rb +0 -23
  289. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  290. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  291. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  292. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  293. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  294. data/app/controllers/avo/dashboards_controller.rb +0 -22
  295. data/app/controllers/avo/reorder_controller.rb +0 -25
  296. data/app/javascript/js/controllers/base_controller.js +0 -22
  297. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  298. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  299. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  300. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  301. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  302. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  303. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  304. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  305. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  306. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  307. data/app/views/avo/dashboards/show.html.erb +0 -38
  308. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  309. data/app/views/avo/partials/_global_search.html.erb +0 -19
  310. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  311. data/lib/avo/app.rb +0 -237
  312. data/lib/avo/base_card.rb +0 -161
  313. data/lib/avo/concerns/fetches_things.rb +0 -150
  314. data/lib/avo/concerns/handles_field_args.rb +0 -47
  315. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  316. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  317. data/lib/avo/concerns/has_fields.rb +0 -334
  318. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  319. data/lib/avo/concerns/pagination.rb +0 -53
  320. data/lib/avo/concerns/policy_helpers.rb +0 -31
  321. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  322. data/lib/avo/concerns/visible_items.rb +0 -51
  323. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  324. data/lib/avo/dashboards/base_divider.rb +0 -35
  325. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  326. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  327. data/lib/avo/dashboards/metric_card.rb +0 -9
  328. data/lib/avo/dashboards/partial_card.rb +0 -7
  329. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  330. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  331. data/lib/avo/fields/tags_field.rb +0 -102
  332. data/lib/avo/grid_collector.rb +0 -42
  333. data/lib/avo/hosts/association_scope_host.rb +0 -8
  334. data/lib/avo/hosts/base_host.rb +0 -25
  335. data/lib/avo/hosts/card_visibility.rb +0 -20
  336. data/lib/avo/hosts/dashboard_card.rb +0 -22
  337. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  338. data/lib/avo/hosts/ordering.rb +0 -22
  339. data/lib/avo/hosts/record_host.rb +0 -7
  340. data/lib/avo/hosts/resource_record_host.rb +0 -7
  341. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  342. data/lib/avo/hosts/search_scope_host.rb +0 -7
  343. data/lib/avo/hosts/view_record_host.rb +0 -7
  344. data/lib/avo/hosts/visibility_host.rb +0 -12
  345. data/lib/avo/items_holder.rb +0 -96
  346. data/lib/avo/main_panel.rb +0 -3
  347. data/lib/avo/menu/base_item.rb +0 -25
  348. data/lib/avo/menu/builder.rb +0 -82
  349. data/lib/avo/menu/dashboard.rb +0 -22
  350. data/lib/avo/menu/group.rb +0 -2
  351. data/lib/avo/menu/link.rb +0 -6
  352. data/lib/avo/menu/menu.rb +0 -2
  353. data/lib/avo/menu/resource.rb +0 -22
  354. data/lib/avo/menu/section.rb +0 -2
  355. data/lib/avo/panel.rb +0 -24
  356. data/lib/avo/panel_builder.rb +0 -25
  357. data/lib/avo/resources/controls/action.rb +0 -38
  358. data/lib/avo/resources/controls/execution_context.rb +0 -58
  359. data/lib/avo/resources/controls/items_holder.rb +0 -19
  360. data/lib/avo/resources/controls/link_to.rb +0 -27
  361. data/lib/avo/row.rb +0 -26
  362. data/lib/avo/row_builder.rb +0 -24
  363. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  364. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  365. data/lib/avo/sidebar.rb +0 -30
  366. data/lib/avo/sidebar_builder.rb +0 -24
  367. data/lib/avo/tab.rb +0 -72
  368. data/lib/avo/tab_builder.rb +0 -25
  369. data/lib/avo/tab_group.rb +0 -42
  370. data/lib/avo/tab_group_builder.rb +0 -43
  371. data/lib/avo/tools_manager.rb +0 -11
  372. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  373. data/lib/generators/avo/card/metric_generator.rb +0 -18
  374. data/lib/generators/avo/card/partial_generator.rb +0 -19
  375. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  376. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  377. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -1,83 +1,5 @@
1
- <div class="space-x-2 flex flex-row justify-around w-full">
2
- <% button_classes = "text-gray-600 h-6 hover:text-gray-600" %>
3
-
4
- <% if can_reorder? %>
5
- <%= render Avo::Index::Ordering::ButtonsComponent.new resource: @resource, reflection: @reflection, view_type: @view_type %>
6
- <% end %>
7
-
8
- <% if can_view? %>
9
- <%= link_to helpers.svg('eye', class: button_classes),
10
- show_path,
11
- class: 'flex items-center',
12
- title: t('avo.view_item', item: singular_resource_name).humanize,
13
- data: {
14
- target: 'control:view',
15
- control: :show,
16
- 'tippy': 'tooltip',
17
- }
18
- %>
19
- <% end %>
20
-
21
- <% if can_edit? %>
22
- <%= link_to helpers.svg('edit', class: button_classes),
23
- edit_path,
24
- class: 'flex items-center',
25
- title: t('avo.edit_item', item: singular_resource_name).humanize,
26
- data: {
27
- target: 'control:edit',
28
- control: :edit,
29
- 'resource-id': @resource.model.id,
30
- 'tippy': 'tooltip',
31
- }
32
- %>
33
- <% end %>
34
-
35
- <% if can_detach? %>
36
- <%= form_with url: helpers.resource_detach_path(params[:resource_name], params[:id], params[:related_name], @resource.model.id),
37
- method: :delete,
38
- local: true,
39
- class: 'flex items-center',
40
- html: {
41
- 'data-turbo-frame': params[:turbo_frame]
42
- } do |form| %>
43
- <%= form.button helpers.svg('detach', class: button_classes),
44
- title: t('avo.detach_item', item: singular_resource_name).humanize,
45
- type: :submit,
46
- data: {
47
- target: 'control:detach',
48
- turbo_confirm: t('avo.are_you_sure_detach_item', item: singular_resource_name),
49
- control: :detach,
50
- 'resource-id': @resource.model.id,
51
- 'tippy': 'tooltip',
52
- }
53
- %>
54
- <%= hidden_field_tag :turbo_frame, params[:turbo_frame], id: "turbo_frame_detach_#{@resource.model.id}" if params[:turbo_frame] %>
55
- <%= hidden_field_tag :referrer, referrer_path, id: "referrer_detach_#{@resource.model.id}" if params[:turbo_frame] %>
56
- <% end %>
57
- <% end %>
58
-
59
- <% if can_delete? %>
60
- <%= form_with url: helpers.resource_path(model: @resource.model, resource: @resource),
61
- method: :delete,
62
- class: 'flex items-center',
63
- local: true,
64
- html: {
65
- 'data-turbo-frame': params[:turbo_frame]
66
- } do |form| %>
67
- <%= form.button helpers.svg('trash', class: button_classes),
68
- title: t('avo.delete_item', item: singular_resource_name).humanize,
69
- type: :submit,
70
- data: {
71
- target: 'control:destroy',
72
- turbo_confirm: t('avo.are_you_sure', item: singular_resource_name),
73
- control: :destroy,
74
- 'resource-id': @resource.model.id,
75
- 'tippy': 'tooltip',
76
- }
77
- %>
78
- <%= form.hidden_field :view_type, value: params[:view_type], id: "turbo_view_type_#{@resource.model.id}" if params[:view_type] %>
79
- <%= form.hidden_field :turbo_frame, value: params[:turbo_frame], id: "turbo_frame_destroy_#{@resource.model.id}" if params[:turbo_frame] %>
80
- <%= form.hidden_field :referrer, value: referrer_path, id: "referrer_destroy_#{@resource.model.id}" if params[:turbo_frame] %>
81
- <% end %>
1
+ <div class="space-x-2 flex flex-row justify-end w-full">
2
+ <% @resource.render_row_controls(item: singular_resource_name).each do |control| %>
3
+ <%= render_control control %>
82
4
  <% end %>
83
5
  </div>
@@ -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 %>