avo 2.43.0 → 3.0.2

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

Potentially problematic release.


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

Files changed (414) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +30 -26
  3. data/Gemfile.lock +235 -161
  4. data/README.md +19 -27
  5. data/Rakefile +2 -0
  6. data/app/assets/stylesheets/avo.base.css +1 -1
  7. data/app/assets/svgs/font.svg +1 -0
  8. data/app/assets/svgs/triangle-up.svg +1 -0
  9. data/app/components/avo/actions_component.html.erb +19 -5
  10. data/app/components/avo/actions_component.rb +39 -19
  11. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  12. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  14. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  15. data/app/components/avo/base_component.rb +15 -12
  16. data/app/components/avo/button_component.rb +20 -3
  17. data/app/components/avo/empty_state_component.rb +1 -1
  18. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  19. data/app/components/avo/field_wrapper_component.rb +9 -15
  20. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  21. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +75 -79
  22. data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
  23. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  24. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  25. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  26. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  27. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  28. data/app/components/avo/fields/common/badge_viewer_component.rb +1 -1
  29. data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
  30. data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
  31. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  32. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
  33. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  34. data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
  35. data/app/components/avo/fields/common/heading_component.html.erb +3 -8
  36. data/app/components/avo/fields/common/heading_component.rb +1 -3
  37. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  38. data/app/components/avo/fields/common/key_value_component.rb +2 -2
  39. data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
  40. data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
  41. data/app/components/avo/fields/edit_component.rb +2 -2
  42. data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
  43. data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
  44. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  45. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  46. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  47. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  48. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  49. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
  51. data/app/components/avo/fields/index_component.rb +6 -6
  52. data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
  53. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  54. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  55. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  56. data/app/components/avo/fields/show_component.rb +5 -2
  57. data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
  58. data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
  59. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  60. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  61. data/app/components/avo/filters_component.html.erb +9 -3
  62. data/app/components/avo/filters_component.rb +4 -4
  63. data/app/components/avo/index/field_wrapper_component.rb +1 -13
  64. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  65. data/app/components/avo/index/grid_item_component.rb +43 -16
  66. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  67. data/app/components/avo/index/resource_controls_component.rb +125 -18
  68. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  69. data/app/components/avo/index/resource_grid_component.rb +5 -2
  70. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  71. data/app/components/avo/index/resource_map_component.rb +3 -3
  72. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  73. data/app/components/avo/index/resource_table_component.rb +24 -7
  74. data/app/components/avo/index/table_row_component.html.erb +9 -5
  75. data/app/components/avo/index/table_row_component.rb +3 -2
  76. data/app/components/avo/items/panel_component.html.erb +25 -0
  77. data/app/components/avo/items/panel_component.rb +43 -0
  78. data/app/components/avo/items/switcher_component.html.erb +17 -0
  79. data/app/components/avo/items/switcher_component.rb +79 -0
  80. data/app/components/avo/items/visible_items_component.html.erb +10 -0
  81. data/app/components/avo/items/visible_items_component.rb +11 -0
  82. data/app/components/avo/modal_component.html.erb +3 -4
  83. data/app/components/avo/paginator_component.html.erb +29 -40
  84. data/app/components/avo/paginator_component.rb +23 -5
  85. data/app/components/avo/panel_component.html.erb +7 -5
  86. data/app/components/avo/referrer_params_component.html.erb +1 -1
  87. data/app/components/avo/resource_component.rb +205 -26
  88. data/app/components/avo/resource_sidebar_component.html.erb +15 -18
  89. data/app/components/avo/resource_sidebar_component.rb +5 -3
  90. data/app/components/avo/sidebar/link_component.rb +1 -1
  91. data/app/components/avo/sidebar_component.html.erb +10 -3
  92. data/app/components/avo/sidebar_component.rb +5 -3
  93. data/app/components/avo/sidebar_profile_component.html.erb +18 -12
  94. data/app/components/avo/tab_group_component.html.erb +14 -8
  95. data/app/components/avo/tab_group_component.rb +1 -6
  96. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  97. data/app/components/avo/tab_switcher_component.rb +6 -41
  98. data/app/components/avo/views/resource_edit_component.html.erb +23 -84
  99. data/app/components/avo/views/resource_edit_component.rb +20 -19
  100. data/app/components/avo/views/resource_index_component.html.erb +42 -47
  101. data/app/components/avo/views/resource_index_component.rb +76 -13
  102. data/app/components/avo/views/resource_show_component.html.erb +16 -177
  103. data/app/components/avo/views/resource_show_component.rb +16 -10
  104. data/app/controllers/avo/actions_controller.rb +37 -41
  105. data/app/controllers/avo/application_controller.rb +119 -181
  106. data/app/controllers/avo/associations_controller.rb +34 -43
  107. data/app/controllers/avo/attachments_controller.rb +4 -4
  108. data/app/controllers/avo/base_controller.rb +145 -98
  109. data/app/controllers/avo/debug_controller.rb +17 -5
  110. data/app/controllers/avo/home_controller.rb +1 -1
  111. data/app/controllers/avo/search_controller.rb +56 -50
  112. data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
  113. data/app/helpers/avo/application_helper.rb +18 -8
  114. data/app/helpers/avo/resources_helper.rb +1 -1
  115. data/app/helpers/avo/url_helpers.rb +28 -12
  116. data/app/javascript/avo.base.js +1 -0
  117. data/app/javascript/js/application.js +3 -0
  118. data/app/javascript/js/controllers/action_controller.js +3 -1
  119. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  120. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
  121. data/app/javascript/js/controllers/filter_controller.js +1 -1
  122. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  123. data/app/javascript/js/controllers/preview_controller.js +24 -0
  124. data/app/javascript/js/controllers/search_controller.js +4 -2
  125. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  126. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  127. data/app/javascript/js/controllers.js +11 -5
  128. data/app/javascript/js/custom-stream-actions.js +15 -0
  129. data/app/views/avo/actions/show.html.erb +10 -7
  130. data/app/views/avo/associations/new.html.erb +2 -2
  131. data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
  132. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
  133. data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
  134. data/app/views/avo/base/edit.html.erb +1 -1
  135. data/app/views/avo/base/index.html.erb +4 -3
  136. data/app/views/avo/base/new.html.erb +2 -1
  137. data/app/views/avo/base/preview.html.erb +19 -0
  138. data/app/views/avo/base/show.html.erb +2 -2
  139. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  140. data/app/views/avo/debug/report.html.erb +32 -17
  141. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  142. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  143. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +1 -1
  144. data/app/views/avo/partials/_footer.html.erb +1 -1
  145. data/app/views/avo/partials/_javascript.html.erb +5 -0
  146. data/app/views/avo/partials/_logo.html.erb +1 -1
  147. data/app/views/avo/partials/_navbar.html.erb +3 -5
  148. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  149. data/app/views/avo/partials/_table_header.html.erb +5 -11
  150. data/app/views/layouts/avo/application.html.erb +5 -4
  151. data/avo.gemspec +11 -8
  152. data/bin/dev +3 -1
  153. data/bin/prod +0 -0
  154. data/config/i18n-tasks.yml +1 -1
  155. data/config/initializers/pagy.rb +2 -0
  156. data/config/master.key +1 -0
  157. data/config/routes.rb +7 -10
  158. data/db/factories.rb +6 -0
  159. data/lib/avo/asset_manager.rb +30 -0
  160. data/lib/avo/base_action.rb +84 -82
  161. data/lib/avo/base_resource.rb +286 -225
  162. data/lib/avo/base_resource_tool.rb +9 -16
  163. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  164. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  165. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  166. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  167. data/lib/avo/concerns/has_controls.rb +37 -0
  168. data/lib/avo/concerns/has_description.rb +23 -0
  169. data/lib/avo/concerns/has_helpers.rb +18 -0
  170. data/lib/avo/concerns/has_item_type.rb +42 -0
  171. data/lib/avo/concerns/has_items.rb +339 -0
  172. data/lib/avo/concerns/hydration.rb +17 -0
  173. data/lib/avo/concerns/is_resource_item.rb +16 -36
  174. data/lib/avo/concerns/is_visible.rb +15 -0
  175. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  176. data/lib/avo/concerns/pagination.rb +53 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  178. data/lib/avo/concerns/visible_items.rb +7 -38
  179. data/lib/avo/configuration/branding.rb +0 -12
  180. data/lib/avo/configuration.rb +28 -11
  181. data/lib/avo/current.rb +39 -0
  182. data/lib/avo/dsl/field_parser.rb +3 -3
  183. data/lib/avo/dynamic_router.rb +18 -3
  184. data/lib/avo/engine.rb +35 -30
  185. data/lib/avo/error_manager.rb +25 -0
  186. data/lib/avo/execution_context.rb +14 -15
  187. data/lib/avo/fields/base_field.rb +84 -115
  188. data/lib/avo/fields/belongs_to_field.rb +19 -23
  189. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  190. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  191. data/lib/avo/fields/concerns/has_default.rb +1 -5
  192. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  193. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  194. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  195. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  196. data/lib/avo/fields/concerns/is_required.rb +5 -7
  197. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  198. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  199. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  200. data/lib/avo/fields/country_field.rb +4 -0
  201. data/lib/avo/fields/date_time_field.rb +1 -5
  202. data/lib/avo/fields/external_image_field.rb +2 -2
  203. data/lib/avo/fields/field_manager.rb +55 -0
  204. data/lib/avo/fields/file_field.rb +2 -2
  205. data/lib/avo/fields/gravatar_field.rb +2 -2
  206. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  207. data/lib/avo/fields/has_base_field.rb +21 -17
  208. data/lib/avo/fields/has_many_field.rb +5 -2
  209. data/lib/avo/fields/has_one_field.rb +8 -12
  210. data/lib/avo/fields/heading_field.rb +9 -14
  211. data/lib/avo/fields/hidden_field.rb +1 -1
  212. data/lib/avo/fields/id_field.rb +3 -3
  213. data/lib/avo/fields/location_field.rb +10 -10
  214. data/lib/avo/fields/password_field.rb +1 -1
  215. data/lib/avo/fields/preview_field.rb +14 -0
  216. data/lib/avo/fields/select_field.rb +12 -8
  217. data/lib/avo/fields/status_field.rb +7 -1
  218. data/lib/avo/fields/text_field.rb +2 -2
  219. data/lib/avo/filters/base_filter.rb +9 -4
  220. data/lib/avo/html/builder.rb +8 -8
  221. data/lib/avo/item_grapher.rb +78 -0
  222. data/lib/avo/licensing/h_q.rb +11 -73
  223. data/lib/avo/licensing/license.rb +5 -1
  224. data/lib/avo/licensing/license_manager.rb +1 -1
  225. data/lib/avo/licensing/pro_license.rb +1 -7
  226. data/lib/avo/loaders/fields_loader.rb +7 -1
  227. data/lib/avo/plugin.rb +36 -0
  228. data/lib/avo/plugin_manager.rb +56 -0
  229. data/lib/avo/prefixed_test_helpers.rb +20 -0
  230. data/lib/avo/reloader.rb +3 -0
  231. data/lib/avo/resources/controls/actions_list.rb +7 -12
  232. data/lib/avo/resources/controls/attach_button.rb +15 -0
  233. data/lib/avo/resources/controls/back_button.rb +1 -1
  234. data/lib/avo/resources/controls/base_control.rb +15 -49
  235. data/lib/avo/resources/controls/create_button.rb +15 -0
  236. data/lib/avo/resources/controls/delete_button.rb +5 -1
  237. data/lib/avo/resources/controls/detach_button.rb +4 -1
  238. data/lib/avo/resources/controls/edit_button.rb +4 -1
  239. data/lib/avo/resources/controls/order_controls.rb +8 -0
  240. data/lib/avo/resources/controls/save_button.rb +13 -0
  241. data/lib/avo/resources/controls/show_button.rb +15 -0
  242. data/lib/avo/resources/items/holder.rb +96 -0
  243. data/lib/avo/resources/items/item_group.rb +44 -0
  244. data/lib/avo/resources/items/main_panel.rb +12 -0
  245. data/lib/avo/resources/items/panel.rb +2 -0
  246. data/lib/avo/resources/items/row.rb +42 -0
  247. data/lib/avo/resources/items/sidebar.rb +46 -0
  248. data/lib/avo/resources/items/tab.rb +54 -0
  249. data/lib/avo/resources/items/tab_group.rb +62 -0
  250. data/lib/avo/resources/resource_manager.rb +179 -0
  251. data/lib/avo/services/authorization_service.rb +11 -110
  252. data/lib/avo/services/debug_service.rb +93 -0
  253. data/lib/avo/services/encryption_service.rb +8 -12
  254. data/lib/avo/services/telemetry_service.rb +85 -0
  255. data/lib/avo/test_helpers.rb +362 -0
  256. data/lib/avo/tools/tool_manager.rb +30 -0
  257. data/lib/avo/version.rb +1 -1
  258. data/lib/avo/view_inquirer.rb +36 -0
  259. data/lib/avo.rb +109 -24
  260. data/lib/generators/avo/action_generator.rb +8 -8
  261. data/lib/generators/avo/card_generator.rb +27 -0
  262. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  263. data/lib/generators/avo/controller_generator.rb +3 -0
  264. data/lib/generators/avo/eject_generator.rb +180 -15
  265. data/lib/generators/avo/field_generator.rb +49 -2
  266. data/lib/generators/avo/filter_generator.rb +8 -8
  267. data/lib/generators/avo/js/install_generator.rb +2 -2
  268. data/lib/generators/avo/resource_generator.rb +12 -9
  269. data/lib/generators/avo/scope_generator.rb +15 -0
  270. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  271. data/lib/generators/avo/templates/action.tt +8 -6
  272. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  273. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  274. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  275. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  276. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  277. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  278. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  279. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  280. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  281. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  282. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  283. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  284. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  285. data/lib/generators/avo/templates/locales/avo.ar.yml +7 -6
  286. data/lib/generators/avo/templates/locales/avo.en.yml +6 -3
  287. data/lib/generators/avo/templates/locales/avo.es.yml +127 -0
  288. data/lib/generators/avo/templates/locales/avo.fr.yml +3 -0
  289. data/lib/generators/avo/templates/locales/avo.nb.yml +3 -0
  290. data/lib/generators/avo/templates/locales/avo.nn.yml +3 -0
  291. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +3 -0
  292. data/lib/generators/avo/templates/locales/avo.pt.yml +3 -0
  293. data/lib/generators/avo/templates/locales/avo.ro.yml +8 -5
  294. data/lib/generators/avo/templates/locales/avo.tr.yml +3 -0
  295. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  296. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  297. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  298. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  299. data/lib/generators/avo/templates/scope.tt +6 -0
  300. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  301. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  302. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  303. data/lib/tasks/avo_tasks.rake +72 -4
  304. data/public/avo-assets/avo.base.css +1893 -1187
  305. data/public/avo-assets/avo.base.js +223 -311
  306. data/public/avo-assets/avo.base.js.map +3 -3
  307. data/public/avo-assets/avo.css +9744 -0
  308. data/public/avo-assets/avo.js +513 -0
  309. data/public/avo-assets/avo.js.map +7 -0
  310. data/tailwind.custom.js +47 -0
  311. data/tailwind.preset.js +152 -0
  312. metadata +121 -116
  313. data/app/components/avo/card_component.html.erb +0 -46
  314. data/app/components/avo/card_component.rb +0 -25
  315. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  316. data/app/components/avo/dashboards/divider_component.rb +0 -19
  317. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  318. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  319. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  320. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  321. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  322. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  323. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  324. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  325. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  326. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  327. data/app/components/avo/index/ordering/base_component.rb +0 -9
  328. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  329. data/app/components/avo/index/ordering/button_component.rb +0 -23
  330. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  331. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  332. data/app/components/avo/item_switcher_component.html.erb +0 -27
  333. data/app/components/avo/item_switcher_component.rb +0 -48
  334. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  335. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  336. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  337. data/app/controllers/avo/dashboards_controller.rb +0 -22
  338. data/app/controllers/avo/reorder_controller.rb +0 -25
  339. data/app/controllers/avo/team_users_controller.rb +0 -4
  340. data/app/javascript/js/controllers/base_controller.js +0 -22
  341. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  342. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  343. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  344. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  345. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  346. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  347. data/app/views/avo/dashboards/show.html.erb +0 -38
  348. data/app/views/avo/partials/_global_search.html.erb +0 -19
  349. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  350. data/lib/avo/action_model.rb +0 -20
  351. data/lib/avo/app.rb +0 -237
  352. data/lib/avo/base_card.rb +0 -161
  353. data/lib/avo/concerns/fetches_things.rb +0 -150
  354. data/lib/avo/concerns/handles_field_args.rb +0 -47
  355. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  356. data/lib/avo/concerns/has_fields.rb +0 -334
  357. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  358. data/lib/avo/concerns/policy_helpers.rb +0 -31
  359. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  360. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  361. data/lib/avo/dashboards/base_divider.rb +0 -35
  362. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  363. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  364. data/lib/avo/dashboards/metric_card.rb +0 -9
  365. data/lib/avo/dashboards/partial_card.rb +0 -7
  366. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  367. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  368. data/lib/avo/fields/tags_field.rb +0 -102
  369. data/lib/avo/grid_collector.rb +0 -42
  370. data/lib/avo/hosts/association_scope_host.rb +0 -8
  371. data/lib/avo/hosts/base_host.rb +0 -25
  372. data/lib/avo/hosts/card_visibility.rb +0 -20
  373. data/lib/avo/hosts/dashboard_card.rb +0 -22
  374. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  375. data/lib/avo/hosts/ordering.rb +0 -22
  376. data/lib/avo/hosts/record_host.rb +0 -7
  377. data/lib/avo/hosts/resource_record_host.rb +0 -7
  378. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  379. data/lib/avo/hosts/search_scope_host.rb +0 -7
  380. data/lib/avo/hosts/view_record_host.rb +0 -7
  381. data/lib/avo/hosts/visibility_host.rb +0 -12
  382. data/lib/avo/items_holder.rb +0 -96
  383. data/lib/avo/main_panel.rb +0 -3
  384. data/lib/avo/menu/base_item.rb +0 -25
  385. data/lib/avo/menu/builder.rb +0 -82
  386. data/lib/avo/menu/dashboard.rb +0 -22
  387. data/lib/avo/menu/group.rb +0 -2
  388. data/lib/avo/menu/link.rb +0 -6
  389. data/lib/avo/menu/menu.rb +0 -2
  390. data/lib/avo/menu/resource.rb +0 -22
  391. data/lib/avo/menu/section.rb +0 -2
  392. data/lib/avo/panel.rb +0 -24
  393. data/lib/avo/panel_builder.rb +0 -25
  394. data/lib/avo/resources/controls/action.rb +0 -38
  395. data/lib/avo/resources/controls/execution_context.rb +0 -58
  396. data/lib/avo/resources/controls/items_holder.rb +0 -19
  397. data/lib/avo/resources/controls/link_to.rb +0 -27
  398. data/lib/avo/row.rb +0 -26
  399. data/lib/avo/row_builder.rb +0 -24
  400. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  401. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  402. data/lib/avo/sidebar.rb +0 -30
  403. data/lib/avo/sidebar_builder.rb +0 -24
  404. data/lib/avo/tab.rb +0 -72
  405. data/lib/avo/tab_builder.rb +0 -25
  406. data/lib/avo/tab_group.rb +0 -42
  407. data/lib/avo/tab_group_builder.rb +0 -43
  408. data/lib/avo/tools_manager.rb +0 -11
  409. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  410. data/lib/generators/avo/card/metric_generator.rb +0 -18
  411. data/lib/generators/avo/card/partial_generator.rb +0 -19
  412. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  413. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  414. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -1,12 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
4
- def initialize(resource: nil, reflection: nil, parent_model: nil, parent_resource: nil, view_type: :table)
4
+ include Avo::ApplicationHelper
5
+
6
+ def initialize(resource: nil, reflection: nil, parent_record: nil, parent_resource: nil, view_type: :table, actions: nil)
5
7
  @resource = resource
6
8
  @reflection = reflection
7
- @parent_model = parent_model
9
+ @parent_record = parent_record
8
10
  @parent_resource = parent_resource
9
11
  @view_type = view_type
12
+ @actions = actions
10
13
  end
11
14
 
12
15
  def can_detach?
@@ -20,7 +23,7 @@ class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
20
23
  end
21
24
 
22
25
  def can_view?
23
- return false if Avo.configuration.resource_default_view == :edit
26
+ return false if Avo.configuration.resource_default_view.edit?
24
27
 
25
28
  return authorize_association_for(:show) if @reflection.present?
26
29
 
@@ -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
- <%= t "avo.x_records_selected_from_a_total_of_x_html", selected: pagy.in, count: pagy.count %>
15
+ <%= selected_page_label %>
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
- <%= t "avo.x_records_selected_from_all_pages_html", count: pagy.count %>
26
+ <%= selected_all_label %>
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,22 +4,39 @@ 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
+ if Module.const_defined?("Ransack::Search") && query.instance_of?(Ransack::Search)
21
+ @query = @query.result
22
+ end
19
23
 
20
- Avo::Services::EncryptionService.encrypt(
21
- message: query.all.to_sql,
22
- purpose: :select_all
23
- )
24
+ Avo::Services::EncryptionService.encrypt(message: @query, purpose: :select_all, serializer: Marshal)
25
+ end
26
+
27
+ def selected_page_label
28
+ if @resource.pagination_type.countless?
29
+ t "avo.x_records_selected_from_page_html", selected: pagy.in
30
+ else
31
+ t "avo.x_records_selected_from_a_total_of_x_html", selected: pagy.in, count: pagy.count
32
+ end
33
+ end
34
+
35
+ def selected_all_label
36
+ if @resource.pagination_type.countless?
37
+ t "avo.records_selected_from_all_pages_html"
38
+ else
39
+ t "avo.x_records_selected_from_all_pages_html", count: pagy.count
40
+ end
24
41
  end
25
42
  end
@@ -1,28 +1,32 @@
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">
7
11
  <div class="flex justify-center h-full">
8
- <%== item_selector_input floating: false %>
12
+ <%= item_selector_input floating: false %>
9
13
  </div>
10
14
  </td>
11
15
  <% end %>
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
@@ -0,0 +1,25 @@
1
+ <%= render Avo::PanelComponent.new(**args) do |c| %>
2
+ <% if @is_main_panel %>
3
+ <% c.with_tools do %>
4
+ <% controls.each do |control| %>
5
+ <%= render_control control %>
6
+ <% end %>
7
+ <% end %>
8
+ <% end %>
9
+ <% c.with_body do %>
10
+ <% content_tag :div, class: "divide-y overflow-auto" do %>
11
+ <%= render Avo::Items::VisibleItemsComponent.new resource: @resource, item: @item, view: @view, form: @form %>
12
+ <% end %>
13
+ <% end %>
14
+ <% if sidebars.any? { |sidebar| sidebar.visible_items.any? } %>
15
+ <% c.with_sidebar do %>
16
+ <div class="justify-between space-y-4">
17
+ <% sidebars.each_with_index do |sidebar, index| %>
18
+ <div class="<%= helpers.white_panel_classes if sidebar.panel_wrapper? %>">
19
+ <%= render Avo::ResourceSidebarComponent.new resource: @resource, sidebar: sidebar, params: params, view: view, form: @form, index: index %>
20
+ </div>
21
+ <% end %>
22
+ </div>
23
+ <% end %>
24
+ <% end %>
25
+ <% end %>
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Avo::Items::PanelComponent < Avo::ResourceComponent
4
+ include Avo::ApplicationHelper
5
+
6
+ def initialize(form:, item:, is_main_panel:, resource:, view:, actions: nil, index: nil, parent_component: nil, parent_record: nil, parent_resource: nil, reflection: nil)
7
+ @actions = actions
8
+ @form = form
9
+ @index = index
10
+ @is_main_panel = is_main_panel
11
+ @item = item
12
+ @parent_component = parent_component
13
+ @parent_record = parent_record
14
+ @parent_resource = parent_resource
15
+ @reflection = reflection
16
+ @resource = resource
17
+ @view = view
18
+ end
19
+
20
+ delegate :controls,
21
+ :title,
22
+ :back_path,
23
+ :edit_path,
24
+ :can_see_the_destroy_button?,
25
+ :can_see_the_save_button?,
26
+ :view_for,
27
+ :display_breadcrumbs,
28
+ to: :@parent_component
29
+
30
+ def args
31
+ if @is_main_panel
32
+ {
33
+ name: title,
34
+ description: @resource.description,
35
+ display_breadcrumbs: display_breadcrumbs,
36
+ index: 0,
37
+ data: {panel_id: "main"}
38
+ }
39
+ else
40
+ {name: @item.name, description: @item.description, index: @index}
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ <% if item.is_panel? || item.is_main_panel? %>
2
+ <%= render panel_component %>
3
+ <% elsif item.is_tool? %>
4
+ <% if item&.partial.present? %>
5
+ <%= render item.partial, tool: item, form: @form %>
6
+ <% end %>
7
+ <% elsif item.is_tab_group? %>
8
+ <%= render tab_group_component %>
9
+ <% elsif item.is_field? %>
10
+ <%= render field_component %>
11
+ <% elsif item.is_row? %>
12
+ <%= render Avo::RowComponent.new do |c| %>
13
+ <% c.with_body do %>
14
+ <%= render Avo::Items::VisibleItemsComponent.new resource: @resource, item: @item, view: @view, form: @form %>
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Avo::Items::SwitcherComponent < Avo::BaseComponent
4
+ include Turbo::FramesHelper
5
+
6
+ attr_reader :resource
7
+ attr_reader :reflection
8
+ attr_reader :index
9
+ attr_reader :item
10
+ attr_reader :view
11
+
12
+ def initialize(
13
+ resource: nil,
14
+ reflection: nil,
15
+ item: nil,
16
+ index: nil,
17
+ view: nil,
18
+ form: nil,
19
+ parent_resource: nil,
20
+ parent_record: nil,
21
+ parent_component: nil,
22
+ actions: nil,
23
+ field_component_extra_args: {}
24
+ )
25
+ @resource = resource
26
+ @reflection = reflection
27
+ @form = form
28
+ @index = index
29
+ @item = item
30
+ @view = view
31
+ @parent_resource = parent_resource
32
+ @parent_record = parent_record
33
+ @parent_component = parent_component
34
+ @actions = actions
35
+ @field_component_extra_args = field_component_extra_args
36
+ end
37
+
38
+ def form
39
+ @form || nil
40
+ end
41
+
42
+ def render?
43
+ # Stops rendering if the field should be hidden in reflections
44
+ if item.is_field?
45
+ return false if in_reflection? && item.hidden_in_reflection?
46
+ end
47
+
48
+ true
49
+ end
50
+
51
+ def in_reflection?
52
+ @reflection.present?
53
+ end
54
+
55
+ def tab_group_component
56
+ Avo::TabGroupComponent.new resource: @resource, group: item.hydrate(view: view), index: index, params: params, form: form, view: view
57
+ end
58
+
59
+ def field_component
60
+ final_item = item.dup.hydrate(resource: @resource, record: @resource.record, user: resource.user, view: view)
61
+ final_item.component_for_view(@view).new(field: final_item, resource: @resource, index: index, form: form, **@field_component_extra_args)
62
+ end
63
+
64
+ def panel_component
65
+ Avo::Items::PanelComponent.new(
66
+ actions: @actions,
67
+ form: form,
68
+ index: index,
69
+ is_main_panel: item.is_main_panel?,
70
+ item: item.hydrate(view: view),
71
+ parent_component: @parent_component,
72
+ parent_record: @parent_record,
73
+ parent_resource: @parent_resource,
74
+ reflection: @reflection,
75
+ resource: @resource,
76
+ view: view
77
+ )
78
+ end
79
+ end
@@ -0,0 +1,10 @@
1
+ <% @item.visible_items.each_with_index do |field, index| %>
2
+ <%= render Avo::Items::SwitcherComponent.new(
3
+ resource: @resource,
4
+ item: field,
5
+ index: index,
6
+ view: @view,
7
+ form: @form,
8
+ field_component_extra_args: @field_component_extra_args,
9
+ )%>
10
+ <% end %>
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Avo::Items::VisibleItemsComponent < ViewComponent::Base
4
+ def initialize(resource:, item:, view:, form:, field_component_extra_args: {})
5
+ @resource = resource
6
+ @item = item
7
+ @view = view
8
+ @form = form
9
+ @field_component_extra_args = field_component_extra_args
10
+ end
11
+ end
@@ -3,17 +3,16 @@
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 bg-white flex z-50 relative shadow-modal overflow-auto <%= width_classes %> <%= height_classes %>">
7
7
  <div class="flex-1 flex flex-col justify-between">
8
8
  <div>
9
9
  <% if heading? %>
10
- <div class="p-6 text-2xl tracking-normal font-semibold text-black">
10
+ <div class="p-6 pb-0 text-2xl tracking-normal font-semibold text-black">
11
11
  <%= heading %>
12
12
  </div>
13
13
  <% end %>
14
-
15
14
  <% if content? %>
16
- <div class="px-6 text-base text-gray-500 <%= body_class %>">
15
+ <div class="p-6 text-base text-gray-500">
17
16
  <%= content %>
18
17
  </div>
19
18
  <% end %>