avo 2.49.0 → 3.0.0.beta1

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

Potentially problematic release.


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

Files changed (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +15 -26
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
  40. data/app/components/avo/fields/index_component.rb +5 -5
  41. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  42. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  43. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  44. data/app/components/avo/fields/show_component.rb +4 -1
  45. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  46. data/app/components/avo/filters_component.html.erb +9 -3
  47. data/app/components/avo/filters_component.rb +4 -4
  48. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  49. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  50. data/app/components/avo/index/grid_item_component.rb +43 -16
  51. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  52. data/app/components/avo/index/resource_controls_component.rb +124 -17
  53. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  54. data/app/components/avo/index/resource_grid_component.rb +5 -2
  55. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  56. data/app/components/avo/index/resource_map_component.rb +3 -3
  57. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  58. data/app/components/avo/index/resource_table_component.rb +14 -20
  59. data/app/components/avo/index/table_row_component.html.erb +8 -4
  60. data/app/components/avo/index/table_row_component.rb +3 -2
  61. data/app/components/avo/item_switcher_component.rb +2 -2
  62. data/app/components/avo/modal_component.html.erb +7 -12
  63. data/app/components/avo/modal_component.rb +0 -21
  64. data/app/components/avo/paginator_component.html.erb +40 -29
  65. data/app/components/avo/paginator_component.rb +5 -23
  66. data/app/components/avo/panel_component.html.erb +8 -6
  67. data/app/components/avo/referrer_params_component.html.erb +1 -2
  68. data/app/components/avo/resource_component.rb +189 -14
  69. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  70. data/app/components/avo/resource_sidebar_component.rb +1 -1
  71. data/app/components/avo/sidebar/link_component.rb +1 -1
  72. data/app/components/avo/sidebar_component.html.erb +10 -3
  73. data/app/components/avo/sidebar_component.rb +5 -3
  74. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  75. data/app/components/avo/tab_group_component.html.erb +13 -7
  76. data/app/components/avo/tab_group_component.rb +1 -6
  77. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  78. data/app/components/avo/tab_switcher_component.rb +4 -39
  79. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  80. data/app/components/avo/views/resource_edit_component.rb +7 -18
  81. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  82. data/app/components/avo/views/resource_index_component.rb +62 -12
  83. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  84. data/app/components/avo/views/resource_show_component.rb +6 -11
  85. data/app/controllers/avo/actions_controller.rb +27 -24
  86. data/app/controllers/avo/application_controller.rb +105 -151
  87. data/app/controllers/avo/associations_controller.rb +34 -43
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +102 -102
  90. data/app/controllers/avo/debug_controller.rb +17 -5
  91. data/app/controllers/avo/home_controller.rb +1 -1
  92. data/app/controllers/avo/search_controller.rb +30 -51
  93. data/app/controllers/avo/team_users_controller.rb +4 -0
  94. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  95. data/app/helpers/avo/application_helper.rb +15 -9
  96. data/app/helpers/avo/resources_helper.rb +1 -1
  97. data/app/helpers/avo/url_helpers.rb +27 -11
  98. data/app/javascript/avo.base.js +1 -0
  99. data/app/javascript/js/application.js +0 -3
  100. data/app/javascript/js/controllers/action_controller.js +5 -3
  101. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  102. data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
  103. data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
  104. data/app/javascript/js/controllers/filter_controller.js +1 -1
  105. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  106. data/app/javascript/js/controllers/preview_controller.js +24 -0
  107. data/app/javascript/js/controllers/search_controller.js +2 -2
  108. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  109. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  110. data/app/javascript/js/controllers.js +10 -6
  111. data/app/javascript/js/custom-stream-actions.js +15 -0
  112. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  113. data/app/views/avo/actions/show.html.erb +10 -7
  114. data/app/views/avo/associations/new.html.erb +2 -2
  115. data/app/views/avo/base/index.html.erb +3 -2
  116. data/app/views/avo/base/new.html.erb +2 -1
  117. data/app/views/avo/base/preview.html.erb +19 -0
  118. data/app/views/avo/base/show.html.erb +1 -1
  119. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  120. data/app/views/avo/debug/report.html.erb +32 -17
  121. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  122. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  123. data/app/views/avo/partials/_footer.html.erb +1 -1
  124. data/app/views/avo/partials/_javascript.html.erb +5 -0
  125. data/app/views/avo/partials/_logo.html.erb +1 -1
  126. data/app/views/avo/partials/_navbar.html.erb +3 -5
  127. data/app/views/avo/partials/_table_header.html.erb +5 -11
  128. data/app/views/layouts/avo/application.html.erb +4 -2
  129. data/avo.gemspec +11 -12
  130. data/bin/dev +1 -1
  131. data/bin/prod +0 -0
  132. data/config/i18n-tasks.yml +1 -1
  133. data/config/initializers/pagy.rb +0 -2
  134. data/config/master.key +1 -0
  135. data/config/routes.rb +6 -10
  136. data/db/factories.rb +7 -1
  137. data/lib/avo/action_model.rb +20 -0
  138. data/lib/avo/asset_manager.rb +30 -0
  139. data/lib/avo/base_action.rb +57 -42
  140. data/lib/avo/base_resource.rb +264 -227
  141. data/lib/avo/base_resource_tool.rb +9 -16
  142. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  143. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  144. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  145. data/lib/avo/concerns/has_controls.rb +37 -0
  146. data/lib/avo/concerns/has_description.rb +23 -0
  147. data/lib/avo/concerns/has_item_type.rb +42 -0
  148. data/lib/avo/concerns/has_items.rb +325 -0
  149. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  150. data/lib/avo/concerns/is_resource_item.rb +24 -36
  151. data/lib/avo/concerns/is_visible.rb +15 -0
  152. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  153. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  154. data/lib/avo/configuration/branding.rb +0 -12
  155. data/lib/avo/configuration.rb +1 -37
  156. data/lib/avo/current.rb +39 -0
  157. data/lib/avo/dsl/field_parser.rb +1 -1
  158. data/lib/avo/dynamic_router.rb +18 -3
  159. data/lib/avo/engine.rb +35 -30
  160. data/lib/avo/error_manager.rb +25 -0
  161. data/lib/avo/execution_context.rb +10 -14
  162. data/lib/avo/fields/badge_field.rb +1 -1
  163. data/lib/avo/fields/base_field.rb +91 -106
  164. data/lib/avo/fields/belongs_to_field.rb +18 -22
  165. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  166. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  167. data/lib/avo/fields/concerns/has_default.rb +1 -5
  168. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  169. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  170. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  171. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  172. data/lib/avo/fields/concerns/is_required.rb +5 -7
  173. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  174. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  175. data/lib/avo/fields/country_field.rb +4 -0
  176. data/lib/avo/fields/date_time_field.rb +3 -14
  177. data/lib/avo/fields/field_manager.rb +55 -0
  178. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  179. data/lib/avo/fields/has_base_field.rb +12 -15
  180. data/lib/avo/fields/has_many_field.rb +5 -2
  181. data/lib/avo/fields/has_one_field.rb +6 -10
  182. data/lib/avo/fields/heading_field.rb +4 -1
  183. data/lib/avo/fields/hidden_field.rb +1 -1
  184. data/lib/avo/fields/id_field.rb +1 -1
  185. data/lib/avo/fields/location_field.rb +8 -8
  186. data/lib/avo/fields/password_field.rb +1 -1
  187. data/lib/avo/fields/preview_field.rb +14 -0
  188. data/lib/avo/fields/select_field.rb +12 -8
  189. data/lib/avo/fields/status_field.rb +4 -0
  190. data/lib/avo/filters/base_filter.rb +8 -4
  191. data/lib/avo/html/builder.rb +7 -8
  192. data/lib/avo/item_grapher.rb +78 -0
  193. data/lib/avo/licensing/h_q.rb +8 -67
  194. data/lib/avo/licensing/license.rb +1 -1
  195. data/lib/avo/licensing/pro_license.rb +1 -7
  196. data/lib/avo/loaders/fields_loader.rb +7 -1
  197. data/lib/avo/plugin.rb +16 -0
  198. data/lib/avo/plugin_manager.rb +56 -0
  199. data/lib/avo/prefixed_test_helpers.rb +20 -0
  200. data/lib/avo/reloader.rb +3 -0
  201. data/lib/avo/resources/controls/actions_list.rb +7 -12
  202. data/lib/avo/resources/controls/attach_button.rb +15 -0
  203. data/lib/avo/resources/controls/back_button.rb +1 -1
  204. data/lib/avo/resources/controls/base_control.rb +15 -49
  205. data/lib/avo/resources/controls/create_button.rb +15 -0
  206. data/lib/avo/resources/controls/delete_button.rb +5 -1
  207. data/lib/avo/resources/controls/detach_button.rb +4 -1
  208. data/lib/avo/resources/controls/edit_button.rb +4 -1
  209. data/lib/avo/resources/controls/order_controls.rb +8 -0
  210. data/lib/avo/resources/controls/save_button.rb +13 -0
  211. data/lib/avo/resources/controls/show_button.rb +15 -0
  212. data/lib/avo/resources/items/holder.rb +84 -0
  213. data/lib/avo/resources/items/item_group.rb +49 -0
  214. data/lib/avo/resources/items/main_panel.rb +2 -0
  215. data/lib/avo/resources/items/panel.rb +2 -0
  216. data/lib/avo/resources/items/row.rb +54 -0
  217. data/lib/avo/resources/items/sidebar.rb +47 -0
  218. data/lib/avo/resources/items/tab.rb +60 -0
  219. data/lib/avo/resources/items/tab_group.rb +68 -0
  220. data/lib/avo/resources/resource_manager.rb +174 -0
  221. data/lib/avo/services/authorization_service.rb +11 -110
  222. data/lib/avo/services/debug_service.rb +93 -0
  223. data/lib/avo/services/encryption_service.rb +5 -1
  224. data/lib/avo/services/telemetry_service.rb +85 -0
  225. data/lib/avo/test_helpers.rb +362 -0
  226. data/lib/avo/tools/tool_manager.rb +30 -0
  227. data/lib/avo/version.rb +1 -1
  228. data/lib/avo.rb +115 -24
  229. data/lib/generators/avo/action_generator.rb +8 -8
  230. data/lib/generators/avo/card_generator.rb +27 -0
  231. data/lib/generators/avo/filter_generator.rb +8 -8
  232. data/lib/generators/avo/resource_generator.rb +4 -4
  233. data/lib/generators/avo/scope_generator.rb +15 -0
  234. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  235. data/lib/generators/avo/templates/action.tt +8 -6
  236. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  237. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  238. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  239. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  240. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  241. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  242. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  243. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  244. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  245. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  246. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  247. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  248. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  249. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  250. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  251. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  252. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  253. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  254. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  255. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  256. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  257. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  258. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  259. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  260. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  261. data/lib/generators/avo/templates/scope.tt +6 -0
  262. data/lib/generators/avo/templates/tool/view.tt +2 -2
  263. data/lib/tasks/avo_tasks.rake +27 -0
  264. data/public/avo-assets/avo.base.css +1810 -1189
  265. data/public/avo-assets/avo.base.js +217 -307
  266. data/public/avo-assets/avo.base.js.map +3 -3
  267. data/public/avo-assets/avo.css +9744 -0
  268. data/public/avo-assets/avo.js +513 -0
  269. data/public/avo-assets/avo.js.map +7 -0
  270. metadata +102 -146
  271. data/app/assets/stylesheets/css/tags.css +0 -32
  272. data/app/components/avo/card_component.html.erb +0 -46
  273. data/app/components/avo/card_component.rb +0 -25
  274. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  275. data/app/components/avo/dashboards/divider_component.rb +0 -19
  276. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  277. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  278. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  279. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  280. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  281. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  282. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  283. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  284. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  285. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  286. data/app/components/avo/index/ordering/base_component.rb +0 -9
  287. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  288. data/app/components/avo/index/ordering/button_component.rb +0 -23
  289. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  290. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  291. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  292. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  293. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  294. data/app/controllers/avo/dashboards_controller.rb +0 -22
  295. data/app/controllers/avo/reorder_controller.rb +0 -25
  296. data/app/javascript/js/controllers/base_controller.js +0 -22
  297. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  298. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  299. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  300. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  301. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  302. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  303. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  304. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  305. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  306. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  307. data/app/views/avo/dashboards/show.html.erb +0 -38
  308. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  309. data/app/views/avo/partials/_global_search.html.erb +0 -19
  310. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  311. data/lib/avo/app.rb +0 -237
  312. data/lib/avo/base_card.rb +0 -161
  313. data/lib/avo/concerns/fetches_things.rb +0 -150
  314. data/lib/avo/concerns/handles_field_args.rb +0 -47
  315. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  316. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  317. data/lib/avo/concerns/has_fields.rb +0 -334
  318. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  319. data/lib/avo/concerns/pagination.rb +0 -53
  320. data/lib/avo/concerns/policy_helpers.rb +0 -31
  321. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  322. data/lib/avo/concerns/visible_items.rb +0 -51
  323. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  324. data/lib/avo/dashboards/base_divider.rb +0 -35
  325. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  326. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  327. data/lib/avo/dashboards/metric_card.rb +0 -9
  328. data/lib/avo/dashboards/partial_card.rb +0 -7
  329. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  330. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  331. data/lib/avo/fields/tags_field.rb +0 -102
  332. data/lib/avo/grid_collector.rb +0 -42
  333. data/lib/avo/hosts/association_scope_host.rb +0 -8
  334. data/lib/avo/hosts/base_host.rb +0 -25
  335. data/lib/avo/hosts/card_visibility.rb +0 -20
  336. data/lib/avo/hosts/dashboard_card.rb +0 -22
  337. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  338. data/lib/avo/hosts/ordering.rb +0 -22
  339. data/lib/avo/hosts/record_host.rb +0 -7
  340. data/lib/avo/hosts/resource_record_host.rb +0 -7
  341. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  342. data/lib/avo/hosts/search_scope_host.rb +0 -7
  343. data/lib/avo/hosts/view_record_host.rb +0 -7
  344. data/lib/avo/hosts/visibility_host.rb +0 -12
  345. data/lib/avo/items_holder.rb +0 -96
  346. data/lib/avo/main_panel.rb +0 -3
  347. data/lib/avo/menu/base_item.rb +0 -25
  348. data/lib/avo/menu/builder.rb +0 -82
  349. data/lib/avo/menu/dashboard.rb +0 -22
  350. data/lib/avo/menu/group.rb +0 -2
  351. data/lib/avo/menu/link.rb +0 -6
  352. data/lib/avo/menu/menu.rb +0 -2
  353. data/lib/avo/menu/resource.rb +0 -22
  354. data/lib/avo/menu/section.rb +0 -2
  355. data/lib/avo/panel.rb +0 -24
  356. data/lib/avo/panel_builder.rb +0 -25
  357. data/lib/avo/resources/controls/action.rb +0 -38
  358. data/lib/avo/resources/controls/execution_context.rb +0 -58
  359. data/lib/avo/resources/controls/items_holder.rb +0 -19
  360. data/lib/avo/resources/controls/link_to.rb +0 -27
  361. data/lib/avo/row.rb +0 -26
  362. data/lib/avo/row_builder.rb +0 -24
  363. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  364. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  365. data/lib/avo/sidebar.rb +0 -30
  366. data/lib/avo/sidebar_builder.rb +0 -24
  367. data/lib/avo/tab.rb +0 -72
  368. data/lib/avo/tab_builder.rb +0 -25
  369. data/lib/avo/tab_group.rb +0 -42
  370. data/lib/avo/tab_group_builder.rb +0 -43
  371. data/lib/avo/tools_manager.rb +0 -11
  372. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  373. data/lib/generators/avo/card/metric_generator.rb +0 -18
  374. data/lib/generators/avo/card/partial_generator.rb +0 -19
  375. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  376. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  377. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -1,12 +1,7 @@
1
1
  module Avo
2
2
  module ApplicationHelper
3
3
  include ::Pagy::Frontend
4
-
5
- def render_license_warnings
6
- render partial: "avo/sidebar/license_warnings", locals: {
7
- license: Avo::App.license.properties
8
- }
9
- end
4
+ include Avo::ResourcesHelper
10
5
 
11
6
  def render_license_warning(title: "", message: "", icon: "exclamation")
12
7
  render partial: "avo/sidebar/license_warning", locals: {
@@ -119,8 +114,19 @@ module Avo
119
114
  Avo::Filters::BaseFilter.encode_filters(filter_params)
120
115
  end
121
116
 
122
- def frame_id(resource)
123
- ["frame", resource.model_name.singular, resource.model.id].compact.join("-")
117
+ def number_to_social(number, start_at: 10_000)
118
+ return number_with_delimiter(number) if number < start_at
119
+
120
+ number_to_human(number,
121
+ precision: 1,
122
+ significant: false,
123
+ round_mode: :down,
124
+ format: "%n%u",
125
+ units: {
126
+ thousand: "K",
127
+ million: "M",
128
+ billion: "B"
129
+ })
124
130
  end
125
131
 
126
132
  private
@@ -144,7 +150,7 @@ module Avo
144
150
  field = field_klass.new id, form: form, view: view, **args, &block
145
151
 
146
152
  # Add the form record to the field so all fields have access to it.
147
- field.hydrate(model: form.object) if form.present?
153
+ field.hydrate(record: form.object) if form.present?
148
154
 
149
155
  render field.component_for_view(view).new field: field, form: form, **component_options
150
156
  end
@@ -38,7 +38,7 @@ module Avo
38
38
  end
39
39
 
40
40
  def item_selector_init(resource)
41
- "data-resource-name='#{resource.model_key}' data-resource-id='#{resource.model.id}' data-controller='item-selector'"
41
+ "data-resource-name='#{resource.model_key}' data-resource-id='#{resource.record.id}' data-controller='item-selector'"
42
42
  end
43
43
 
44
44
  def item_selector_input(floating: false, size: :md)
@@ -20,14 +20,14 @@ module Avo
20
20
  end
21
21
 
22
22
  def resource_path(
23
- model:,
23
+ record:,
24
24
  resource:,
25
25
  resource_id: nil,
26
26
  keep_query_params: false,
27
27
  **args
28
28
  )
29
- if model.respond_to? :id
30
- id = model
29
+ if record.respond_to? :id
30
+ id = record
31
31
  elsif resource_id.present?
32
32
  id = resource_id
33
33
  end
@@ -35,29 +35,45 @@ module Avo
35
35
  avo.send :"resources_#{resource.singular_route_key}_path", id, **args
36
36
  end
37
37
 
38
+ def preview_resource_path(
39
+ record:,
40
+ resource:,
41
+ resource_id: nil,
42
+ keep_query_params: false,
43
+ **args
44
+ )
45
+ if record.respond_to? resource.id_attribute
46
+ id = record
47
+ elsif resource_id.present?
48
+ id = resource_id
49
+ end
50
+
51
+ avo.send :"preview_resources_#{resource.singular_route_key}_path", id, **args
52
+ end
53
+
38
54
  def new_resource_path(resource:, **args)
39
55
  avo.send :"new_resources_#{resource.singular_route_key}_path", **args
40
56
  end
41
57
 
42
- def edit_resource_path(model:, resource:, **args)
43
- avo.send :"edit_resources_#{resource.singular_route_key}_path", model, **args
58
+ def edit_resource_path(record:, resource:, **args)
59
+ avo.send :"edit_resources_#{resource.singular_route_key}_path", record, **args
44
60
  end
45
61
 
46
- def resource_attach_path(resource, model_id, related_name, related_id = nil)
47
- helpers.avo.resources_associations_new_path(resource.singular_route_key, model_id, related_name)
62
+ def resource_attach_path(resource, record_id, related_name, related_id = nil)
63
+ helpers.avo.resources_associations_new_path(resource.singular_route_key, record_id, related_name)
48
64
  end
49
65
 
50
66
  def resource_detach_path(
51
67
  model_name, # teams
52
- model_id, # 1
68
+ record_id, # 1
53
69
  related_name, # admin
54
70
  related_id = nil
55
71
  )
56
- avo.resources_associations_destroy_path(model_name, model_id, related_name, related_id)
72
+ avo.resources_associations_destroy_path(model_name, record_id, related_name, related_id)
57
73
  end
58
74
 
59
75
  def related_resources_path(
60
- parent_model,
76
+ parent_record,
61
77
  record,
62
78
  keep_query_params: false,
63
79
  **args
@@ -74,7 +90,7 @@ module Avo
74
90
  rescue
75
91
  end
76
92
 
77
- avo.resources_associations_index_path(parent_model.model_name.route_key, record.id, **existing_params, **args)
93
+ avo.resources_associations_index_path(parent_record.model_name.route_key, record.id, **existing_params, **args)
78
94
  end
79
95
 
80
96
  def resource_view_path(**args)
@@ -12,6 +12,7 @@ import 'chartkick/chart.js/chart.esm'
12
12
 
13
13
  import './js/active-storage'
14
14
  import './js/controllers'
15
+ import './js/custom-stream-actions'
15
16
 
16
17
  Rails.start()
17
18
 
@@ -2,9 +2,6 @@ import 'mapkick/bundle'
2
2
 
3
3
  import { Alert, Popover } from 'tailwindcss-stimulus-components'
4
4
  import { Application } from '@hotwired/stimulus'
5
- import TurboPower from 'turbo_power'
6
-
7
- TurboPower.initialize(Turbo.StreamActions)
8
5
 
9
6
  const application = Application.start()
10
7
 
@@ -2,10 +2,12 @@ import { Controller } from '@hotwired/stimulus'
2
2
  import { castBoolean } from '../helpers/cast_boolean'
3
3
 
4
4
  export default class extends Controller {
5
- static targets = ['controllerDiv', 'resourceIds', 'submit', 'selectedAllQuery']
5
+ static targets = ['controllerDiv', 'resourceIds', 'form', 'selectedAllQuery']
6
6
 
7
7
  connect() {
8
- this.resourceIdsTarget.value = this.resourceIds
8
+ if (this.resourceIdsTarget.value === '') {
9
+ this.resourceIdsTarget.value = this.resourceIds
10
+ }
9
11
 
10
12
  // This value is picked up from the DOM so we check true/false as strings
11
13
  if (this.selectionOptions.itemSelectAllSelectedAllValue === 'true') {
@@ -13,7 +15,7 @@ export default class extends Controller {
13
15
  }
14
16
 
15
17
  if (this.noConfirmation) {
16
- this.submitTarget.click()
18
+ this.formTarget.submit()
17
19
  } else {
18
20
  this.controllerDivTarget.classList.remove('hidden')
19
21
  }
@@ -0,0 +1,62 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ export default class extends Controller {
4
+ static targets = ['content']
5
+
6
+ static values = {
7
+ panelList: Boolean,
8
+ }
9
+
10
+ // get the table or grid component, if both null, get the panel body (for show page for example)
11
+ get parentTarget() {
12
+ return document.querySelector('[data-component-name="avo/index/resource_table_component"]')
13
+ || document.querySelector('[data-component-name="avo/index/resource_grid_component"]')
14
+ || document.querySelector('[data-target="panel-body"]')
15
+ }
16
+
17
+ childDimensions = null
18
+
19
+ parentDimensions = null
20
+
21
+ connect() {
22
+ // We need to make the element visible in order to get it's position
23
+ this.element.style.display = 'block'
24
+ this.childDimensions = this.contentTarget.getBoundingClientRect()
25
+ this.element.style.display = ''
26
+ this.parentDimensions = this.parentTarget.getBoundingClientRect()
27
+
28
+ this.adjustOverflow()
29
+ }
30
+
31
+ adjustOverflow() {
32
+ this.adjustVerticalOverflow()
33
+ this.adjustHorizontalOverflow()
34
+ }
35
+
36
+ adjustVerticalOverflow() {
37
+ if (this.contentBottomOverflow) {
38
+ this.contentTarget.classList.remove('top-full', 'mt-2')
39
+ this.contentTarget.classList.add('bottom-full', 'mb-2')
40
+ }
41
+ }
42
+
43
+ adjustHorizontalOverflow() {
44
+ if (this.contentLeftOverflow) {
45
+ this.contentTarget.classList.remove('xl:right-0', 'sm:right-0')
46
+ this.contentTarget.classList.add('xl:left-0', 'sm:left-0')
47
+ }
48
+ }
49
+
50
+ get contentBottomOverflow() {
51
+ // If the list is on panel header, we don't want to adjust the vertical overflow
52
+ if (this.panelListValue === true) {
53
+ return false
54
+ }
55
+
56
+ return this.parentDimensions.bottom < this.childDimensions.bottom
57
+ }
58
+
59
+ get contentLeftOverflow() {
60
+ return this.parentDimensions.left > this.childDimensions.left
61
+ }
62
+ }
@@ -204,22 +204,18 @@ export default class extends Controller {
204
204
  return
205
205
  }
206
206
 
207
- const timezonedDate = DateTime.fromISO(selectedDates[0].toISOString())
208
- .setZone(this.displayTimezone, { keepLocalTime: true })
209
- .setZone('UTC', { keepLocalTime: !this.relativeValue })
210
-
211
207
  let value
212
208
  switch (this.fieldTypeValue) {
213
209
  case 'time':
214
210
  // For time values, we should maintain the real value and format it to a time-friendly format.
215
- value = timezonedDate.toFormat(RAW_TIME_FORMAT)
211
+ value = DateTime.fromISO(selectedDates[0].toISOString()).setZone('UTC', { keepLocalTime: !this.relativeValue }).toFormat(RAW_TIME_FORMAT)
216
212
  break
217
213
  case 'date':
218
- value = timezonedDate.toFormat(RAW_DATE_FORMAT)
214
+ value = DateTime.fromISO(selectedDates[0].toISOString()).setZone('UTC', { keepLocalTime: true }).toFormat(RAW_DATE_FORMAT)
219
215
  break
220
216
  default:
221
217
  case 'dateTime':
222
- value = timezonedDate.toISO()
218
+ value = DateTime.fromISO(selectedDates[0].toISOString()).setZone('UTC', { keepLocalTime: !this.relativeValue }).toISO()
223
219
  break
224
220
  }
225
221
 
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable max-len */
2
- import * as DOMPurify from 'dompurify'
3
2
  import { Controller } from '@hotwired/stimulus'
4
3
  import { castBoolean } from '../../helpers/cast_boolean'
5
4
 
@@ -81,7 +80,7 @@ export default class extends Controller {
81
80
  let index = 0
82
81
  this.fieldValue.forEach((row) => {
83
82
  const [key, value] = row
84
- result += this.interpolatedRow(DOMPurify.sanitize(key), DOMPurify.sanitize(value), index)
83
+ result += this.interpolatedRow(key, value, index)
85
84
  index++
86
85
  })
87
86
  this.rowsTarget.innerHTML = result
@@ -98,7 +98,7 @@ export default class extends Controller {
98
98
 
99
99
  url.query(query)
100
100
 
101
- this.urlRedirectTarget.href = url
101
+ this.urlRedirectTarget.href = url.readable().toString()
102
102
  this.urlRedirectTarget.click()
103
103
  }
104
104
  }
@@ -0,0 +1,12 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ export default class extends Controller {
4
+ static targets = ['element'];
5
+
6
+ focus({ params }) {
7
+ const element = this.context.element.querySelector(params.selector)
8
+ if (this.element) {
9
+ element.focus()
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,24 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+ import tippy from 'tippy.js'
3
+
4
+ export default class extends Controller {
5
+ static values = {
6
+ url: String,
7
+ }
8
+
9
+ connect() {
10
+ const vm = this;
11
+
12
+ tippy(vm.context.element, {
13
+ content: "loading...",
14
+ allowHTML: true,
15
+ theme: 'light',
16
+ maxWidth: 550,
17
+ async onShow(instance) {
18
+ const response = await fetch(vm.urlValue)
19
+ const content = await response.text()
20
+ instance.setContent(content)
21
+ },
22
+ })
23
+ }
24
+ }
@@ -212,8 +212,8 @@ export default class extends Controller {
212
212
  const url = URI()
213
213
 
214
214
  return url.segment([window.Avo.configuration.root_path, ...this.searchSegments()])
215
- .search(this.searchParams(encodeURIComponent(query)))
216
- .readable().toString()
215
+ .search(this.searchParams(encodeURIComponent(query)))
216
+ .readable().toString()
217
217
  }
218
218
 
219
219
  searchSegments() {
@@ -0,0 +1,7 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ export default class extends Controller {
4
+ destroy() {
5
+ this.context.element.remove()
6
+ }
7
+ }
@@ -0,0 +1,48 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+ import { leave, toggle } from 'el-transition'
3
+ import { useClickOutside } from 'stimulus-use'
4
+
5
+ export default class extends Controller {
6
+ static targets = ['panel']
7
+
8
+ static values = {
9
+ // One may want to have an element that is exempt from triggerring the click outside event
10
+ exemptionContainer: String,
11
+ }
12
+
13
+ get exemptionContainerTarget() {
14
+ return document.querySelector(this.exemptionContainerValue)
15
+ }
16
+
17
+ connect() {
18
+ useClickOutside(this)
19
+ }
20
+
21
+ clickOutside(e) {
22
+ if (this.hasPanelTarget) {
23
+ if (this.hasExemptionContainerValue) {
24
+ const inExemptionContainer = this.exemptionContainerTarget.contains(e.target)
25
+
26
+ if (!inExemptionContainer) {
27
+ leave(this.panelTarget)
28
+ }
29
+ } else {
30
+ leave(this.panelTarget)
31
+ }
32
+ }
33
+ }
34
+
35
+ togglePanel() {
36
+ if (this.hasPanelTarget) {
37
+ toggle(this.panelTarget)
38
+ }
39
+ }
40
+
41
+ outlet({ params }) {
42
+ const { outlet } = params
43
+
44
+ if (outlet && document.querySelector(outlet)) {
45
+ document.querySelector(outlet).classList.toggle('hidden')
46
+ }
47
+ }
48
+ }
@@ -1,6 +1,7 @@
1
1
  import { application } from './application'
2
2
 
3
3
  import ActionController from './controllers/action_controller'
4
+ import ActionsOverflowController from './controllers/actions_overflow_controller'
4
5
  import ActionsPickerController from './controllers/actions_picker_controller'
5
6
  import AttachmentsController from './controllers/attachments_controller'
6
7
  import BelongsToFieldController from './controllers/fields/belongs_to_field_controller'
@@ -12,6 +13,7 @@ import DateFieldController from './controllers/fields/date_field_controller'
12
13
  import EasyMdeController from './controllers/fields/easy_mde_controller'
13
14
  import FilterController from './controllers/filter_controller'
14
15
  import HiddenInputController from './controllers/hidden_input_controller'
16
+ import InputAutofocusController from './controllers/input_autofocus_controller'
15
17
  import ItemSelectAllController from './controllers/item_select_all_controller'
16
18
  import ItemSelectorController from './controllers/item_selector_controller'
17
19
  import KeyValueController from './controllers/fields/key_value_controller'
@@ -20,23 +22,24 @@ import MenuController from './controllers/menu_controller'
20
22
  import ModalController from './controllers/modal_controller'
21
23
  import MultipleSelectFilterController from './controllers/multiple_select_filter_controller'
22
24
  import PerPageController from './controllers/per_page_controller'
25
+ import PreviewController from './controllers/preview_controller'
23
26
  import ProgressBarFieldController from './controllers/fields/progress_bar_field_controller'
24
- import ReloadBelongsToFieldController from './controllers/fields/reload_belongs_to_field_controller'
25
27
  import ResourceEditController from './controllers/resource_edit_controller'
26
28
  import ResourceIndexController from './controllers/resource_index_controller'
27
29
  import ResourceShowController from './controllers/resource_show_controller'
28
30
  import SearchController from './controllers/search_controller'
29
31
  import SelectController from './controllers/select_controller'
30
32
  import SelectFilterController from './controllers/select_filter_controller'
33
+ import SelfDestroyController from './controllers/self_destroy_controller'
31
34
  import SidebarController from './controllers/sidebar_controller'
32
35
  import TabsController from './controllers/tabs_controller'
33
- import TagsFieldController from './controllers/fields/tags_field_controller'
34
36
  import TextFilterController from './controllers/text_filter_controller'
35
37
  import TippyController from './controllers/tippy_controller'
36
- import TogglePanelController from './controllers/toggle_panel_controller'
38
+ import ToggleController from './controllers/toggle_controller'
37
39
  import TrixFieldController from './controllers/fields/trix_field_controller'
38
40
 
39
41
  application.register('action', ActionController)
42
+ application.register('actions-overflow', ActionsOverflowController)
40
43
  application.register('actions-picker', ActionsPickerController)
41
44
  application.register('attachments', AttachmentsController)
42
45
  application.register('boolean-filter', BooleanFilterController)
@@ -44,6 +47,7 @@ application.register('copy-to-clipboard', CopyToClipboardController)
44
47
  application.register('dashboard-card', DashboardCardController)
45
48
  application.register('filter', FilterController)
46
49
  application.register('hidden-input', HiddenInputController)
50
+ application.register('input-autofocus', InputAutofocusController)
47
51
  application.register('item-select-all', ItemSelectAllController)
48
52
  application.register('item-selector', ItemSelectorController)
49
53
  application.register('loading-button', LoadingButtonController)
@@ -51,18 +55,19 @@ application.register('menu', MenuController)
51
55
  application.register('modal', ModalController)
52
56
  application.register('multiple-select-filter', MultipleSelectFilterController)
53
57
  application.register('per-page', PerPageController)
58
+ application.register('preview', PreviewController)
54
59
  application.register('resource-edit', ResourceEditController)
55
60
  application.register('resource-index', ResourceIndexController)
56
61
  application.register('resource-show', ResourceShowController)
57
62
  application.register('search', SearchController)
58
63
  application.register('select', SelectController)
59
64
  application.register('select-filter', SelectFilterController)
65
+ application.register('self-destroy', SelfDestroyController)
60
66
  application.register('sidebar', SidebarController)
61
67
  application.register('tabs', TabsController)
62
- application.register('tags-field', TagsFieldController)
63
68
  application.register('text-filter', TextFilterController)
64
69
  application.register('tippy', TippyController)
65
- application.register('toggle-panel', TogglePanelController)
70
+ application.register('toggle', ToggleController)
66
71
 
67
72
  // Field controllers
68
73
  application.register('belongs-to-field', BelongsToFieldController)
@@ -71,7 +76,6 @@ application.register('date-field', DateFieldController)
71
76
  application.register('easy-mde', EasyMdeController)
72
77
  application.register('key-value', KeyValueController)
73
78
  application.register('progress-bar-field', ProgressBarFieldController)
74
- application.register("reload-belongs-to-field", ReloadBelongsToFieldController)
75
79
  application.register('trix-field', TrixFieldController)
76
80
 
77
81
  // Custom controllers
@@ -0,0 +1,15 @@
1
+ /* eslint-disable camelcase */
2
+ import { StreamActions } from '@hotwired/turbo'
3
+
4
+ // TODO: move these to the avo_filters gem
5
+
6
+ StreamActions.close_filters_dropdown = function () {
7
+ document.querySelector('.filters-dropdown-selector').classList.add('hidden')
8
+ }
9
+
10
+ StreamActions.open_filter = function () {
11
+ const id = this.getAttribute('unique-id')
12
+ setTimeout(() => {
13
+ document.querySelector(`[data-filter-id="${id}"] .pill`).click()
14
+ }, 150)
15
+ }
@@ -0,0 +1,5 @@
1
+ <turbo-stream action="append" target="alerts">
2
+ <template>
3
+ <%= render Avo::FlashAlertsComponent.new flashes: flash %>
4
+ </template>
5
+ </turbo-stream>
@@ -1,13 +1,14 @@
1
1
  <%= turbo_frame_tag "actions_show" do %>
2
2
  <div
3
- data-controller="<%= ["action", @action.get_stimulus_controllers].join(" ") %>"
3
+ data-controller="action"
4
4
  data-no-confirmation="<%= @action.no_confirmation %>"
5
5
  data-action-target="controllerDiv"
6
6
  data-resource-name="<%= @resource.model_key %>"
7
7
  data-resource-id="<%= params[:id] %>"
8
8
  class="hidden text-slate-800"
9
9
  >
10
- <%= form_with scope: 'fields',
10
+ <%= form_with model: @record,
11
+ scope: 'fields',
11
12
  url: Avo::Services::URIService.parse(@resource.records_path).append_paths("actions").to_s,
12
13
  local: true,
13
14
  data: @action.class.form_data_attributes do |form|
@@ -16,25 +17,24 @@
16
17
  <% c.with_heading do %>
17
18
  <%= @action.action_name %>
18
19
  <% end %>
19
-
20
20
  <div class="flex-1 flex">
21
21
  <%= @action.get_message %>
22
22
  </div>
23
23
  <%= hidden_field_tag :action_id, @action.param_id %>
24
- <%= form.hidden_field :avo_resource_ids, value: params[:resource_ids], 'data-action-target': 'resourceIds' %>
24
+ <%= form.hidden_field :avo_resource_ids, value: params[:id] || params[:resource_ids], 'data-action-target': 'resourceIds' %>
25
25
  <%= form.hidden_field :avo_selected_query, 'data-action-target': 'selectedAllQuery' %>
26
+ <%= form.hidden_field :arguments, value: params[:arguments] %>
26
27
  <% if @action.get_fields.present? %>
27
28
  <div class="my-4 -mx-6">
28
29
  <% @action.get_fields.each_with_index do |field, index| %>
29
30
  <%= render field
30
- .hydrate(resource: @resource, model: @resource.model, user: @resource.user, view: @view, action: @action)
31
+ .hydrate(resource: @resource, record: @resource.record, user: @resource.user, view: @view)
31
32
  .component_for_view(@view)
32
33
  .new(field: field, resource: @resource, index: index, form: form, compact: true)
33
34
  %>
34
35
  <% end %>
35
36
  </div>
36
37
  <% end %>
37
-
38
38
  <% c.with_controls do %>
39
39
  <%= a_button type: :button,
40
40
  data: { action: 'click->modal#close' },
@@ -46,7 +46,10 @@
46
46
  color: :green,
47
47
  style: :primary,
48
48
  size: :sm,
49
- data: @action.class.submit_button_data_attributes do %>
49
+ data: {
50
+ target: :submit_action,
51
+ **@action.class.submit_button_data_attributes
52
+ } do %>
50
53
  <%= @action.confirm_button_label %>
51
54
  <% end %>
52
55
  <% end %>
@@ -16,8 +16,8 @@
16
16
  <% end %>
17
17
 
18
18
  <div class="flex-1 flex items-center justify-center px-0 lg:px-8 text-lg mt-8 mb-12">
19
- <% if @field.searchable %>
20
- <%= render Avo::Fields::BelongsToField::AutocompleteComponent.new form: form,
19
+ <% if @field.is_searchable? %>
20
+ <%= render Avo::Pro::SearchableAssociations::AutocompleteComponent.new form: form,
21
21
  classes: input_classes("w-full"),
22
22
  field: @field,
23
23
  model_key: @field.target_resource&.model_key,
@@ -2,17 +2,18 @@
2
2
  <%= render Avo::Views::ResourceIndexComponent.new(
3
3
  resource: @resource,
4
4
  resources: @resources,
5
- models: @models,
5
+ records: @records,
6
6
  pagy: @pagy,
7
7
  index_params: @index_params,
8
8
  filters: @filters,
9
9
  actions: @actions,
10
10
  reflection: @reflection,
11
11
  turbo_frame: params[:turbo_frame],
12
- parent_model: @parent_model,
12
+ parent_record: @parent_record,
13
13
  parent_resource: @parent_resource,
14
14
  applied_filters: @applied_filters,
15
15
  query: @query,
16
+ scopes: @scopes,
16
17
  )
17
18
  %>
18
19
  <% end %>
@@ -1 +1,2 @@
1
- <%= render Avo::Views::ResourceEditComponent.new(resource: @resource, model: @model, view: @view, actions: @actions) %>
1
+ <%= render Avo::Views::ResourceEditComponent.new(resource: @resource, record: @record, view: @view, actions: @actions) %>
2
+
@@ -0,0 +1,19 @@
1
+ <%= turbo_frame_tag params[:turbo_frame] do %>
2
+ <%= content_tag :div, class: "-mx-2" do %>
3
+ <%= content_tag :div, class: "px-4 py-2" do %>
4
+ <div class="text-base font-semibold text-gray-800">Previewing <%= @resource.record_title %></div>
5
+ <% end %>
6
+
7
+ <% if @resource.get_preview_fields.present? %>
8
+ <div class="mt-4 divide-y border-t">
9
+ <% @resource.get_preview_fields.each_with_index do |field, index| %>
10
+ <%= render field
11
+ .hydrate(resource: @resource, record: @resource.record, user: @resource.user, view: :show)
12
+ .component_for_view(:show)
13
+ .new(field: field, resource: @resource, index: index, compact: true, short: true, stacked: false)
14
+ %>
15
+ <% end %>
16
+ </div>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>
@@ -3,7 +3,7 @@
3
3
  resource: @resource,
4
4
  reflection: @reflection,
5
5
  actions: @actions,
6
- parent_model: @parent_model,
6
+ parent_record: @parent_record,
7
7
  parent_resource: @parent_resource,
8
8
  ) %>
9
9
  <% end %>
@@ -0,0 +1,9 @@
1
+ <% if valid %>
2
+ <span class="text-green-700 text-xl">
3
+ <%= svg "check-badge", class: "h-5 inline -mt-1 relative" %> <span>Valid</span>
4
+ </span>
5
+ <% else %>
6
+ <span class="text-orange-700 text-xl">
7
+ <%= svg "exclamation-circle", class: "h-5 inline -mt-1 relative" %> <span>Invalid</span>
8
+ </span>
9
+ <% end %>