avo 2.53.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 +3 -3
  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 +125 -22
  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 +65 -25
  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 +43 -56
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +106 -111
  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 +265 -228
  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 -4
  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
@@ -6,14 +6,13 @@ module Avo
6
6
 
7
7
  before_action :set_resource_name
8
8
  before_action :set_resource
9
- before_action :hydrate_resource
10
9
  before_action :set_applied_filters, only: :index
11
- before_action :set_model, only: [:show, :edit, :destroy, :update, :order]
12
- before_action :set_model_to_fill
10
+ before_action :set_record, only: [:show, :edit, :destroy, :update, :preview]
11
+ before_action :set_record_to_fill
13
12
  before_action :set_edit_title_and_breadcrumbs, only: [:edit, :update]
14
- before_action :fill_model, only: [:create, :update]
13
+ before_action :fill_record, only: [:create, :update]
15
14
  # Don't run base authorizations for associations
16
- before_action :authorize_base_action, if: -> { controller_name != "associations" }
15
+ before_action :authorize_base_action, except: :preview, if: -> { controller_name != "associations" }
17
16
  before_action :set_pagy_locale, only: :index
18
17
 
19
18
  def index
@@ -29,11 +28,6 @@ module Avo
29
28
  @query = @resource.class.query_scope
30
29
  end
31
30
 
32
- # Remove default_scope for index view if no parent_resource present
33
- if @resource.unscoped_queries_on_index && @parent_resource.blank?
34
- @query = @query.unscoped
35
- end
36
-
37
31
  # Eager load the associations
38
32
  if @resource.includes.present?
39
33
  @query = @query.includes(*@resource.includes)
@@ -48,18 +42,13 @@ module Avo
48
42
  @query = @query.unscope(:order)
49
43
  end
50
44
 
51
- sanitized_sort_direction = @index_params[:sort_direction].presence_in(["asc", "desc"])
52
-
53
45
  # Check if the sortable field option is actually a proc and we need to do a custom sort
54
- sort_by = @index_params[:sort_by].to_sym
55
- field = @resource.get_field(sort_by)
46
+ field_id = @index_params[:sort_by].to_sym
47
+ field = @resource.get_field_definitions.find { |field| field.id == field_id }
56
48
  @query = if field&.sortable.is_a?(Proc)
57
- field.sortable.call(@query, sanitized_sort_direction)
58
- elsif field.present? && sanitized_sort_direction
59
- @query.order("#{@resource.model_class.table_name}.#{sort_by} #{sanitized_sort_direction}")
60
- # Transform Model to ActiveRecord::Relation because Avo expects one.
49
+ Avo::ExecutionContext.new(target: field.sortable, query: @query, direction: @index_params[:sort_direction]).handle
61
50
  else
62
- @query.where("1=1")
51
+ @query.order("#{@resource.model_class.table_name}.#{@index_params[:sort_by]} #{@index_params[:sort_direction]}")
63
52
  end
64
53
  end
65
54
 
@@ -70,57 +59,62 @@ module Avo
70
59
  ).apply_query request, @query, filter_value
71
60
  end
72
61
 
73
- apply_pagination
62
+ extra_pagy_params = {}
63
+
64
+ # Reset open filters when a user navigates to a new page
65
+ extra_pagy_params[:keep_filters_panel_open] = if params[:keep_filters_panel_open] == "1"
66
+ "0"
67
+ end
68
+
69
+ safe_call :set_and_apply_scopes
70
+ safe_call :apply_dynamic_filters
74
71
 
75
- # Create resources for each model
76
- @resources = @models.map do |model|
77
- @resource.hydrate(model: model, params: params).dup
72
+ @pagy, @records = pagy(pagy_query, items: @index_params[:per_page], link_extra: "data-turbo-frame=\"#{params[:turbo_frame]}\"", size: [1, 2, 2, 1], params: extra_pagy_params)
73
+
74
+ # Create resources for each record
75
+ @resources = @records.map do |record|
76
+ @resource.hydrate(record: record, params: params).dup
78
77
  end
79
78
  end
80
79
 
81
80
  def show
82
- @resource.hydrate(model: @model, view: :show, user: _current_user, params: params)
81
+ @resource.hydrate(record: @record, view: :show, user: _current_user, params: params).detect_fields
83
82
 
84
83
  set_actions
85
84
 
86
85
  @page_title = @resource.default_panel_name.to_s
87
86
 
88
87
  # If we're accessing this resource via another resource add the parent to the breadcrumbs.
89
- if params[:via_resource_class].present? && params[:via_resource_id].present?
90
- via_resource = Avo::App.get_resource(params[:via_resource_class]).dup
91
- via_model = via_resource.find_record params[:via_resource_id], params: params
92
- via_resource.hydrate model: via_model
88
+ if params[:via_resource_class].present? && params[:via_record_id].present?
89
+ via_resource = Avo.resource_manager.get_resource(params[:via_resource_class])
90
+ via_record = via_resource.find_record params[:via_record_id], params: params
91
+ via_resource = via_resource.new record: via_record
93
92
 
94
93
  add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
95
- add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
94
+ add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
96
95
  else
97
96
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
98
97
  end
99
98
 
100
- add_breadcrumb @resource.model_title
99
+ add_breadcrumb @resource.record_title
101
100
  add_breadcrumb I18n.t("avo.details").upcase_first
102
101
  end
103
102
 
104
103
  def new
105
- @model = @resource.model_class.new
106
- @resource = @resource.hydrate(model: @model, view: :new, user: _current_user)
107
-
108
- # Handle special cases when creating a new record via a belongs_to relationship
109
- if params[:via_belongs_to_resource_class].present?
110
- return render turbo_stream: turbo_stream.append('attach_modal', partial: 'avo/base/new_via_belongs_to')
111
- end
104
+ @record = @resource.model_class.new
105
+ @resource = @resource.hydrate(record: @record, view: :new, user: _current_user)
112
106
 
113
107
  set_actions
114
108
 
115
109
  @page_title = @resource.default_panel_name.to_s
116
110
 
117
111
  if is_associated_record?
118
- via_resource = Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
119
- via_model = via_resource.find_record params[:via_resource_id], params: params
120
- via_resource.hydrate model: via_model
112
+ via_resource = Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
113
+ via_record = via_resource.find_record params[:via_record_id], params: params
114
+ via_resource = via_resource.new record: via_record
121
115
 
122
116
  add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
123
- add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
117
+ add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
124
118
  end
125
119
 
126
120
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
@@ -128,37 +122,37 @@ module Avo
128
122
  end
129
123
 
130
124
  def create
131
- # model gets instantiated and filled in the fill_model method
132
- saved = save_model
133
- @resource.hydrate(model: @model, view: :new, user: _current_user)
125
+ # record gets instantiated and filled in the fill_record method
126
+ saved = save_record
127
+ @resource.hydrate(record: @record, view: :new, user: _current_user)
134
128
 
135
129
  # This means that the record has been created through another parent record and we need to attach it somehow.
136
- if params[:via_resource_id].present? && params[:via_belongs_to_resource_class].nil?
137
- @reflection = @model.class.reflect_on_association(params[:via_relation])
130
+ if params[:via_record_id].present?
131
+ @reflection = @record._reflections[params[:via_relation]]
138
132
  # Figure out what kind of association does the record have with the parent record
139
133
 
140
134
  # Fills in the required infor for belongs_to and has_many
141
135
  # Get the foreign key and set it to the id we received in the params
142
136
  if @reflection.is_a?(ActiveRecord::Reflection::BelongsToReflection) || @reflection.is_a?(ActiveRecord::Reflection::HasManyReflection)
143
- related_resource = Avo::App.get_resource_by_model_name params[:via_relation_class]
144
- related_record = related_resource.find_record params[:via_resource_id], params: params
137
+ related_resource = Avo.resource_manager.get_resource_by_model_class params[:via_relation_class]
138
+ related_record = related_resource.find_record params[:via_record_id], params: params
145
139
 
146
- @model.send("#{@reflection.foreign_key}=", related_record.id)
147
- @model.save
140
+ @record.send("#{@reflection.foreign_key}=", related_record.id)
141
+ @record.save
148
142
  end
149
143
 
150
144
  # For when working with has_one, has_one_through, has_many_through, has_and_belongs_to_many, polymorphic
151
- if @reflection.is_a?(ActiveRecord::Reflection::ThroughReflection) || @reflection.is_a?(ActiveRecord::Reflection::HasAndBelongsToManyReflection)
145
+ if @reflection.is_a? ActiveRecord::Reflection::ThroughReflection
152
146
  # find the record
153
- via_resource = ::Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
154
- @related_record = via_resource.find_record params[:via_resource_id], params: params
155
- association_name = BaseResource.valid_association_name(@model, params[:via_relation])
147
+ via_resource = Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
148
+ @related_record = via_resource.find_record params[:via_record_id], params: params
149
+ association_name = BaseResource.valid_association_name(@record, params[:via_relation])
156
150
 
157
151
  if params[:via_association_type] == "has_one"
158
152
  # On has_one scenarios we should switch the @record and @related_record
159
- @related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @model)
153
+ @related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @record)
160
154
  else
161
- @model.send(association_name) << @related_record
155
+ @record.send(association_name) << @related_record
162
156
  end
163
157
  end
164
158
  end
@@ -179,9 +173,9 @@ module Avo
179
173
  end
180
174
 
181
175
  def update
182
- # model gets instantiated and filled in the fill_model method
183
- saved = save_model
184
- @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
176
+ # record gets instantiated and filled in the fill_record method
177
+ saved = save_record
178
+ @resource = @resource.hydrate(record: @record, view: :edit, user: _current_user)
185
179
  set_actions
186
180
 
187
181
  if saved
@@ -199,55 +193,46 @@ module Avo
199
193
  end
200
194
  end
201
195
 
202
- def order
203
- direction = params[:direction].to_sym
196
+ def preview
197
+ @resource.hydrate(record: @record, view: :show, user: _current_user, params: params)
204
198
 
205
- if direction.present?
206
- @resource
207
- .hydrate(model: @model, params: params)
208
- .ordering_host
209
- .order direction
210
- end
211
-
212
- respond_to do |format|
213
- format.html { redirect_to params[:referrer] || resources_path(resource: @resource) }
214
- end
199
+ render layout: params[:turbo_frame].blank?
215
200
  end
216
201
 
217
202
  private
218
203
 
219
- def save_model
204
+ def save_record
220
205
  perform_action_and_record_errors do
221
- save_model_action
206
+ save_record_action
222
207
  end
223
208
  end
224
209
 
225
- def save_model_action
226
- @model.save!
210
+ def save_record_action
211
+ @record.save!
227
212
  end
228
213
 
229
214
  def destroy_model
230
215
  perform_action_and_record_errors do
231
- destroy_model_action
216
+ destroy_record_action
232
217
  end
233
218
  end
234
219
 
235
- def destroy_model_action
236
- @model.destroy!
220
+ def destroy_record_action
221
+ @record.destroy!
237
222
  end
238
223
 
239
224
  def perform_action_and_record_errors(&block)
240
225
  begin
241
226
  succeeded = block.call
242
227
  rescue => exception
243
- # In case there's an error somewhere else than the model
228
+ # In case there's an error somewhere else than the record
244
229
  # Example: When you save a license that should create a user for it and creating that user throws and error.
245
230
  # Example: When you Try to delete a record and has a foreign key constraint.
246
231
  exception_message = exception.message
247
232
  end
248
233
 
249
- # Add the errors from the model
250
- @errors = @model.errors.full_messages.reject { |error| exception_message.include? error }.unshift exception_message
234
+ # Add the errors from the record
235
+ @errors = @record.errors.full_messages.reject { |error| exception_message.include? error }.unshift exception_message
251
236
 
252
237
  succeeded
253
238
  end
@@ -305,7 +290,7 @@ module Avo
305
290
  @index_params[:per_page] = cookies[:per_page]
306
291
  end
307
292
 
308
- if @parent_model.present?
293
+ if @parent_record.present?
309
294
  @index_params[:per_page] = Avo.configuration.via_per_page
310
295
  end
311
296
 
@@ -324,8 +309,20 @@ module Avo
324
309
  @index_params[:sort_direction] = params[:sort_direction] || :desc
325
310
 
326
311
  # View types
327
- @index_params[:view_type] = params[:view_type] || @resource.default_view_type || Avo.configuration.default_view_type
328
- @index_params[:available_view_types] = @resource.available_view_types
312
+ available_view_types = @resource.available_view_types
313
+ @index_params[:available_view_types] = available_view_types
314
+
315
+ @index_params[:view_type] = if params[:view_type].present?
316
+ params[:view_type]
317
+ elsif available_view_types.size == 1
318
+ available_view_types.first
319
+ else
320
+ @resource.default_view_type || Avo.configuration.default_view_type
321
+ end
322
+
323
+ if available_view_types.exclude? @index_params[:view_type].to_sym
324
+ raise "View type '#{@index_params[:view_type]}' is unavailable for #{@resource.class}."
325
+ end
329
326
  end
330
327
 
331
328
  def set_filters
@@ -343,7 +340,7 @@ module Avo
343
340
  @actions = @resource
344
341
  .get_actions
345
342
  .map do |action|
346
- action[:class].new(model: @model, resource: @resource, view: @view, arguments: action[:arguments])
343
+ action[:class].new(record: @record, resource: @resource, view: @view, arguments: action[:arguments])
347
344
  end
348
345
  .select do |action|
349
346
  action.visible_in_view(parent_resource: @parent_resource)
@@ -397,45 +394,41 @@ module Avo
397
394
  end
398
395
 
399
396
  def set_edit_title_and_breadcrumbs
400
- @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
397
+ @resource = @resource.hydrate(record: @record, view: :edit, user: _current_user)
401
398
  @page_title = @resource.default_panel_name.to_s
402
399
 
403
400
  last_crumb_args = {}
404
401
  # If we're accessing this resource via another resource add the parent to the breadcrumbs.
405
- if params[:via_resource_class].present? && params[:via_resource_id].present?
406
- via_resource = Avo::App.get_resource(params[:via_resource_class]).dup
407
- via_model = via_resource.find_record params[:via_resource_id], params: params
408
- via_resource.hydrate model: via_model
402
+ if params[:via_resource_class].present? && params[:via_record_id].present?
403
+ via_resource = Avo.resource_manager.get_resource(params[:via_resource_class])
404
+ via_record = via_resource.find_record params[:via_record_id], params: params
405
+ via_resource = via_resource.new record: via_record
409
406
 
410
407
  add_breadcrumb via_resource.plural_name, resources_path(resource: @resource)
411
- add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
408
+ add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
412
409
 
413
410
  last_crumb_args = {
414
411
  via_resource_class: params[:via_resource_class],
415
- via_resource_id: params[:via_resource_id]
412
+ via_record_id: params[:via_record_id]
416
413
  }
417
414
  else
418
415
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
419
416
  end
420
417
 
421
- add_breadcrumb @resource.model_title, resource_path(model: @resource.model, resource: @resource, **last_crumb_args)
418
+ add_breadcrumb @resource.record_title, resource_path(record: @resource.record, resource: @resource, **last_crumb_args)
422
419
  add_breadcrumb t("avo.edit").humanize
423
420
  end
424
421
 
425
422
  def create_success_action
426
- return render "close_modal_and_reload_field" if params[:via_belongs_to_resource_class].present?
427
-
428
423
  respond_to do |format|
429
424
  format.html { redirect_to after_create_path, notice: create_success_message}
430
425
  end
431
426
  end
432
427
 
433
428
  def create_fail_action
434
- flash.now[:error] = create_fail_message
435
-
436
429
  respond_to do |format|
430
+ flash.now[:error] = create_fail_message
437
431
  format.html { render :new, status: :unprocessable_entity }
438
- format.turbo_stream { render "create_fail_action" }
439
432
  end
440
433
  end
441
434
 
@@ -450,13 +443,13 @@ module Avo
450
443
  def after_create_path
451
444
  # If this is an associated record return to the association show page
452
445
  if is_associated_record?
453
- parent_resource = ::Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
454
- association_name = BaseResource.valid_association_name(@model, params[:via_relation])
446
+ parent_resource = Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
447
+ association_name = BaseResource.valid_association_name(@record, params[:via_relation])
455
448
 
456
449
  return resource_view_path(
457
- model: @model.send(association_name),
450
+ record: @record.send(association_name),
458
451
  resource: parent_resource,
459
- resource_id: params[:via_resource_id]
452
+ resource_id: params[:via_record_id]
460
453
  )
461
454
  end
462
455
 
@@ -492,7 +485,7 @@ module Avo
492
485
 
493
486
  # Needs a different name, otwherwise, in some places, this can be called instead helpers.resource_view_path
494
487
  def resource_view_response_path
495
- helpers.resource_view_path(model: @model, resource: @resource)
488
+ helpers.resource_view_path(record: @record, resource: @resource)
496
489
  end
497
490
 
498
491
  def destroy_success_action
@@ -502,10 +495,8 @@ module Avo
502
495
  end
503
496
 
504
497
  def destroy_fail_action
505
- flash[:error] = destroy_fail_message
506
-
507
498
  respond_to do |format|
508
- format.turbo_stream { render partial: "avo/partials/flash_alerts" }
499
+ format.html { redirect_back fallback_location: params[:referrer] || resources_path(resource: @resource, turbo_frame: params[:turbo_frame], view_type: params[:view_type]), error: destroy_fail_message }
509
500
  end
510
501
  end
511
502
 
@@ -527,14 +518,14 @@ module Avo
527
518
  if @resource.class.send(action) == :index
528
519
  resources_path(resource: @resource)
529
520
  elsif @resource.class.send(action) == :edit || Avo.configuration.resource_default_view == :edit
530
- edit_resource_path(resource: @resource, model: @resource.model)
521
+ edit_resource_path(resource: @resource, record: @resource.record)
531
522
  else
532
- resource_path(model: @model, resource: @resource)
523
+ resource_path(record: @record, resource: @resource)
533
524
  end
534
525
  end
535
526
 
536
527
  def is_associated_record?
537
- params[:via_relation_class].present? && params[:via_resource_id].present?
528
+ params[:via_relation_class].present? && params[:via_record_id].present?
538
529
  end
539
530
 
540
531
  # Set pagy locale from params or from avo configuration, if both nil locale = "en"
@@ -542,8 +533,12 @@ module Avo
542
533
  @pagy_locale = locale.to_s || Avo.configuration.locale || "en"
543
534
  end
544
535
 
545
- def apply_pagination
546
- @pagy, @models = @resource.apply_pagination(index_params: @index_params, query: @query)
536
+ def safe_call(method)
537
+ send(method) if respond_to?(method, true)
538
+ end
539
+
540
+ def pagy_query
541
+ @query
547
542
  end
548
543
  end
549
544
  end
@@ -2,7 +2,19 @@ require_dependency "avo/application_controller"
2
2
 
3
3
  module Avo
4
4
  class DebugController < ApplicationController
5
- def index
5
+ def status
6
+ end
7
+
8
+ def send_to_hq
9
+ url = "#{ENV["HQ_URL"]}/api/v3/debug_requests"
10
+ timeout = 10 # seconds
11
+ license_key = Avo::Services::DebugService.debug_report(request)[:hq_payload][:license_key]
12
+ body = params[:body]
13
+ body = {license_key: license_key, body: body, payload: Avo::Services::DebugService.debug_report(request).to_json}.to_json
14
+
15
+ HTTParty.post url, body: body, headers: {"Content-Type": "application/json"}, timeout: timeout
16
+
17
+ render turbo_stream: turbo_stream.replace(:send_to_hq, plain: "Payload sent to Avo HQ.")
6
18
  end
7
19
 
8
20
  def report
@@ -13,13 +25,13 @@ module Avo
13
25
 
14
26
  if license.valid?
15
27
  flash[:notice] = "avohq.io responded: \"#{license.id.humanize} license is valid\"."
16
- elsif license.response['reason'].present?
17
- flash[:error] = "avohq.io responded: \"#{license.response['reason']}\"."
28
+ elsif license.response["reason"].present?
29
+ flash[:error] = "avohq.io responded: \"#{license.response["reason"]}\"."
18
30
  else
19
- flash[:error] = license.response['error']
31
+ flash[:error] = license.response["error"]
20
32
  end
21
33
 
22
- redirect_back fallback_location: avo.avo_private_debug_index_path
34
+ redirect_back fallback_location: avo.avo_private_status_path
23
35
  end
24
36
  end
25
37
  end
@@ -14,7 +14,7 @@ module Avo
14
14
  redirect_to computed_path
15
15
  elsif !Rails.env.development?
16
16
  @page_title = "Get started"
17
- resource = Avo::App.resources.min_by { |resource| resource.model_key }
17
+ resource = Avo.resource_manager.all.min_by { |resource| resource.model_key }
18
18
  redirect_to resources_path(resource: resource)
19
19
  end
20
20
  end
@@ -4,18 +4,8 @@ module Avo
4
4
  class SearchController < ApplicationController
5
5
  include Rails.application.routes.url_helpers
6
6
 
7
- before_action :set_resource_name, only: [:show]
8
- before_action :set_resource, only: [:show]
9
-
10
- def index
11
- raise ActionController::BadRequest.new("This feature requires the pro license https://avohq.io/purchase/pro") if App.license.lacks_with_trial(:global_search)
12
-
13
- resources = Avo::App.resources.reject do |resource|
14
- resource.class.hide_from_global_search
15
- end
16
-
17
- render json: search_resources(resources)
18
- end
7
+ before_action :set_resource_name, only: :show
8
+ before_action :set_resource, only: :show
19
9
 
20
10
  def show
21
11
  render json: search_resources([resource])
@@ -28,7 +18,6 @@ module Avo
28
18
  .map do |resource|
29
19
  # Apply authorization
30
20
  next unless @authorization.set_record(resource.model_class).authorize_action(:search, raise_exception: false)
31
-
32
21
  # Filter out the models without a search_query
33
22
  next if resource.search_query.nil?
34
23
 
@@ -45,20 +34,20 @@ module Avo
45
34
  end
46
35
 
47
36
  def search_resource(resource)
48
- query = Avo::Hosts::SearchScopeHost.new(
49
- block: resource.search_query,
37
+ query = Avo::ExecutionContext.new(
38
+ target: resource.search_query,
50
39
  params: params,
51
- scope: resource.class.scope
40
+ query: resource.query_scope
52
41
  ).handle
53
42
 
54
- query = apply_scope(query) if should_apply_any_scope?
55
-
56
43
  # Get the count
57
44
  results_count = query.reselect(resource.model_class.primary_key).count
58
45
 
59
46
  # Get the results
60
47
  query = query.limit(8)
61
48
 
49
+ query = apply_scope(query) if should_apply_any_scope?
50
+
62
51
  results = apply_search_metadata(query, resource)
63
52
 
64
53
  header = resource.plural_name
@@ -69,9 +58,9 @@ module Avo
69
58
 
70
59
  result_object = {
71
60
  header: header,
72
- help: resource.class.search_query_help,
61
+ help: resource.fetch_search(:help) || "",
73
62
  results: results,
74
- count: results_count
63
+ count: results.count
75
64
  }
76
65
 
77
66
  [resource.name.pluralize.downcase, result_object]
@@ -96,9 +85,9 @@ module Avo
96
85
  # to scope the query.
97
86
  # Example usage: Got to a project, create a new review, and search for a user.
98
87
  if parent.blank? && params[:via_parent_resource_id].present? && params[:via_parent_resource_class].present? && params[:via_relation].present?
99
- parent_resource_class = BaseResource.valid_model_class params[:via_parent_resource_class]
88
+ parent_resource_class = BaseResource.get_model_by_name params[:via_parent_resource_class]
100
89
 
101
- reflection_class = BaseResource.valid_model_class params[:via_reflection_class]
90
+ reflection_class = BaseResource.get_model_by_name params[:via_reflection_class]
102
91
 
103
92
  grandparent = parent_resource_class.find params[:via_parent_resource_id]
104
93
  parent = reflection_class.new(
@@ -106,7 +95,7 @@ module Avo
106
95
  )
107
96
  end
108
97
 
109
- Avo::Hosts::AssociationScopeHost.new(block: attach_scope, query: query, parent: parent).handle
98
+ Avo::ExecutionContext.new(target: attach_scope, query: query, parent: parent).handle
110
99
  end
111
100
 
112
101
  # This scope is applied if the search is being performed on a has_many association
@@ -114,44 +103,34 @@ module Avo
114
103
  association_name = BaseResource.valid_association_name(parent, params[:via_association_id])
115
104
 
116
105
  # Get association records
117
- scope = parent.send(association_name)
106
+ query = parent.send(association_name)
118
107
 
119
108
  # Apply policy scope if authorization is present
120
- scope = resource.authorization&.apply_policy scope
109
+ query = resource.authorization&.apply_policy query
121
110
 
122
- Avo::Hosts::SearchScopeHost.new(block: @resource.search_query, params: params, scope: scope).handle
111
+ Avo::ExecutionContext.new(target: @resource.class.search_query, params: params, query: query).handle
123
112
  end
124
113
 
125
- def apply_search_metadata(models, avo_resource)
126
- models.map do |model|
127
- resource = avo_resource.dup.hydrate(model: model).hydrate_fields(model: model)
128
-
129
- record_path = if resource.search_result_path.present?
130
- Avo::Hosts::ResourceRecordHost.new(block: resource.search_result_path, resource: resource, record: model).handle
131
- else
132
- resource.record_path
133
- end
114
+ def apply_search_metadata(records, avo_resource)
115
+ records.map do |record|
116
+ resource = avo_resource.new(record: record)
134
117
 
135
- result = {
136
- _id: model.id,
137
- _label: resource.label,
138
- _url: record_path
139
- }
140
-
141
- if App.license.has_with_trial(:enhanced_search_results)
142
- result[:_description] = resource.description
143
- result[:_avatar] = resource.avatar.present? ? main_app.url_for(resource.avatar) : nil
144
- result[:_avatar_type] = resource.avatar_type
145
- end
146
-
147
- result
118
+ fetch_result_information record, resource, resource.class.fetch_search(:item, record: record)
148
119
  end
149
120
  end
150
121
 
151
122
  private
152
123
 
124
+ def fetch_result_information(record, resource, item)
125
+ {
126
+ _id: record.id,
127
+ _label: item&.dig(:title) || resource.record_title,
128
+ _url: resource.class.fetch_search(:result_path, record: resource.record) || resource.record_path
129
+ }
130
+ end
131
+
153
132
  def should_apply_has_many_scope?
154
- params[:via_association] == "has_many" && @resource.search_query.present?
133
+ params[:via_association] == "has_many" && @resource.class.search_query.present?
155
134
  end
156
135
 
157
136
  def should_apply_attach_scope?
@@ -175,14 +154,14 @@ module Avo
175
154
  end
176
155
 
177
156
  def fetch_field
178
- fields = ::Avo::App.get_resource_by_model_name(params[:via_reflection_class]).get_field_definitions
157
+ fields = Avo.resource_manager.get_resource_by_model_class(params[:via_reflection_class]).new.get_field_definitions
179
158
  fields.find { |f| f.id.to_s == params[:via_association_id] }
180
159
  end
181
160
 
182
161
  def fetch_parent
183
162
  return unless params[:via_reflection_id].present?
184
163
 
185
- parent_resource = ::Avo::App.get_resource_by_model_name params[:via_reflection_class]
164
+ parent_resource = Avo.resource_manager.get_resource_by_model_class params[:via_reflection_class]
186
165
  parent_resource.find_record params[:via_reflection_id], params: params
187
166
  end
188
167
  end
@@ -0,0 +1,4 @@
1
+ # This controller has been generated to enable Rails' resource routes.
2
+ # You shouldn't need to modify it in order to use Avo.
3
+ class Avo::TeamUsersController < Avo::ResourcesController
4
+ end