avo 2.44.0 → 3.0.2

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

Potentially problematic release.


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

Files changed (411) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +28 -26
  3. data/Gemfile.lock +231 -161
  4. data/README.md +19 -27
  5. data/Rakefile +2 -0
  6. data/app/assets/stylesheets/avo.base.css +1 -1
  7. data/app/assets/svgs/font.svg +1 -0
  8. data/app/assets/svgs/triangle-up.svg +1 -0
  9. data/app/components/avo/actions_component.html.erb +19 -5
  10. data/app/components/avo/actions_component.rb +39 -19
  11. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  12. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  14. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  15. data/app/components/avo/base_component.rb +15 -12
  16. data/app/components/avo/button_component.rb +20 -3
  17. data/app/components/avo/empty_state_component.rb +1 -1
  18. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  19. data/app/components/avo/field_wrapper_component.rb +9 -15
  20. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  21. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +75 -79
  22. data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
  23. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  24. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  25. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  26. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  27. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  28. data/app/components/avo/fields/common/badge_viewer_component.rb +1 -1
  29. data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
  30. data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
  31. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  32. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
  33. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  34. data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
  35. data/app/components/avo/fields/common/heading_component.html.erb +3 -8
  36. data/app/components/avo/fields/common/heading_component.rb +1 -3
  37. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  38. data/app/components/avo/fields/common/key_value_component.rb +2 -2
  39. data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
  40. data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
  41. data/app/components/avo/fields/edit_component.rb +2 -2
  42. data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
  43. data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
  44. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  45. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  46. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  47. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  48. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  49. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
  51. data/app/components/avo/fields/index_component.rb +6 -6
  52. data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
  53. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  54. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  55. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  56. data/app/components/avo/fields/show_component.rb +5 -2
  57. data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
  58. data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
  59. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  60. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  61. data/app/components/avo/filters_component.html.erb +9 -3
  62. data/app/components/avo/filters_component.rb +4 -4
  63. data/app/components/avo/index/field_wrapper_component.rb +1 -13
  64. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  65. data/app/components/avo/index/grid_item_component.rb +43 -16
  66. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  67. data/app/components/avo/index/resource_controls_component.rb +125 -18
  68. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  69. data/app/components/avo/index/resource_grid_component.rb +5 -2
  70. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  71. data/app/components/avo/index/resource_map_component.rb +3 -3
  72. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  73. data/app/components/avo/index/resource_table_component.rb +24 -7
  74. data/app/components/avo/index/table_row_component.html.erb +9 -5
  75. data/app/components/avo/index/table_row_component.rb +3 -2
  76. data/app/components/avo/items/panel_component.html.erb +25 -0
  77. data/app/components/avo/items/panel_component.rb +43 -0
  78. data/app/components/avo/items/switcher_component.html.erb +17 -0
  79. data/app/components/avo/items/switcher_component.rb +79 -0
  80. data/app/components/avo/items/visible_items_component.html.erb +10 -0
  81. data/app/components/avo/items/visible_items_component.rb +11 -0
  82. data/app/components/avo/modal_component.html.erb +3 -4
  83. data/app/components/avo/paginator_component.html.erb +29 -40
  84. data/app/components/avo/paginator_component.rb +23 -5
  85. data/app/components/avo/panel_component.html.erb +7 -5
  86. data/app/components/avo/referrer_params_component.html.erb +1 -1
  87. data/app/components/avo/resource_component.rb +205 -26
  88. data/app/components/avo/resource_sidebar_component.html.erb +15 -18
  89. data/app/components/avo/resource_sidebar_component.rb +5 -3
  90. data/app/components/avo/sidebar/link_component.rb +1 -1
  91. data/app/components/avo/sidebar_component.html.erb +10 -3
  92. data/app/components/avo/sidebar_component.rb +5 -3
  93. data/app/components/avo/sidebar_profile_component.html.erb +18 -12
  94. data/app/components/avo/tab_group_component.html.erb +14 -8
  95. data/app/components/avo/tab_group_component.rb +1 -6
  96. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  97. data/app/components/avo/tab_switcher_component.rb +6 -41
  98. data/app/components/avo/views/resource_edit_component.html.erb +23 -84
  99. data/app/components/avo/views/resource_edit_component.rb +20 -19
  100. data/app/components/avo/views/resource_index_component.html.erb +42 -47
  101. data/app/components/avo/views/resource_index_component.rb +76 -13
  102. data/app/components/avo/views/resource_show_component.html.erb +16 -177
  103. data/app/components/avo/views/resource_show_component.rb +16 -10
  104. data/app/controllers/avo/actions_controller.rb +29 -31
  105. data/app/controllers/avo/application_controller.rb +119 -181
  106. data/app/controllers/avo/associations_controller.rb +34 -43
  107. data/app/controllers/avo/attachments_controller.rb +4 -4
  108. data/app/controllers/avo/base_controller.rb +145 -98
  109. data/app/controllers/avo/debug_controller.rb +17 -5
  110. data/app/controllers/avo/home_controller.rb +1 -1
  111. data/app/controllers/avo/search_controller.rb +56 -50
  112. data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
  113. data/app/helpers/avo/application_helper.rb +18 -8
  114. data/app/helpers/avo/resources_helper.rb +1 -1
  115. data/app/helpers/avo/url_helpers.rb +28 -12
  116. data/app/javascript/avo.base.js +1 -0
  117. data/app/javascript/js/controllers/action_controller.js +3 -1
  118. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  119. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
  120. data/app/javascript/js/controllers/filter_controller.js +1 -1
  121. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  122. data/app/javascript/js/controllers/preview_controller.js +24 -0
  123. data/app/javascript/js/controllers/search_controller.js +4 -2
  124. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  125. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  126. data/app/javascript/js/controllers.js +11 -5
  127. data/app/javascript/js/custom-stream-actions.js +15 -0
  128. data/app/views/avo/actions/show.html.erb +9 -5
  129. data/app/views/avo/associations/new.html.erb +2 -2
  130. data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
  131. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
  132. data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
  133. data/app/views/avo/base/edit.html.erb +1 -1
  134. data/app/views/avo/base/index.html.erb +4 -3
  135. data/app/views/avo/base/new.html.erb +2 -1
  136. data/app/views/avo/base/preview.html.erb +19 -0
  137. data/app/views/avo/base/show.html.erb +2 -2
  138. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  139. data/app/views/avo/debug/report.html.erb +32 -17
  140. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  141. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  142. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +1 -1
  143. data/app/views/avo/partials/_footer.html.erb +1 -1
  144. data/app/views/avo/partials/_javascript.html.erb +5 -0
  145. data/app/views/avo/partials/_logo.html.erb +1 -1
  146. data/app/views/avo/partials/_navbar.html.erb +3 -5
  147. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  148. data/app/views/avo/partials/_table_header.html.erb +5 -11
  149. data/app/views/layouts/avo/application.html.erb +5 -4
  150. data/avo.gemspec +10 -8
  151. data/bin/dev +3 -1
  152. data/bin/prod +0 -0
  153. data/config/i18n-tasks.yml +1 -1
  154. data/config/initializers/pagy.rb +2 -0
  155. data/config/master.key +1 -0
  156. data/config/routes.rb +7 -10
  157. data/db/factories.rb +6 -0
  158. data/lib/avo/asset_manager.rb +30 -0
  159. data/lib/avo/base_action.rb +78 -60
  160. data/lib/avo/base_resource.rb +286 -225
  161. data/lib/avo/base_resource_tool.rb +9 -16
  162. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  163. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  164. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  165. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  166. data/lib/avo/concerns/has_controls.rb +37 -0
  167. data/lib/avo/concerns/has_description.rb +23 -0
  168. data/lib/avo/concerns/has_helpers.rb +18 -0
  169. data/lib/avo/concerns/has_item_type.rb +42 -0
  170. data/lib/avo/concerns/has_items.rb +339 -0
  171. data/lib/avo/concerns/hydration.rb +17 -0
  172. data/lib/avo/concerns/is_resource_item.rb +16 -36
  173. data/lib/avo/concerns/is_visible.rb +15 -0
  174. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  175. data/lib/avo/concerns/pagination.rb +53 -0
  176. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  177. data/lib/avo/concerns/visible_items.rb +7 -38
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +28 -11
  180. data/lib/avo/current.rb +39 -0
  181. data/lib/avo/dsl/field_parser.rb +3 -3
  182. data/lib/avo/dynamic_router.rb +18 -3
  183. data/lib/avo/engine.rb +35 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +14 -15
  186. data/lib/avo/fields/base_field.rb +84 -121
  187. data/lib/avo/fields/belongs_to_field.rb +19 -23
  188. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  189. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  190. data/lib/avo/fields/concerns/has_default.rb +1 -5
  191. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  192. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  193. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  194. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  195. data/lib/avo/fields/concerns/is_required.rb +5 -7
  196. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  199. data/lib/avo/fields/country_field.rb +4 -0
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/external_image_field.rb +2 -2
  202. data/lib/avo/fields/field_manager.rb +55 -0
  203. data/lib/avo/fields/file_field.rb +2 -2
  204. data/lib/avo/fields/gravatar_field.rb +2 -2
  205. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  206. data/lib/avo/fields/has_base_field.rb +21 -17
  207. data/lib/avo/fields/has_many_field.rb +5 -2
  208. data/lib/avo/fields/has_one_field.rb +8 -12
  209. data/lib/avo/fields/heading_field.rb +9 -14
  210. data/lib/avo/fields/hidden_field.rb +1 -1
  211. data/lib/avo/fields/id_field.rb +3 -3
  212. data/lib/avo/fields/location_field.rb +10 -10
  213. data/lib/avo/fields/password_field.rb +1 -1
  214. data/lib/avo/fields/preview_field.rb +14 -0
  215. data/lib/avo/fields/select_field.rb +12 -8
  216. data/lib/avo/fields/status_field.rb +7 -1
  217. data/lib/avo/fields/text_field.rb +2 -2
  218. data/lib/avo/filters/base_filter.rb +9 -4
  219. data/lib/avo/html/builder.rb +8 -8
  220. data/lib/avo/item_grapher.rb +78 -0
  221. data/lib/avo/licensing/h_q.rb +11 -73
  222. data/lib/avo/licensing/license.rb +5 -1
  223. data/lib/avo/licensing/license_manager.rb +1 -1
  224. data/lib/avo/licensing/pro_license.rb +1 -7
  225. data/lib/avo/loaders/fields_loader.rb +7 -1
  226. data/lib/avo/plugin.rb +36 -0
  227. data/lib/avo/plugin_manager.rb +56 -0
  228. data/lib/avo/prefixed_test_helpers.rb +20 -0
  229. data/lib/avo/reloader.rb +3 -0
  230. data/lib/avo/resources/controls/actions_list.rb +7 -12
  231. data/lib/avo/resources/controls/attach_button.rb +15 -0
  232. data/lib/avo/resources/controls/back_button.rb +1 -1
  233. data/lib/avo/resources/controls/base_control.rb +15 -49
  234. data/lib/avo/resources/controls/create_button.rb +15 -0
  235. data/lib/avo/resources/controls/delete_button.rb +5 -1
  236. data/lib/avo/resources/controls/detach_button.rb +4 -1
  237. data/lib/avo/resources/controls/edit_button.rb +4 -1
  238. data/lib/avo/resources/controls/order_controls.rb +8 -0
  239. data/lib/avo/resources/controls/save_button.rb +13 -0
  240. data/lib/avo/resources/controls/show_button.rb +15 -0
  241. data/lib/avo/resources/items/holder.rb +96 -0
  242. data/lib/avo/resources/items/item_group.rb +44 -0
  243. data/lib/avo/resources/items/main_panel.rb +12 -0
  244. data/lib/avo/resources/items/panel.rb +2 -0
  245. data/lib/avo/resources/items/row.rb +42 -0
  246. data/lib/avo/resources/items/sidebar.rb +46 -0
  247. data/lib/avo/resources/items/tab.rb +54 -0
  248. data/lib/avo/resources/items/tab_group.rb +62 -0
  249. data/lib/avo/resources/resource_manager.rb +179 -0
  250. data/lib/avo/services/authorization_service.rb +11 -110
  251. data/lib/avo/services/debug_service.rb +93 -0
  252. data/lib/avo/services/encryption_service.rb +8 -12
  253. data/lib/avo/services/telemetry_service.rb +85 -0
  254. data/lib/avo/test_helpers.rb +362 -0
  255. data/lib/avo/tools/tool_manager.rb +30 -0
  256. data/lib/avo/version.rb +1 -1
  257. data/lib/avo/view_inquirer.rb +36 -0
  258. data/lib/avo.rb +109 -24
  259. data/lib/generators/avo/action_generator.rb +8 -8
  260. data/lib/generators/avo/card_generator.rb +27 -0
  261. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  262. data/lib/generators/avo/controller_generator.rb +3 -0
  263. data/lib/generators/avo/eject_generator.rb +180 -15
  264. data/lib/generators/avo/field_generator.rb +49 -2
  265. data/lib/generators/avo/filter_generator.rb +8 -8
  266. data/lib/generators/avo/js/install_generator.rb +2 -2
  267. data/lib/generators/avo/resource_generator.rb +12 -9
  268. data/lib/generators/avo/scope_generator.rb +15 -0
  269. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  270. data/lib/generators/avo/templates/action.tt +8 -6
  271. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  272. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  273. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  274. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  275. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  276. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  277. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  278. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  279. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  280. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  281. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  282. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  283. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  284. data/lib/generators/avo/templates/locales/avo.ar.yml +7 -6
  285. data/lib/generators/avo/templates/locales/avo.en.yml +6 -3
  286. data/lib/generators/avo/templates/locales/avo.es.yml +127 -0
  287. data/lib/generators/avo/templates/locales/avo.fr.yml +3 -0
  288. data/lib/generators/avo/templates/locales/avo.nb.yml +3 -0
  289. data/lib/generators/avo/templates/locales/avo.nn.yml +3 -0
  290. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +3 -0
  291. data/lib/generators/avo/templates/locales/avo.pt.yml +3 -0
  292. data/lib/generators/avo/templates/locales/avo.ro.yml +8 -5
  293. data/lib/generators/avo/templates/locales/avo.tr.yml +3 -0
  294. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  295. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  296. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  297. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  298. data/lib/generators/avo/templates/scope.tt +6 -0
  299. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  300. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  301. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  302. data/lib/tasks/avo_tasks.rake +72 -4
  303. data/public/avo-assets/avo.base.css +1893 -1187
  304. data/public/avo-assets/avo.base.js +217 -305
  305. data/public/avo-assets/avo.base.js.map +3 -3
  306. data/public/avo-assets/avo.css +9744 -0
  307. data/public/avo-assets/avo.js +513 -0
  308. data/public/avo-assets/avo.js.map +7 -0
  309. data/tailwind.custom.js +47 -0
  310. data/tailwind.preset.js +152 -0
  311. metadata +107 -114
  312. data/app/components/avo/card_component.html.erb +0 -46
  313. data/app/components/avo/card_component.rb +0 -25
  314. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  315. data/app/components/avo/dashboards/divider_component.rb +0 -19
  316. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  317. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  318. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  319. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  320. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  321. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  322. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  323. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  324. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  325. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  326. data/app/components/avo/index/ordering/base_component.rb +0 -9
  327. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  328. data/app/components/avo/index/ordering/button_component.rb +0 -23
  329. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  330. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  331. data/app/components/avo/item_switcher_component.html.erb +0 -27
  332. data/app/components/avo/item_switcher_component.rb +0 -48
  333. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  334. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  335. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  336. data/app/controllers/avo/dashboards_controller.rb +0 -22
  337. data/app/controllers/avo/reorder_controller.rb +0 -25
  338. data/app/javascript/js/controllers/base_controller.js +0 -22
  339. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  340. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  341. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  342. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  343. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  344. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  345. data/app/views/avo/dashboards/show.html.erb +0 -38
  346. data/app/views/avo/partials/_global_search.html.erb +0 -19
  347. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  348. data/lib/avo/app.rb +0 -237
  349. data/lib/avo/base_card.rb +0 -161
  350. data/lib/avo/concerns/fetches_things.rb +0 -150
  351. data/lib/avo/concerns/handles_field_args.rb +0 -47
  352. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  353. data/lib/avo/concerns/has_fields.rb +0 -334
  354. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  355. data/lib/avo/concerns/policy_helpers.rb +0 -31
  356. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  357. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  358. data/lib/avo/dashboards/base_divider.rb +0 -35
  359. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  360. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  361. data/lib/avo/dashboards/metric_card.rb +0 -9
  362. data/lib/avo/dashboards/partial_card.rb +0 -7
  363. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  364. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  365. data/lib/avo/fields/tags_field.rb +0 -102
  366. data/lib/avo/grid_collector.rb +0 -42
  367. data/lib/avo/hosts/association_scope_host.rb +0 -8
  368. data/lib/avo/hosts/base_host.rb +0 -25
  369. data/lib/avo/hosts/card_visibility.rb +0 -20
  370. data/lib/avo/hosts/dashboard_card.rb +0 -22
  371. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  372. data/lib/avo/hosts/ordering.rb +0 -22
  373. data/lib/avo/hosts/record_host.rb +0 -7
  374. data/lib/avo/hosts/resource_record_host.rb +0 -7
  375. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  376. data/lib/avo/hosts/search_scope_host.rb +0 -7
  377. data/lib/avo/hosts/view_record_host.rb +0 -7
  378. data/lib/avo/hosts/visibility_host.rb +0 -12
  379. data/lib/avo/items_holder.rb +0 -96
  380. data/lib/avo/main_panel.rb +0 -3
  381. data/lib/avo/menu/base_item.rb +0 -25
  382. data/lib/avo/menu/builder.rb +0 -82
  383. data/lib/avo/menu/dashboard.rb +0 -22
  384. data/lib/avo/menu/group.rb +0 -2
  385. data/lib/avo/menu/link.rb +0 -6
  386. data/lib/avo/menu/menu.rb +0 -2
  387. data/lib/avo/menu/resource.rb +0 -22
  388. data/lib/avo/menu/section.rb +0 -2
  389. data/lib/avo/panel.rb +0 -24
  390. data/lib/avo/panel_builder.rb +0 -25
  391. data/lib/avo/resources/controls/action.rb +0 -38
  392. data/lib/avo/resources/controls/execution_context.rb +0 -58
  393. data/lib/avo/resources/controls/items_holder.rb +0 -19
  394. data/lib/avo/resources/controls/link_to.rb +0 -27
  395. data/lib/avo/row.rb +0 -26
  396. data/lib/avo/row_builder.rb +0 -24
  397. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  398. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  399. data/lib/avo/sidebar.rb +0 -30
  400. data/lib/avo/sidebar_builder.rb +0 -24
  401. data/lib/avo/tab.rb +0 -72
  402. data/lib/avo/tab_builder.rb +0 -25
  403. data/lib/avo/tab_group.rb +0 -42
  404. data/lib/avo/tab_group_builder.rb +0 -43
  405. data/lib/avo/tools_manager.rb +0 -11
  406. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  407. data/lib/generators/avo/card/metric_generator.rb +0 -18
  408. data/lib/generators/avo/card/partial_generator.rb +0 -19
  409. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  410. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  411. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -6,14 +6,14 @@ 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 :detect_fields
12
+ before_action :set_record_to_fill
13
13
  before_action :set_edit_title_and_breadcrumbs, only: [:edit, :update]
14
- before_action :fill_model, only: [:create, :update]
14
+ before_action :fill_record, only: [:create, :update]
15
15
  # Don't run base authorizations for associations
16
- before_action :authorize_base_action, if: -> { controller_name != "associations" }
16
+ before_action :authorize_base_action, except: :preview, if: -> { controller_name != "associations" }
17
17
  before_action :set_pagy_locale, only: :index
18
18
 
19
19
  def index
@@ -29,19 +29,11 @@ module Avo
29
29
  @query = @resource.class.query_scope
30
30
  end
31
31
 
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
32
  # Eager load the associations
38
33
  if @resource.includes.present?
39
34
  @query = @query.includes(*@resource.includes)
40
35
  end
41
36
 
42
- # Eager load the active storage attachments
43
- @query = eager_load_files(@resource, @query)
44
-
45
37
  # Sort the items
46
38
  if @index_params[:sort_by].present?
47
39
  unless @index_params[:sort_by].eql? :created_at
@@ -52,7 +44,7 @@ module Avo
52
44
  field_id = @index_params[:sort_by].to_sym
53
45
  field = @resource.get_field_definitions.find { |field| field.id == field_id }
54
46
  @query = if field&.sortable.is_a?(Proc)
55
- field.sortable.call(@query, @index_params[:sort_direction])
47
+ Avo::ExecutionContext.new(target: field.sortable, query: @query, direction: @index_params[:sort_direction]).handle
56
48
  else
57
49
  @query.order("#{@resource.model_class.table_name}.#{@index_params[:sort_by]} #{@index_params[:sort_direction]}")
58
50
  end
@@ -65,47 +57,46 @@ module Avo
65
57
  ).apply_query request, @query, filter_value
66
58
  end
67
59
 
68
- extra_pagy_params = {}
60
+ safe_call :set_and_apply_scopes
61
+ safe_call :apply_dynamic_filters
62
+ apply_pagination
69
63
 
70
- # Reset open filters when a user navigates to a new page
71
- extra_pagy_params[:keep_filters_panel_open] = if params[:keep_filters_panel_open] == "1"
72
- "0"
64
+ # Create resources for each record
65
+ @resources = @records.map do |record|
66
+ @resource.hydrate(record: record, params: params).dup
73
67
  end
74
68
 
75
- @pagy, @models = pagy(@query, items: @index_params[:per_page], link_extra: "data-turbo-frame=\"#{params[:turbo_frame]}\"", size: [1, 2, 2, 1], params: extra_pagy_params)
76
-
77
- # Create resources for each model
78
- @resources = @models.map do |model|
79
- @resource.hydrate(model: model, params: params).dup
80
- end
69
+ set_component_for __method__
81
70
  end
82
71
 
83
72
  def show
84
- @resource.hydrate(model: @model, view: :show, user: _current_user, params: params)
73
+ @resource.hydrate(record: @record, view: :show, user: _current_user, params: params).detect_fields
85
74
 
86
75
  set_actions
87
76
 
88
77
  @page_title = @resource.default_panel_name.to_s
89
78
 
90
79
  # If we're accessing this resource via another resource add the parent to the breadcrumbs.
91
- if params[:via_resource_class].present? && params[:via_resource_id].present?
92
- via_resource = Avo::App.get_resource(params[:via_resource_class]).dup
93
- via_model = via_resource.find_record params[:via_resource_id], params: params
94
- via_resource.hydrate model: via_model
80
+ if params[:via_resource_class].present? && params[:via_record_id].present?
81
+ via_resource = Avo.resource_manager.get_resource(params[:via_resource_class])
82
+ via_record = via_resource.find_record params[:via_record_id], params: params
83
+ via_resource = via_resource.new record: via_record
95
84
 
96
85
  add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
97
- add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
86
+ add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
98
87
  else
99
88
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
100
89
  end
101
90
 
102
- add_breadcrumb @resource.model_title
91
+ add_breadcrumb @resource.record_title
103
92
  add_breadcrumb I18n.t("avo.details").upcase_first
93
+
94
+ set_component_for __method__
104
95
  end
105
96
 
106
97
  def new
107
- @model = @resource.model_class.new
108
- @resource = @resource.hydrate(model: @model, view: :new, user: _current_user)
98
+ @record = @resource.model_class.new
99
+ @resource = @resource.hydrate(record: @record, view: :new, user: _current_user)
109
100
 
110
101
  # Handle special cases when creating a new record via a belongs_to relationship
111
102
  if params[:via_belongs_to_resource_class].present?
@@ -117,50 +108,52 @@ module Avo
117
108
  @page_title = @resource.default_panel_name.to_s
118
109
 
119
110
  if is_associated_record?
120
- via_resource = Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
121
- via_model = via_resource.find_record params[:via_resource_id], params: params
122
- via_resource.hydrate model: via_model
111
+ via_resource = Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
112
+ via_record = via_resource.find_record params[:via_record_id], params: params
113
+ via_resource = via_resource.new record: via_record
123
114
 
124
115
  add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
125
- add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
116
+ add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
126
117
  end
127
118
 
128
119
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
129
120
  add_breadcrumb t("avo.new").humanize
121
+
122
+ set_component_for __method__, fallback_view: :edit
130
123
  end
131
124
 
132
125
  def create
133
- # model gets instantiated and filled in the fill_model method
134
- saved = save_model
135
- @resource.hydrate(model: @model, view: :new, user: _current_user)
126
+ # record gets instantiated and filled in the fill_record method
127
+ saved = save_record
128
+ @resource.hydrate(record: @record, view: :new, user: _current_user)
136
129
 
137
130
  # This means that the record has been created through another parent record and we need to attach it somehow.
138
- if params[:via_resource_id].present? && params[:via_belongs_to_resource_class].nil?
139
- @reflection = @model._reflections[params[:via_relation]]
131
+ if params[:via_record_id].present? && params[:via_belongs_to_resource_class].nil?
132
+ @reflection = @record._reflections[params[:via_relation]]
140
133
  # Figure out what kind of association does the record have with the parent record
141
134
 
142
135
  # Fills in the required infor for belongs_to and has_many
143
136
  # Get the foreign key and set it to the id we received in the params
144
137
  if @reflection.is_a?(ActiveRecord::Reflection::BelongsToReflection) || @reflection.is_a?(ActiveRecord::Reflection::HasManyReflection)
145
- related_resource = Avo::App.get_resource_by_model_name params[:via_relation_class]
146
- related_record = related_resource.find_record params[:via_resource_id], params: params
138
+ related_resource = Avo.resource_manager.get_resource_by_model_class params[:via_relation_class]
139
+ related_record = related_resource.find_record params[:via_record_id], params: params
147
140
 
148
- @model.send("#{@reflection.foreign_key}=", related_record.id)
149
- @model.save
141
+ @record.send("#{@reflection.foreign_key}=", related_record.id)
142
+ @record.save
150
143
  end
151
144
 
152
145
  # For when working with has_one, has_one_through, has_many_through, has_and_belongs_to_many, polymorphic
153
146
  if @reflection.is_a? ActiveRecord::Reflection::ThroughReflection
154
147
  # find the record
155
- via_resource = ::Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
156
- @related_record = via_resource.find_record params[:via_resource_id], params: params
157
- association_name = BaseResource.valid_association_name(@model, params[:via_relation])
148
+ via_resource = Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
149
+ @related_record = via_resource.find_record params[:via_record_id], params: params
150
+ association_name = BaseResource.valid_association_name(@record, params[:via_relation])
158
151
 
159
152
  if params[:via_association_type] == "has_one"
160
153
  # On has_one scenarios we should switch the @record and @related_record
161
- @related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @model)
154
+ @related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @record)
162
155
  else
163
- @model.send(association_name) << @related_record
156
+ @record.send(association_name) << @related_record
164
157
  end
165
158
  end
166
159
  end
@@ -169,6 +162,8 @@ module Avo
169
162
  add_breadcrumb t("avo.new").humanize
170
163
  set_actions
171
164
 
165
+ set_component_for :edit
166
+
172
167
  if saved
173
168
  create_success_action
174
169
  else
@@ -178,14 +173,18 @@ module Avo
178
173
 
179
174
  def edit
180
175
  set_actions
176
+
177
+ set_component_for __method__
181
178
  end
182
179
 
183
180
  def update
184
- # model gets instantiated and filled in the fill_model method
185
- saved = save_model
186
- @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
181
+ # record gets instantiated and filled in the fill_record method
182
+ saved = save_record
183
+ @resource = @resource.hydrate(record: @record, view: :edit, user: _current_user)
187
184
  set_actions
188
185
 
186
+ set_component_for :edit
187
+
189
188
  if saved
190
189
  update_success_action
191
190
  else
@@ -201,55 +200,46 @@ module Avo
201
200
  end
202
201
  end
203
202
 
204
- def order
205
- direction = params[:direction].to_sym
206
-
207
- if direction.present?
208
- @resource
209
- .hydrate(model: @model, params: params)
210
- .ordering_host
211
- .order direction
212
- end
203
+ def preview
204
+ @resource.hydrate(record: @record, view: :show, user: _current_user, params: params)
213
205
 
214
- respond_to do |format|
215
- format.html { redirect_to params[:referrer] || resources_path(resource: @resource) }
216
- end
206
+ render layout: params[:turbo_frame].blank?
217
207
  end
218
208
 
219
209
  private
220
210
 
221
- def save_model
211
+ def save_record
222
212
  perform_action_and_record_errors do
223
- save_model_action
213
+ save_record_action
224
214
  end
225
215
  end
226
216
 
227
- def save_model_action
228
- @model.save!
217
+ def save_record_action
218
+ @record.save!
229
219
  end
230
220
 
231
221
  def destroy_model
232
222
  perform_action_and_record_errors do
233
- destroy_model_action
223
+ destroy_record_action
234
224
  end
235
225
  end
236
226
 
237
- def destroy_model_action
238
- @model.destroy!
227
+ def destroy_record_action
228
+ @record.destroy!
239
229
  end
240
230
 
241
231
  def perform_action_and_record_errors(&block)
242
232
  begin
243
233
  succeeded = block.call
244
234
  rescue => exception
245
- # In case there's an error somewhere else than the model
235
+ # In case there's an error somewhere else than the record
246
236
  # Example: When you save a license that should create a user for it and creating that user throws and error.
247
237
  # Example: When you Try to delete a record and has a foreign key constraint.
248
238
  exception_message = exception.message
249
239
  end
250
240
 
251
- # Add the errors from the model
252
- @errors = @model.errors.full_messages.reject { |error| exception_message.include? error }.unshift exception_message
241
+ # Add the errors from the record
242
+ @errors = @record.errors.full_messages.reject { |error| exception_message.include? error }.unshift exception_message
253
243
 
254
244
  succeeded
255
245
  end
@@ -307,7 +297,7 @@ module Avo
307
297
  @index_params[:per_page] = cookies[:per_page]
308
298
  end
309
299
 
310
- if @parent_model.present?
300
+ if @parent_record.present?
311
301
  @index_params[:per_page] = Avo.configuration.via_per_page
312
302
  end
313
303
 
@@ -326,8 +316,20 @@ module Avo
326
316
  @index_params[:sort_direction] = params[:sort_direction] || :desc
327
317
 
328
318
  # View types
329
- @index_params[:view_type] = params[:view_type] || @resource.default_view_type || Avo.configuration.default_view_type
330
- @index_params[:available_view_types] = @resource.available_view_types
319
+ available_view_types = @resource.available_view_types
320
+ @index_params[:available_view_types] = available_view_types
321
+
322
+ @index_params[:view_type] = if params[:view_type].present?
323
+ params[:view_type]
324
+ elsif available_view_types.size == 1
325
+ available_view_types.first
326
+ else
327
+ @resource.default_view_type || Avo.configuration.default_view_type
328
+ end
329
+
330
+ if available_view_types.exclude? @index_params[:view_type].to_sym
331
+ raise "View type '#{@index_params[:view_type]}' is unavailable for #{@resource.class}."
332
+ end
331
333
  end
332
334
 
333
335
  def set_filters
@@ -345,7 +347,7 @@ module Avo
345
347
  @actions = @resource
346
348
  .get_actions
347
349
  .map do |action|
348
- action[:class].new(model: @model, resource: @resource, view: @view, arguments: action[:arguments])
350
+ action[:class].new(record: @record, resource: @resource, view: @view, arguments: action[:arguments])
349
351
  end
350
352
  .select do |action|
351
353
  action.visible_in_view(parent_resource: @parent_resource)
@@ -399,28 +401,28 @@ module Avo
399
401
  end
400
402
 
401
403
  def set_edit_title_and_breadcrumbs
402
- @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
404
+ @resource = @resource.hydrate(record: @record, view: :edit, user: _current_user)
403
405
  @page_title = @resource.default_panel_name.to_s
404
406
 
405
407
  last_crumb_args = {}
406
408
  # If we're accessing this resource via another resource add the parent to the breadcrumbs.
407
- if params[:via_resource_class].present? && params[:via_resource_id].present?
408
- via_resource = Avo::App.get_resource(params[:via_resource_class]).dup
409
- via_model = via_resource.find_record params[:via_resource_id], params: params
410
- via_resource.hydrate model: via_model
409
+ if params[:via_resource_class].present? && params[:via_record_id].present?
410
+ via_resource = Avo.resource_manager.get_resource(params[:via_resource_class])
411
+ via_record = via_resource.find_record params[:via_record_id], params: params
412
+ via_resource = via_resource.new record: via_record
411
413
 
412
414
  add_breadcrumb via_resource.plural_name, resources_path(resource: @resource)
413
- add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
415
+ add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
414
416
 
415
417
  last_crumb_args = {
416
418
  via_resource_class: params[:via_resource_class],
417
- via_resource_id: params[:via_resource_id]
419
+ via_record_id: params[:via_record_id]
418
420
  }
419
421
  else
420
422
  add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
421
423
  end
422
424
 
423
- add_breadcrumb @resource.model_title, resource_path(model: @resource.model, resource: @resource, **last_crumb_args)
425
+ add_breadcrumb @resource.record_title, resource_path(record: @resource.record, resource: @resource, **last_crumb_args)
424
426
  add_breadcrumb t("avo.edit").humanize
425
427
  end
426
428
 
@@ -452,13 +454,18 @@ module Avo
452
454
  def after_create_path
453
455
  # If this is an associated record return to the association show page
454
456
  if is_associated_record?
455
- parent_resource = ::Avo::App.get_resource_by_model_name(params[:via_relation_class]).dup
456
- association_name = BaseResource.valid_association_name(@model, params[:via_relation])
457
+ parent_resource = if params[:via_resource_class].present?
458
+ Avo.resource_manager.get_resource(params[:via_resource_class])
459
+ else
460
+ Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
461
+ end
462
+
463
+ association_name = BaseResource.valid_association_name(@record, params[:via_relation])
457
464
 
458
465
  return resource_view_path(
459
- model: @model.send(association_name),
466
+ record: @record.send(association_name),
460
467
  resource: parent_resource,
461
- resource_id: params[:via_resource_id]
468
+ resource_id: params[:via_record_id]
462
469
  )
463
470
  end
464
471
 
@@ -494,7 +501,7 @@ module Avo
494
501
 
495
502
  # Needs a different name, otwherwise, in some places, this can be called instead helpers.resource_view_path
496
503
  def resource_view_response_path
497
- helpers.resource_view_path(model: @model, resource: @resource)
504
+ helpers.resource_view_path(record: @record, resource: @resource)
498
505
  end
499
506
 
500
507
  def destroy_success_action
@@ -504,8 +511,10 @@ module Avo
504
511
  end
505
512
 
506
513
  def destroy_fail_action
514
+ flash[:error] = destroy_fail_message
515
+
507
516
  respond_to do |format|
508
- 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 }
517
+ format.turbo_stream { render partial: "avo/partials/flash_alerts" }
509
518
  end
510
519
  end
511
520
 
@@ -526,20 +535,58 @@ module Avo
526
535
 
527
536
  if @resource.class.send(action) == :index
528
537
  resources_path(resource: @resource)
529
- elsif @resource.class.send(action) == :edit || Avo.configuration.resource_default_view == :edit
530
- edit_resource_path(resource: @resource, model: @resource.model)
538
+ elsif @resource.class.send(action) == :edit || Avo.configuration.resource_default_view.edit?
539
+ edit_resource_path(resource: @resource, record: @resource.record)
531
540
  else
532
- resource_path(model: @model, resource: @resource)
541
+ resource_path(record: @record, resource: @resource)
533
542
  end
534
543
  end
535
544
 
536
545
  def is_associated_record?
537
- params[:via_relation_class].present? && params[:via_resource_id].present?
546
+ params[:via_relation_class].present? && params[:via_record_id].present?
538
547
  end
539
548
 
540
549
  # Set pagy locale from params or from avo configuration, if both nil locale = "en"
541
550
  def set_pagy_locale
542
551
  @pagy_locale = locale.to_s || Avo.configuration.locale || "en"
543
552
  end
553
+
554
+ def safe_call(method)
555
+ send(method) if respond_to?(method, true)
556
+ end
557
+
558
+ def pagy_query
559
+ @query
560
+ end
561
+
562
+ # Set the view component for the current view
563
+ # It will try to use the custom component if it's set, otherwise it will use the default one
564
+ def set_component_for(view, fallback_view: nil)
565
+ # Fetch the components from the resource
566
+ components = Avo::ExecutionContext.new(
567
+ target: @resource.components,
568
+ resource: @resource,
569
+ record: @record,
570
+ view: @view
571
+ ).handle
572
+
573
+ # If the component is not set, use the default one
574
+ if (custom_component = components.dig("resource_#{view}_component".to_sym)).nil?
575
+ return @component = "Avo::Views::Resource#{(fallback_view || view).to_s.classify}Component".constantize
576
+ end
577
+
578
+ # If the component is set, try to use it
579
+ @component = custom_component.to_s.safe_constantize
580
+
581
+ # If the component is not found, raise an error
582
+ if @component.nil?
583
+ raise "The component '#{custom_component}' was not found.\n" \
584
+ "That component was fetched from 'self.components' option inside '#{@resource.class}' resource."
585
+ end
586
+ end
587
+
588
+ def apply_pagination
589
+ @pagy, @records = @resource.apply_pagination(index_params: @index_params, query: pagy_query)
590
+ end
544
591
  end
545
592
  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