avo 2.46.0 → 3.0.0.pre1

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

Potentially problematic release.


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

Files changed (417) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +12 -23
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +12 -11
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -36
  167. data/lib/avo/base_resource.rb +108 -96
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  175. data/lib/avo/concerns/is_resource_item.rb +24 -36
  176. data/lib/avo/concerns/is_visible.rb +15 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +8 -45
  180. data/lib/avo/current.rb +5 -0
  181. data/lib/avo/dsl/field_parser.rb +1 -1
  182. data/lib/avo/dynamic_router.rb +6 -2
  183. data/lib/avo/engine.rb +37 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +9 -15
  186. data/lib/avo/fields/badge_field.rb +1 -1
  187. data/lib/avo/fields/base_field.rb +72 -124
  188. data/lib/avo/fields/belongs_to_field.rb +14 -25
  189. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  190. data/lib/avo/fields/concerns/has_default.rb +1 -5
  191. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  192. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  193. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  194. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  195. data/lib/avo/fields/concerns/is_required.rb +5 -7
  196. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/country_field.rb +4 -0
  199. data/lib/avo/fields/date_field.rb +3 -16
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/field_manager.rb +45 -0
  202. data/lib/avo/fields/file_field.rb +0 -2
  203. data/lib/avo/fields/files_field.rb +0 -6
  204. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  205. data/lib/avo/fields/has_base_field.rb +11 -14
  206. data/lib/avo/fields/has_many_field.rb +5 -2
  207. data/lib/avo/fields/has_one_field.rb +5 -10
  208. data/lib/avo/fields/heading_field.rb +4 -1
  209. data/lib/avo/fields/hidden_field.rb +1 -1
  210. data/lib/avo/fields/id_field.rb +2 -3
  211. data/lib/avo/fields/password_field.rb +1 -1
  212. data/lib/avo/fields/preview_field.rb +14 -0
  213. data/lib/avo/fields/select_field.rb +12 -8
  214. data/lib/avo/fields/status_field.rb +4 -0
  215. data/lib/avo/filters/base_filter.rb +3 -8
  216. data/lib/avo/grid_collector.rb +7 -9
  217. data/lib/avo/html/builder.rb +5 -8
  218. data/lib/avo/item_grapher.rb +78 -0
  219. data/lib/avo/licensing/h_q.rb +4 -68
  220. data/lib/avo/licensing/license.rb +2 -2
  221. data/lib/avo/licensing/license_manager.rb +1 -1
  222. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  223. data/lib/avo/licensing/pro_license.rb +1 -7
  224. data/lib/avo/plugin.rb +6 -0
  225. data/lib/avo/plugin_manager.rb +58 -0
  226. data/lib/avo/prefixed_test_helpers.rb +20 -0
  227. data/lib/avo/reloader.rb +3 -0
  228. data/lib/avo/resources/controls/actions_list.rb +6 -12
  229. data/lib/avo/resources/controls/attach_button.rb +15 -0
  230. data/lib/avo/resources/controls/back_button.rb +1 -1
  231. data/lib/avo/resources/controls/base_control.rb +15 -49
  232. data/lib/avo/resources/controls/create_button.rb +15 -0
  233. data/lib/avo/resources/controls/delete_button.rb +5 -1
  234. data/lib/avo/resources/controls/detach_button.rb +4 -1
  235. data/lib/avo/resources/controls/edit_button.rb +4 -1
  236. data/lib/avo/resources/controls/order_controls.rb +8 -0
  237. data/lib/avo/resources/controls/save_button.rb +13 -0
  238. data/lib/avo/resources/controls/show_button.rb +15 -0
  239. data/lib/avo/resources/items/holder.rb +76 -0
  240. data/lib/avo/resources/items/item_group.rb +48 -0
  241. data/lib/avo/resources/items/main_panel.rb +2 -0
  242. data/lib/avo/resources/items/panel.rb +2 -0
  243. data/lib/avo/resources/items/sidebar.rb +47 -0
  244. data/lib/avo/resources/items/tab.rb +60 -0
  245. data/lib/avo/resources/items/tab_group.rb +68 -0
  246. data/lib/avo/resources/resource_manager.rb +181 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +92 -0
  249. data/lib/avo/services/telemetry_service.rb +84 -0
  250. data/lib/avo/test_helpers.rb +362 -0
  251. data/lib/avo/tools/tool_manager.rb +30 -0
  252. data/lib/avo/version.rb +1 -1
  253. data/lib/avo.rb +7 -0
  254. data/lib/generators/avo/eject_generator.rb +0 -1
  255. data/lib/generators/avo/install_generator.rb +1 -11
  256. data/lib/generators/avo/resource_generator.rb +5 -23
  257. data/lib/generators/avo/scope_generator.rb +15 -0
  258. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  259. data/lib/generators/avo/templates/action.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  261. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  263. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  265. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  266. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  267. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  268. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  271. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  272. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  273. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  274. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  275. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  280. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  281. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  282. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  283. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  284. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  285. data/lib/generators/avo/templates/scope.tt +6 -0
  286. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  287. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  288. data/lib/generators/avo/templates/tool/view.tt +2 -2
  289. data/lib/tasks/avo_tasks.rake +22 -0
  290. metadata +82 -161
  291. data/app/assets/stylesheets/css/tags.css +0 -32
  292. data/app/assets/svgs/map-empty-state.svg +0 -35
  293. data/app/assets/svgs/map-view-type.svg +0 -3
  294. data/app/components/avo/card_component.html.erb +0 -46
  295. data/app/components/avo/card_component.rb +0 -25
  296. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  297. data/app/components/avo/dashboards/divider_component.rb +0 -19
  298. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  299. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  300. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  301. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  303. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  304. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  305. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  306. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  307. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  309. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  311. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  312. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  313. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  314. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  315. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  317. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  318. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  319. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  320. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  321. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  322. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  323. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  324. data/app/components/avo/index/ordering/base_component.rb +0 -9
  325. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  326. data/app/components/avo/index/ordering/button_component.rb +0 -23
  327. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  328. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  329. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  330. data/app/components/avo/index/resource_map_component.rb +0 -109
  331. data/app/components/avo/row_component.html.erb +0 -3
  332. data/app/components/avo/row_component.rb +0 -12
  333. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  334. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  335. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  336. data/app/controllers/avo/dashboards_controller.rb +0 -22
  337. data/app/controllers/avo/reorder_controller.rb +0 -25
  338. data/app/javascript/js/controllers/base_controller.js +0 -22
  339. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  340. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  341. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  342. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  343. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  344. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  345. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  346. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  347. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  348. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  349. data/app/views/avo/dashboards/show.html.erb +0 -38
  350. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  351. data/app/views/avo/partials/_global_search.html.erb +0 -19
  352. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  353. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  354. data/lib/avo/base_card.rb +0 -161
  355. data/lib/avo/concerns/fetches_things.rb +0 -150
  356. data/lib/avo/concerns/handles_field_args.rb +0 -47
  357. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  358. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  359. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  360. data/lib/avo/concerns/pagination.rb +0 -53
  361. data/lib/avo/concerns/policy_helpers.rb +0 -31
  362. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  363. data/lib/avo/concerns/visible_items.rb +0 -51
  364. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  365. data/lib/avo/dashboards/base_divider.rb +0 -35
  366. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  367. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  368. data/lib/avo/dashboards/metric_card.rb +0 -9
  369. data/lib/avo/dashboards/partial_card.rb +0 -7
  370. data/lib/avo/fields/area_field.rb +0 -39
  371. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  372. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  373. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  374. data/lib/avo/fields/location_field.rb +0 -86
  375. data/lib/avo/fields/tags_field.rb +0 -102
  376. data/lib/avo/hosts/association_scope_host.rb +0 -8
  377. data/lib/avo/hosts/base_host.rb +0 -25
  378. data/lib/avo/hosts/card_visibility.rb +0 -20
  379. data/lib/avo/hosts/dashboard_card.rb +0 -22
  380. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  381. data/lib/avo/hosts/ordering.rb +0 -22
  382. data/lib/avo/hosts/record_host.rb +0 -7
  383. data/lib/avo/hosts/resource_record_host.rb +0 -7
  384. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  385. data/lib/avo/hosts/search_scope_host.rb +0 -7
  386. data/lib/avo/hosts/view_record_host.rb +0 -7
  387. data/lib/avo/hosts/visibility_host.rb +0 -12
  388. data/lib/avo/items_holder.rb +0 -96
  389. data/lib/avo/main_panel.rb +0 -3
  390. data/lib/avo/menu/base_item.rb +0 -25
  391. data/lib/avo/menu/builder.rb +0 -82
  392. data/lib/avo/menu/dashboard.rb +0 -22
  393. data/lib/avo/menu/group.rb +0 -2
  394. data/lib/avo/menu/link.rb +0 -6
  395. data/lib/avo/menu/menu.rb +0 -2
  396. data/lib/avo/menu/resource.rb +0 -22
  397. data/lib/avo/menu/section.rb +0 -2
  398. data/lib/avo/panel.rb +0 -24
  399. data/lib/avo/panel_builder.rb +0 -25
  400. data/lib/avo/resources/controls/action.rb +0 -38
  401. data/lib/avo/resources/controls/execution_context.rb +0 -58
  402. data/lib/avo/resources/controls/items_holder.rb +0 -19
  403. data/lib/avo/resources/controls/link_to.rb +0 -27
  404. data/lib/avo/row.rb +0 -26
  405. data/lib/avo/row_builder.rb +0 -24
  406. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  407. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  408. data/lib/avo/sidebar.rb +0 -30
  409. data/lib/avo/sidebar_builder.rb +0 -24
  410. data/lib/avo/tab.rb +0 -72
  411. data/lib/avo/tab_builder.rb +0 -25
  412. data/lib/avo/tab_group.rb +0 -42
  413. data/lib/avo/tab_group_builder.rb +0 -43
  414. data/lib/avo/tools_manager.rb +0 -11
  415. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  416. data/public/avo-assets/avo.base.js +0 -1037
  417. data/public/avo-assets/avo.base.js.map +0 -7
@@ -1,16 +1,22 @@
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?
13
- is_has_many_association? ? super : false
16
+ @reflection.present? &&
17
+ @resource.record.present? &&
18
+ is_has_many_association &&
19
+ authorize_association_for(:detach)
14
20
  end
15
21
 
16
22
  def can_edit?
@@ -28,37 +34,31 @@ class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
28
34
  @resource.authorization.authorize_action(:show, raise_exception: false)
29
35
  end
30
36
 
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
37
  def show_path
38
38
  args = {}
39
39
 
40
- if @parent_model.present?
40
+ if @parent_record.present?
41
41
  args = {
42
42
  via_resource_class: parent_resource.class.to_s,
43
- via_resource_id: @parent_model.to_param
43
+ via_record_id: @parent_record.to_param
44
44
  }
45
45
  end
46
46
 
47
- helpers.resource_path(model: @resource.model, resource: parent_or_child_resource , **args)
47
+ helpers.resource_path(record: @resource.record, resource: parent_or_child_resource , **args)
48
48
  end
49
49
 
50
50
  def edit_path
51
51
  # Add the `view` param to let Avo know where to redirect back when the user clicks the `Cancel` button.
52
52
  args = {via_view: "index"}
53
53
 
54
- if @parent_model.present?
54
+ if @parent_record.present?
55
55
  args = {
56
56
  via_resource_class: parent_resource.class.to_s,
57
- via_resource_id: @parent_model.to_param
57
+ via_record_id: @parent_record.to_param
58
58
  }
59
59
  end
60
60
 
61
- helpers.edit_resource_path(model: @resource.model, resource: parent_or_child_resource, **args)
61
+ helpers.edit_resource_path(record: @resource.record, resource: parent_or_child_resource, **args)
62
62
  end
63
63
 
64
64
  def singular_resource_name
@@ -71,16 +71,126 @@ class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
71
71
 
72
72
  def parent_resource
73
73
  return @parent_resource if @parent_resource.present?
74
- return nil if @parent_model.blank?
74
+ return nil if @parent_record.blank?
75
75
 
76
- ::Avo::App.get_resource_by_model_name @parent_model.class
76
+ ::Avo::App.resources.get_resource_by_model_class @parent_record.class
77
77
  end
78
78
 
79
- def is_has_many_association?
79
+ def is_has_many_association
80
80
  @reflection.is_a?(::ActiveRecord::Reflection::HasManyReflection) || @reflection.is_a?(::ActiveRecord::Reflection::ThroughReflection)
81
81
  end
82
82
 
83
83
  def referrer_path
84
84
  Avo::App.root_path(paths: ["resources", params[:resource_name], params[:id], params[:related_name]], query: request.query_parameters.to_h)
85
85
  end
86
+
87
+ def can_reorder?
88
+ return false unless Object.const_defined? "AvoPro::Ordering"
89
+
90
+ return authorize_association_for(:reorder) if @reflection.present?
91
+
92
+ @resource.authorization.authorize_action(:reorder, raise_exception: false)
93
+ end
94
+
95
+ private
96
+
97
+ def render_edit_button(control)
98
+ return unless can_edit?
99
+
100
+ link_to helpers.svg("edit", class: svg_classes),
101
+ edit_path,
102
+ class: "flex items-center",
103
+ title: control.title,
104
+ data: {
105
+ target: "control:edit",
106
+ control: :edit,
107
+ "resource-id": @resource.record.id,
108
+ tippy: "tooltip",
109
+ }
110
+ end
111
+
112
+ def render_show_button(control)
113
+ return unless can_view?
114
+
115
+ link_to helpers.svg("eye", class: svg_classes),
116
+ show_path,
117
+ class: "flex items-center",
118
+ title: control.title,
119
+ data: {
120
+ target: "control:view",
121
+ control: :show,
122
+ tippy: "tooltip",
123
+ }
124
+ end
125
+
126
+ def render_delete_button(control)
127
+ # If the resource is a related resource, we use the can_delete? policy method because it uses
128
+ # authorize_association_for(:destroy).
129
+ # Otherwise we use the can_see_the_destroy_button? policy method becuse it do no check for assiciation
130
+ # only for authorize_action .
131
+ policy_method = is_a_related_resource? ? :can_delete? : :can_see_the_destroy_button?
132
+ return unless send policy_method
133
+
134
+ a_button url: helpers.resource_path(record: @resource.record, resource: @resource),
135
+ style: :icon,
136
+ color: :gray,
137
+ icon: "trash",
138
+ form_class: "flex flex-col sm:flex-row sm:inline-flex",
139
+ title: control.title,
140
+ method: :delete,
141
+ params: hidden_params,
142
+ data: {
143
+ turbo_frame: params[:turbo_frame],
144
+ turbo_confirm: control.confirmation_message,
145
+ turbo_method: :delete,
146
+ target: "control:destroy",
147
+ control: :destroy,
148
+ tippy: control.title ? :tooltip : nil,
149
+ "resource-id": @resource.record.id,
150
+ }
151
+ end
152
+
153
+ def render_detach_button(control)
154
+ return unless can_detach?
155
+
156
+ a_button url: helpers.resource_detach_path(params[:resource_name], params[:id], params[:related_name], @resource.record.id),
157
+ style: :icon,
158
+ color: :gray,
159
+ icon: "detach",
160
+ form_class: "flex items-center",
161
+ title: control.title,
162
+ method: :delete,
163
+ params: hidden_params,
164
+ data: {
165
+ turbo_frame: params[:turbo_frame],
166
+ turbo_confirm: control.confirmation_message,
167
+ target: "control:detach",
168
+ control: :detach,
169
+ "resource-id": @resource.record.id,
170
+ "tippy": "tooltip",
171
+ }
172
+ end
173
+
174
+ def render_order_controls(control)
175
+ if can_reorder?
176
+ render AvoPro::Ordering::ButtonsComponent.new resource: @resource, reflection: @reflection, view_type: @view_type
177
+ end
178
+ end
179
+
180
+ def svg_classes
181
+ "text-gray-600 h-6 hover:text-gray-600"
182
+ end
183
+
184
+ def hidden_params
185
+ hidden = {}
186
+
187
+ hidden[:view_type] = params[:view_type] if params[:view_type]
188
+
189
+ if params[:turbo_frame]
190
+ hidden[:turbo_frame] = params[:turbo_frame]
191
+ hidden[:referrer] = referrer_path
192
+ end
193
+
194
+ hidden
195
+ end
86
196
  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
@@ -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 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
@@ -4,10 +4,13 @@
4
4
  <% end %>
5
5
  <% elsif item.is_panel? %>
6
6
  <%= render Avo::PanelComponent.new(name: item.name, description: item.description, index: index) do |c| %>
7
- <% c.with_body do %>
7
+ <% c.body do %>
8
8
  <div class="divide-y">
9
9
  <% item.visible_items.each_with_index do |field, index| %>
10
- <%= render Avo::ItemSwitcherComponent.new resource: @resource, item: field, index: index, view: @view, form: form %>
10
+ <%= render field
11
+ .hydrate(resource: @resource, record: @resource.record, user: resource.user, view: view)
12
+ .component_for_view(view)
13
+ .new(field: field, resource: @resource, index: index, form: form) %>
11
14
  <% end %>
12
15
  </div>
13
16
  <% end %>
@@ -16,12 +19,4 @@
16
19
  <%= render tab_group_component %>
17
20
  <% elsif item.is_field? %>
18
21
  <%= render field_component %>
19
- <% elsif item.is_row? %>
20
- <%= render Avo::RowComponent.new do |c| %>
21
- <% c.with_body do %>
22
- <% item.visible_items.each_with_index do |field, index| %>
23
- <%= render Avo::ItemSwitcherComponent.new resource: @resource, item: field, index: index, view: @view, form: form %>
24
- <% end %>
25
- <% end %>
26
- <% end %>
27
22
  <% end %>
@@ -38,11 +38,10 @@ 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)
46
- final_item.component_for_view(@view).new(field: final_item, resource: @resource, index: index, form: form)
45
+ item.component_for_view(@view).new(field: item.hydrate(resource: @resource, view: @view, record: @resource.record), resource: @resource, index: index, form: form)
47
46
  end
48
47
  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 overflow-hidden 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">
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,32 +24,29 @@
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">
28
- <div class="relative flex-1 w-full <% if sidebar? %> sm:w-2/3 <% end %>">
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
+ <div class="relative flex-1 <% if sidebar? %> w-2/3 <% else %> w-full <% 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 %>">
31
31
  <%= body %>
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
- <% if bare_sidebar? %>
40
- <div class="max-w-full sm:w-1/3 flex-shrink-0 h-full">
41
- <%= bare_sidebar %>
42
- </div>
43
- <% end %>
44
39
  </div>
45
40
  <% end %>
46
41
  <% if bare_content? %>
47
- <div class="relative">
42
+ <div data-target="panel-bare-content" class="relative">
48
43
  <%= bare_content %>
49
44
  </div>
50
45
  <% end %>
51
46
  <% 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">
47
+ <div
48
+ data-target="panel-footer-tools"
49
+ 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
50
  <%= footer_tools %>
54
51
  </div>
55
52
  <% end %>
@@ -10,7 +10,6 @@ class Avo::PanelComponent < ViewComponent::Base
10
10
  renders_one :tools
11
11
  renders_one :body
12
12
  renders_one :sidebar
13
- renders_one :bare_sidebar
14
13
  renders_one :bare_content
15
14
  renders_one :footer_tools
16
15
  renders_one :footer