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
@@ -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)
@@ -52,7 +46,7 @@ module Avo
52
46
  field_id = @index_params[:sort_by].to_sym
53
47
  field = @resource.get_field_definitions.find { |field| field.id == field_id }
54
48
  @query = if field&.sortable.is_a?(Proc)
55
- field.sortable.call(@query, @index_params[:sort_direction])
49
+ Avo::ExecutionContext.new(target: field.sortable, query: @query, direction: @index_params[:sort_direction]).handle
56
50
  else
57
51
  @query.order("#{@resource.model_class.table_name}.#{@index_params[:sort_by]} #{@index_params[:sort_direction]}")
58
52
  end
@@ -65,57 +59,62 @@ module Avo
65
59
  ).apply_query request, @query, filter_value
66
60
  end
67
61
 
68
- 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
71
+
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)
69
73
 
70
- # Create resources for each model
71
- @resources = @models.map do |model|
72
- @resource.hydrate(model: model, params: params).dup
74
+ # Create resources for each record
75
+ @resources = @records.map do |record|
76
+ @resource.hydrate(record: record, params: params).dup
73
77
  end
74
78
  end
75
79
 
76
80
  def show
77
- @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
78
82
 
79
83
  set_actions
80
84
 
81
85
  @page_title = @resource.default_panel_name.to_s
82
86
 
83
87
  # If we're accessing this resource via another resource add the parent to the breadcrumbs.
84
- if params[:via_resource_class].present? && params[:via_resource_id].present?
85
- via_resource = Avo::App.get_resource(params[:via_resource_class]).dup
86
- via_model = via_resource.find_record params[:via_resource_id], params: params
87
- 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
88
92
 
89
93
  add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
90
- 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)
91
95
  else
92
96
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
93
97
  end
94
98
 
95
- add_breadcrumb @resource.model_title
99
+ add_breadcrumb @resource.record_title
96
100
  add_breadcrumb I18n.t("avo.details").upcase_first
97
101
  end
98
102
 
99
103
  def new
100
- @model = @resource.model_class.new
101
- @resource = @resource.hydrate(model: @model, view: :new, user: _current_user)
102
-
103
- # Handle special cases when creating a new record via a belongs_to relationship
104
- if params[:via_belongs_to_resource_class].present?
105
- return render turbo_stream: turbo_stream.append('attach_modal', partial: 'avo/base/new_via_belongs_to')
106
- end
104
+ @record = @resource.model_class.new
105
+ @resource = @resource.hydrate(record: @record, view: :new, user: _current_user)
107
106
 
108
107
  set_actions
109
108
 
110
109
  @page_title = @resource.default_panel_name.to_s
111
110
 
112
111
  if is_associated_record?
113
- via_resource = Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
114
- via_model = via_resource.find_record params[:via_resource_id], params: params
115
- 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
116
115
 
117
116
  add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
118
- 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)
119
118
  end
120
119
 
121
120
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
@@ -123,37 +122,37 @@ module Avo
123
122
  end
124
123
 
125
124
  def create
126
- # model gets instantiated and filled in the fill_model method
127
- saved = save_model
128
- @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)
129
128
 
130
129
  # This means that the record has been created through another parent record and we need to attach it somehow.
131
- if params[:via_resource_id].present? && params[:via_belongs_to_resource_class].nil?
132
- @reflection = @model._reflections[params[:via_relation]]
130
+ if params[:via_record_id].present?
131
+ @reflection = @record._reflections[params[:via_relation]]
133
132
  # Figure out what kind of association does the record have with the parent record
134
133
 
135
134
  # Fills in the required infor for belongs_to and has_many
136
135
  # Get the foreign key and set it to the id we received in the params
137
136
  if @reflection.is_a?(ActiveRecord::Reflection::BelongsToReflection) || @reflection.is_a?(ActiveRecord::Reflection::HasManyReflection)
138
- related_resource = Avo::App.get_resource_by_model_name params[:via_relation_class]
139
- 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
140
139
 
141
- @model.send("#{@reflection.foreign_key}=", related_record.id)
142
- @model.save
140
+ @record.send("#{@reflection.foreign_key}=", related_record.id)
141
+ @record.save
143
142
  end
144
143
 
145
144
  # For when working with has_one, has_one_through, has_many_through, has_and_belongs_to_many, polymorphic
146
145
  if @reflection.is_a? ActiveRecord::Reflection::ThroughReflection
147
146
  # find the record
148
- via_resource = ::Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
149
- @related_record = via_resource.find_record params[:via_resource_id], params: params
150
- 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])
151
150
 
152
151
  if params[:via_association_type] == "has_one"
153
152
  # On has_one scenarios we should switch the @record and @related_record
154
- @related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @model)
153
+ @related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @record)
155
154
  else
156
- @model.send(association_name) << @related_record
155
+ @record.send(association_name) << @related_record
157
156
  end
158
157
  end
159
158
  end
@@ -174,9 +173,9 @@ module Avo
174
173
  end
175
174
 
176
175
  def update
177
- # model gets instantiated and filled in the fill_model method
178
- saved = save_model
179
- @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)
180
179
  set_actions
181
180
 
182
181
  if saved
@@ -194,55 +193,46 @@ module Avo
194
193
  end
195
194
  end
196
195
 
197
- def order
198
- direction = params[:direction].to_sym
196
+ def preview
197
+ @resource.hydrate(record: @record, view: :show, user: _current_user, params: params)
199
198
 
200
- if direction.present?
201
- @resource
202
- .hydrate(model: @model, params: params)
203
- .ordering_host
204
- .order direction
205
- end
206
-
207
- respond_to do |format|
208
- format.html { redirect_to params[:referrer] || resources_path(resource: @resource) }
209
- end
199
+ render layout: params[:turbo_frame].blank?
210
200
  end
211
201
 
212
202
  private
213
203
 
214
- def save_model
204
+ def save_record
215
205
  perform_action_and_record_errors do
216
- save_model_action
206
+ save_record_action
217
207
  end
218
208
  end
219
209
 
220
- def save_model_action
221
- @model.save!
210
+ def save_record_action
211
+ @record.save!
222
212
  end
223
213
 
224
214
  def destroy_model
225
215
  perform_action_and_record_errors do
226
- destroy_model_action
216
+ destroy_record_action
227
217
  end
228
218
  end
229
219
 
230
- def destroy_model_action
231
- @model.destroy!
220
+ def destroy_record_action
221
+ @record.destroy!
232
222
  end
233
223
 
234
224
  def perform_action_and_record_errors(&block)
235
225
  begin
236
226
  succeeded = block.call
237
227
  rescue => exception
238
- # In case there's an error somewhere else than the model
228
+ # In case there's an error somewhere else than the record
239
229
  # Example: When you save a license that should create a user for it and creating that user throws and error.
240
230
  # Example: When you Try to delete a record and has a foreign key constraint.
241
231
  exception_message = exception.message
242
232
  end
243
233
 
244
- # Add the errors from the model
245
- @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
246
236
 
247
237
  succeeded
248
238
  end
@@ -300,7 +290,7 @@ module Avo
300
290
  @index_params[:per_page] = cookies[:per_page]
301
291
  end
302
292
 
303
- if @parent_model.present?
293
+ if @parent_record.present?
304
294
  @index_params[:per_page] = Avo.configuration.via_per_page
305
295
  end
306
296
 
@@ -319,8 +309,20 @@ module Avo
319
309
  @index_params[:sort_direction] = params[:sort_direction] || :desc
320
310
 
321
311
  # View types
322
- @index_params[:view_type] = params[:view_type] || @resource.default_view_type || Avo.configuration.default_view_type
323
- @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
324
326
  end
325
327
 
326
328
  def set_filters
@@ -338,7 +340,7 @@ module Avo
338
340
  @actions = @resource
339
341
  .get_actions
340
342
  .map do |action|
341
- 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])
342
344
  end
343
345
  .select do |action|
344
346
  action.visible_in_view(parent_resource: @parent_resource)
@@ -392,45 +394,41 @@ module Avo
392
394
  end
393
395
 
394
396
  def set_edit_title_and_breadcrumbs
395
- @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
397
+ @resource = @resource.hydrate(record: @record, view: :edit, user: _current_user)
396
398
  @page_title = @resource.default_panel_name.to_s
397
399
 
398
400
  last_crumb_args = {}
399
401
  # If we're accessing this resource via another resource add the parent to the breadcrumbs.
400
- if params[:via_resource_class].present? && params[:via_resource_id].present?
401
- via_resource = Avo::App.get_resource(params[:via_resource_class]).dup
402
- via_model = via_resource.find_record params[:via_resource_id], params: params
403
- 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
404
406
 
405
407
  add_breadcrumb via_resource.plural_name, resources_path(resource: @resource)
406
- 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)
407
409
 
408
410
  last_crumb_args = {
409
411
  via_resource_class: params[:via_resource_class],
410
- via_resource_id: params[:via_resource_id]
412
+ via_record_id: params[:via_record_id]
411
413
  }
412
414
  else
413
415
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
414
416
  end
415
417
 
416
- 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)
417
419
  add_breadcrumb t("avo.edit").humanize
418
420
  end
419
421
 
420
422
  def create_success_action
421
- return render "close_modal_and_reload_field" if params[:via_belongs_to_resource_class].present?
422
-
423
423
  respond_to do |format|
424
424
  format.html { redirect_to after_create_path, notice: create_success_message}
425
425
  end
426
426
  end
427
427
 
428
428
  def create_fail_action
429
- flash.now[:error] = create_fail_message
430
-
431
429
  respond_to do |format|
430
+ flash.now[:error] = create_fail_message
432
431
  format.html { render :new, status: :unprocessable_entity }
433
- format.turbo_stream { render "create_fail_action" }
434
432
  end
435
433
  end
436
434
 
@@ -445,13 +443,13 @@ module Avo
445
443
  def after_create_path
446
444
  # If this is an associated record return to the association show page
447
445
  if is_associated_record?
448
- parent_resource = ::Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
449
- 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])
450
448
 
451
449
  return resource_view_path(
452
- model: @model.send(association_name),
450
+ record: @record.send(association_name),
453
451
  resource: parent_resource,
454
- resource_id: params[:via_resource_id]
452
+ resource_id: params[:via_record_id]
455
453
  )
456
454
  end
457
455
 
@@ -487,7 +485,7 @@ module Avo
487
485
 
488
486
  # Needs a different name, otwherwise, in some places, this can be called instead helpers.resource_view_path
489
487
  def resource_view_response_path
490
- helpers.resource_view_path(model: @model, resource: @resource)
488
+ helpers.resource_view_path(record: @record, resource: @resource)
491
489
  end
492
490
 
493
491
  def destroy_success_action
@@ -497,10 +495,8 @@ module Avo
497
495
  end
498
496
 
499
497
  def destroy_fail_action
500
- flash[:error] = destroy_fail_message
501
-
502
498
  respond_to do |format|
503
- 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 }
504
500
  end
505
501
  end
506
502
 
@@ -522,14 +518,14 @@ module Avo
522
518
  if @resource.class.send(action) == :index
523
519
  resources_path(resource: @resource)
524
520
  elsif @resource.class.send(action) == :edit || Avo.configuration.resource_default_view == :edit
525
- edit_resource_path(resource: @resource, model: @resource.model)
521
+ edit_resource_path(resource: @resource, record: @resource.record)
526
522
  else
527
- resource_path(model: @model, resource: @resource)
523
+ resource_path(record: @record, resource: @resource)
528
524
  end
529
525
  end
530
526
 
531
527
  def is_associated_record?
532
- params[:via_relation_class].present? && params[:via_resource_id].present?
528
+ params[:via_relation_class].present? && params[:via_record_id].present?
533
529
  end
534
530
 
535
531
  # Set pagy locale from params or from avo configuration, if both nil locale = "en"
@@ -537,8 +533,12 @@ module Avo
537
533
  @pagy_locale = locale.to_s || Avo.configuration.locale || "en"
538
534
  end
539
535
 
540
- def apply_pagination
541
- @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
542
542
  end
543
543
  end
544
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
@@ -0,0 +1,21 @@
1
+ module Avo
2
+ module InitializesAvo
3
+ def init_app
4
+ Avo::Current.license = Avo::Licensing::NilLicense.new
5
+ Avo::Current.context = context
6
+ Avo::Current.user = _current_user
7
+ Avo::Current.view_context = view_context
8
+ Avo.init
9
+ Avo::Current.license = Licensing::LicenseManager.new(Licensing::HQ.new(request).response).license
10
+ Avo.plugin_manager.init_plugins
11
+ end
12
+
13
+ def _current_user
14
+ instance_eval(&Avo.configuration.current_user)
15
+ end
16
+
17
+ def context
18
+ instance_eval(&Avo.configuration.context)
19
+ end
20
+ end
21
+ end