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,16 +6,18 @@ module Avo
6
6
  Avo::ApplicationController.include Pundit
7
7
  end
8
8
 
9
+ include Avo::InitializesAvo
9
10
  include Avo::ApplicationHelper
10
11
  include Avo::UrlHelpers
11
12
  include Avo::Concerns::Breadcrumbs
13
+ include Pagy::Backend
12
14
 
13
15
  protect_from_forgery with: :exception
14
16
  around_action :set_avo_locale
15
17
  around_action :set_force_locale, if: -> { params[:force_locale].present? }
16
18
  before_action :set_default_locale, if: -> { params[:set_locale].present? }
17
19
  before_action :init_app
18
- before_action :check_avo_license
20
+ before_action :set_active_storage_current_host
19
21
  before_action :set_resource_name
20
22
  before_action :_authenticate!
21
23
  before_action :set_authorization
@@ -27,15 +29,9 @@ module Avo
27
29
  rescue_from Avo::NotAuthorizedError, with: :render_unauthorized
28
30
  rescue_from ActiveRecord::RecordInvalid, with: :exception_logger
29
31
 
30
- helper_method :_current_user, :resources_path, :resource_path, :new_resource_path, :edit_resource_path, :resource_attach_path, :resource_detach_path, :related_resources_path, :turbo_frame_request?, :resource_view_path
32
+ helper_method :_current_user, :resources_path, :resource_path, :new_resource_path, :edit_resource_path, :resource_attach_path, :resource_detach_path, :related_resources_path, :turbo_frame_request?, :resource_view_path, :preview_resource_path
31
33
  add_flash_types :info, :warning, :success, :error
32
34
 
33
- def init_app
34
- Avo::App.init request: request, context: context, current_user: _current_user, view_context: view_context, params: params
35
-
36
- @license = Avo::App.license
37
- end
38
-
39
35
  def exception_logger(exception)
40
36
  respond_to do |format|
41
37
  format.html { raise exception }
@@ -49,49 +45,6 @@ module Avo
49
45
  end
50
46
  end
51
47
 
52
- def render(*args)
53
- raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:check_avo_license).source_location.first.match?(/.*\/app\/controllers\/avo\/application_controller\.rb/)
54
-
55
- if params[:controller] == "avo/search" && params[:action] == "index"
56
- raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:index).source_location.first.match?(/.*\/app\/controllers\/avo\/search_controller\.rb/)
57
- end
58
-
59
- if params[:controller] == "avo/dashboards" && params[:action] == "show"
60
- raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:show).source_location.first.match?(/.*\/app\/controllers\/avo\/dashboards_controller\.rb/)
61
- end
62
-
63
- if params[:controller] == "avo/dashboards" && params[:action] == "card"
64
- raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:card).source_location.first.match?(/.*\/app\/controllers\/avo\/dashboards_controller\.rb/)
65
- end
66
-
67
- super(*args)
68
- end
69
-
70
- def check_avo_license
71
- # Check to see if the path is a custom tool
72
- if on_custom_tool_page
73
- if @license.lacks(:custom_tools) || @license.invalid?
74
- message = "Your license is invalid or doesn't support custom tools."
75
- end
76
- end
77
-
78
- # Check to see if the path is a dashboard
79
- if on_dashboards_path
80
- if @license.lacks(:dashboards) || @license.invalid?
81
- message = "Your license is invalid or doesn't support dashboards."
82
- end
83
- end
84
-
85
- if message.present?
86
- if Rails.env.development? || Rails.env.test?
87
- @custom_tools_alert_visible = message
88
- elsif @license.lacks_with_trial(:custom_tools)
89
- # Raise error in non-development environments.
90
- raise Avo::LicenseInvalidError, message
91
- end
92
- end
93
- end
94
-
95
48
  def _current_user
96
49
  instance_eval(&Avo.configuration.current_user)
97
50
  end
@@ -108,6 +61,49 @@ module Avo
108
61
 
109
62
  private
110
63
 
64
+ # Get the pluralized resource name for this request
65
+ # Ex: projects, teams, users
66
+ def resource_name
67
+ return params[:resource_name] if params[:resource_name].present?
68
+
69
+ return controller_name if controller_name.present?
70
+
71
+ begin
72
+ request.path
73
+ .match(/\/?#{Avo.root_path.delete('/')}\/resources\/([a-z1-9\-_]*)\/?/mi)
74
+ .captures
75
+ .first
76
+ rescue
77
+ end
78
+ end
79
+
80
+ def related_resource_name
81
+ params[:related_name]
82
+ end
83
+
84
+ # Gets the Avo resource for this request based on the request from the `resource_name` "param"
85
+ # Ex: Avo::Resources::Project, Avo::Resources::Team, Avo::Resources::User
86
+ def resource
87
+ resource = Avo.resource_manager.get_resource @resource_name.to_s.camelize.singularize
88
+
89
+ return resource if resource.present?
90
+
91
+ Avo.resource_manager.get_resource_by_controller_name @resource_name
92
+ end
93
+
94
+ def related_resource
95
+ # Find the field from the parent resource
96
+ field = @resource.get_field params[:related_name]
97
+
98
+ return field.use_resource if field&.use_resource.present?
99
+
100
+ reflection = @record._reflections[params[:related_name]]
101
+
102
+ reflected_model = reflection.klass
103
+
104
+ Avo.resource_manager.get_resource_by_model_class reflected_model
105
+ end
106
+
111
107
  def set_resource_name
112
108
  @resource_name = resource_name
113
109
  end
@@ -119,15 +115,28 @@ module Avo
119
115
  def set_resource
120
116
  raise ActionController::RoutingError.new "No route matches" if resource.nil?
121
117
 
122
- @resource = resource.hydrate(params: params)
118
+ @resource = resource.new(view: action_name.to_sym, user: _current_user, params: params)
119
+
120
+ set_authorization
123
121
  end
124
122
 
125
123
  def set_related_resource
126
- @related_resource = related_resource.hydrate(params: params)
124
+ @related_resource = related_resource.new(params: params, view: action_name.to_sym, user: _current_user, record: @related_record)
127
125
  end
128
126
 
129
- def set_model
130
- @model = @resource.find_record(params[:id], query: model_find_scope, params: params)
127
+ def set_record
128
+ @record = @resource.find_record(params[:id], query: model_find_scope, params: params)
129
+ @resource.hydrate(record: @record)
130
+ end
131
+
132
+ def set_related_record
133
+ association_name = BaseResource.valid_association_name(@record, params[:related_name])
134
+ @related_record = if @field.is_a? Avo::Fields::HasOneField
135
+ @record.send association_name
136
+ else
137
+ @related_resource.find_record params[:related_id], query: eager_load_files(@related_resource, @record.send(association_name)), params: params
138
+ end
139
+ @related_resource.hydrate(record: @related_record)
131
140
  end
132
141
 
133
142
  def model_find_scope
@@ -135,50 +144,49 @@ module Avo
135
144
  end
136
145
 
137
146
  def model_scope
147
+ # abort @resource.inspect
138
148
  @resource.class.find_scope
139
149
  end
140
150
 
141
- def set_related_model
142
- association_name = BaseResource.valid_association_name(@model, params[:related_name])
143
- @related_model = if @field.is_a? Avo::Fields::HasOneField
144
- @model.send association_name
145
- else
146
- @related_resource.find_record params[:related_id], query: eager_load_files(@related_resource, @model.send(association_name)), params: params
147
- end
148
- end
149
-
150
151
  def set_view
151
152
  @view = action_name.to_sym
152
153
  end
153
154
 
154
- def set_model_to_fill
155
- @model_to_fill = @resource.model_class.new if @view == :create
156
- @model_to_fill = @model if @view == :update
155
+ def set_record_to_fill
156
+ @record_to_fill = @resource.model_class.new if @view == :create
157
+ @record_to_fill = @record if @view == :update
157
158
 
158
- # If resource.model is nil, most likely the user is creating a new record.
159
- # In that case, to access resource.model in visible and readonly blocks we hydrate the resource with a new model.
160
- @resource.hydrate(model: @model_to_fill) if @resource.model.nil?
159
+ # If resource.record is nil, most likely the user is creating a new record.
160
+ # In that case, to access resource.record in visible and readonly blocks we hydrate the resource with a new record.
161
+ # TODO: commented this
162
+ @resource.hydrate(record: @record_to_fill) if @resource.record.nil?
161
163
  end
162
164
 
163
- def fill_model
164
- # We have to skip filling the the model if this is an attach action
165
- is_attach_action = params[model_param_key].blank? && params[:related_name].present? && params[:fields].present?
165
+ def fill_record
166
+ # We have to skip filling the the record if this is an attach action
167
+ return if is_attach_action?
166
168
 
167
- unless is_attach_action
168
- @model = @resource.fill_model(@model_to_fill, cast_nullable(model_params), extra_params: extra_params)
169
- end
169
+ @record = @resource.fill_record(@record_to_fill, cast_nullable(model_params), extra_params: extra_params)
170
+ assign_default_value_to_disabled_fields if @view == :create
170
171
  end
171
172
 
172
- def hydrate_resource
173
- @resource.hydrate(view: action_name.to_sym, user: _current_user, model: @model)
173
+ def is_attach_action?
174
+ params[model_param_key].blank? && params[:related_name].present? && params[:fields].present?
174
175
  end
175
176
 
176
- def hydrate_related_resource
177
- @related_resource.hydrate(view: action_name.to_sym, user: _current_user, model: @related_model)
177
+ def assign_default_value_to_disabled_fields
178
+ @resource.get_field_definitions.select do |field|
179
+ field.is_disabled? && field.visible? && !field.computed
180
+ end.each do |field|
181
+ # Get the default value from the field default definition
182
+ # If there is no default value specified on the resource, get the value from the record (DB, Callbacks, etc.)
183
+ default_value = field.default || @record.send(field.id)
184
+ field.fill_field @record, field.id, default_value, params
185
+ end
178
186
  end
179
187
 
180
188
  def authorize_base_action
181
- class_to_authorize = @model || @resource.model_class
189
+ class_to_authorize = @record || @resource.model_class
182
190
 
183
191
  authorize_action class_to_authorize
184
192
  end
@@ -190,49 +198,6 @@ module Avo
190
198
  @authorization.set_record(class_to_authorize).authorize_action action_to_authorize.to_sym
191
199
  end
192
200
 
193
- # Get the pluralized resource name for this request
194
- # Ex: projects, teams, users
195
- def resource_name
196
- return params[:resource_name] if params[:resource_name].present?
197
-
198
- return controller_name if controller_name.present?
199
-
200
- begin
201
- request.path
202
- .match(/\/?#{Avo::App.root_path.delete('/')}\/resources\/([a-z1-9\-_]*)\/?/mi)
203
- .captures
204
- .first
205
- rescue
206
- end
207
- end
208
-
209
- def related_resource_name
210
- params[:related_name]
211
- end
212
-
213
- # Gets the Avo resource for this request based on the request from the `resource_name` "param"
214
- # Ex: Avo::Resources::Project, Avo::Resources::Team, Avo::Resources::User
215
- def resource
216
- resource = App.get_resource @resource_name.to_s.camelize.singularize
217
-
218
- return resource if resource.present?
219
-
220
- App.get_resource_by_controller_name @resource_name
221
- end
222
-
223
- def related_resource
224
- # Find the field from the parent resource
225
- field = @resource.get_field params[:related_name]
226
-
227
- return field.use_resource if field&.use_resource.present?
228
-
229
- reflection = @model._reflections[params[:related_name]]
230
-
231
- reflected_model = reflection.klass
232
-
233
- App.get_resource_by_model_name reflected_model
234
- end
235
-
236
201
  def eager_load_files(resource, query)
237
202
  # Get the non-computed file fields and try to eager load them
238
203
  attachment_fields = resource
@@ -263,7 +228,7 @@ module Avo
263
228
  instance_eval(&Avo.configuration.authenticate)
264
229
  end
265
230
 
266
- def render_unauthorized(_exception)
231
+ def render_unauthorized(exception)
267
232
  flash[:notice] = t "avo.not_authorized"
268
233
 
269
234
  redirect_url = if request.referrer.blank? || (request.referrer == request.url)
@@ -278,8 +243,8 @@ module Avo
278
243
  def set_authorization
279
244
  # We need to set @resource_name for the #resource method to work properly
280
245
  set_resource_name
281
- @authorization = if resource
282
- resource.authorization(user: _current_user)
246
+ @authorization = if @resource
247
+ @resource.authorization(user: _current_user)
283
248
  else
284
249
  Services::AuthorizationService.new _current_user
285
250
  end
@@ -301,30 +266,6 @@ module Avo
301
266
  instance_eval(&Avo.configuration.initial_breadcrumbs) if Avo.configuration.initial_breadcrumbs.present?
302
267
  end
303
268
 
304
- def on_root_path
305
- [Avo.configuration.root_path, "#{Avo.configuration.root_path}/"].include?(request.original_fullpath)
306
- end
307
-
308
- def on_resources_path
309
- request.original_url.match?(/.*#{Avo.configuration.root_path}\/resources\/.*/)
310
- end
311
-
312
- def on_api_path
313
- request.original_url.match?(/.*#{Avo.configuration.root_path}\/avo_api\/.*/)
314
- end
315
-
316
- def on_dashboards_path
317
- request.original_url.match?(/.*#{Avo.configuration.root_path}\/dashboards\/.*/)
318
- end
319
-
320
- def on_debug_path
321
- request.original_url.match?(/.*#{Avo.configuration.root_path}\/avo_private\/debug.*/)
322
- end
323
-
324
- def on_custom_tool_page
325
- !(on_root_path || on_resources_path || on_api_path || on_dashboards_path || on_debug_path)
326
- end
327
-
328
269
  def model_param_key
329
270
  @resource.form_scope
330
271
  end
@@ -360,5 +301,18 @@ module Avo
360
301
  value = cookies["#{Avo::COOKIES_KEY}.sidebar.open"]
361
302
  @sidebar_open = value.blank? || value == "1"
362
303
  end
304
+
305
+ # Set the current host for ActiveStorage
306
+ def set_active_storage_current_host
307
+ if defined?(ActiveStorage::Current)
308
+ if Rails::VERSION::MAJOR === 6
309
+ ActiveStorage::Current.host = request.base_url
310
+ elsif Rails::VERSION::MAJOR === 7
311
+ ActiveStorage::Current.url_options = {protocol: request.protocol, host: request.host, port: request.port}
312
+ end
313
+ end
314
+ rescue => exception
315
+ Avo.logger.debug "Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
316
+ end
363
317
  end
364
318
  end
@@ -2,18 +2,16 @@ require_dependency "avo/base_controller"
2
2
 
3
3
  module Avo
4
4
  class AssociationsController < BaseController
5
- before_action :set_model, only: [:show, :index, :new, :create, :destroy, :order]
6
- before_action :hydrate_resource, only: [:show, :index, :new, :create, :destroy, :order]
5
+ before_action :set_record, only: [:show, :index, :new, :create, :destroy]
7
6
  before_action :set_related_resource_name
8
- before_action :set_related_resource, only: [:show, :index, :new, :create, :destroy, :order]
7
+ before_action :set_related_resource, only: [:show, :index, :new, :create, :destroy]
9
8
  before_action :set_related_authorization
10
9
  before_action :set_reflection_field
11
- before_action :set_related_model, only: [:show, :order]
12
- before_action :hydrate_related_resource, only: [:show, :index, :create, :destroy, :order]
10
+ before_action :set_related_record, only: [:show]
13
11
  before_action :set_reflection
14
- before_action :set_attachment_class, only: [:show, :index, :new, :create, :destroy, :order]
15
- before_action :set_attachment_resource, only: [:show, :index, :new, :create, :destroy, :order]
16
- before_action :set_attachment_model, only: [:create, :destroy, :order]
12
+ before_action :set_attachment_class, only: [:show, :index, :new, :create, :destroy]
13
+ before_action :set_attachment_resource, only: [:show, :index, :new, :create, :destroy]
14
+ before_action :set_attachment_record, only: [:create, :destroy]
17
15
  before_action :authorize_index_action, only: :index
18
16
  before_action :authorize_attach_action, only: :new
19
17
  before_action :authorize_detach_action, only: :destroy
@@ -21,55 +19,55 @@ module Avo
21
19
  def index
22
20
  @parent_resource = @resource.dup
23
21
  @resource = @related_resource
24
- @parent_model = @parent_resource.find_record(params[:id], params: params)
25
- @parent_resource.hydrate(model: @parent_model)
26
- association_name = BaseResource.valid_association_name(@parent_model, params[:related_name])
27
- @query = @related_authorization.apply_policy @parent_model.send(association_name)
22
+ @parent_record = @parent_resource.find_record(params[:id], params: params)
23
+ @parent_resource.hydrate(record: @parent_record)
24
+ association_name = BaseResource.valid_association_name(@parent_record, params[:related_name])
25
+ @query = @related_authorization.apply_policy @parent_record.send(association_name)
28
26
  @association_field = @parent_resource.get_field params[:related_name]
29
27
 
30
28
  if @association_field.present? && @association_field.scope.present?
31
- @query = Avo::Hosts::AssociationScopeHost.new(block: @association_field.scope, query: @query, parent: @parent_model).handle
29
+ @query = Avo::ExecutionContext.new(target: @association_field.scope, query: @query, parent: @parent_record).handle
32
30
  end
33
31
 
34
32
  super
35
33
  end
36
34
 
37
35
  def show
38
- @parent_resource, @parent_model = @resource, @model
36
+ @parent_resource, @parent_record = @resource, @record
39
37
 
40
- @resource, @model = @related_resource, @related_model
38
+ @resource, @record = @related_resource, @related_record
41
39
 
42
40
  super
43
41
  end
44
42
 
45
43
  def new
46
- @resource.hydrate(model: @model)
44
+ @resource.hydrate(record: @record)
47
45
 
48
- if @field.present? && !@field.searchable
46
+ if @field.present? && !@field.is_searchable?
49
47
  query = @related_authorization.apply_policy @attachment_class
50
48
 
51
49
  # Add the association scope to the query scope
52
50
  if @field.attach_scope.present?
53
- query = Avo::Hosts::AssociationScopeHost.new(block: @field.attach_scope, query: query, parent: @model).handle
51
+ query = Avo::ExecutionContext.new(target: @field.attach_scope, query: query, parent: @record).handle
54
52
  end
55
53
 
56
- @options = query.all.map do |model|
57
- [model.send(@attachment_resource.class.title), model.id]
54
+ @options = query.all.map do |record|
55
+ [@attachment_resource.new(record: record).record_title, record.id]
58
56
  end
59
57
  end
60
58
  end
61
59
 
62
60
  def create
63
- association_name = BaseResource.valid_association_name(@model, params[:related_name])
61
+ association_name = BaseResource.valid_association_name(@record, params[:related_name])
64
62
 
65
63
  if reflection_class == "HasManyReflection"
66
- @model.send(association_name) << @attachment_model
64
+ @record.send(association_name) << @attachment_record
67
65
  else
68
- @model.send("#{association_name}=", @attachment_model)
66
+ @record.send("#{association_name}=", @attachment_record)
69
67
  end
70
68
 
71
69
  respond_to do |format|
72
- if @model.save
70
+ if @record.save
73
71
  format.html { redirect_back fallback_location: resource_view_response_path, notice: t("avo.attachment_class_attached", attachment_class: @related_resource.name) }
74
72
  else
75
73
  format.html { render :new }
@@ -78,12 +76,12 @@ module Avo
78
76
  end
79
77
 
80
78
  def destroy
81
- association_name = BaseResource.valid_association_name(@model, params[:related_name])
79
+ association_name = BaseResource.valid_association_name(@record, params[:related_name])
82
80
 
83
81
  if reflection_class == "HasManyReflection"
84
- @model.send(association_name).delete @attachment_model
82
+ @record.send(association_name).destroy @attachment_record
85
83
  else
86
- @model.send("#{association_name}=", nil)
84
+ @record.send("#{association_name}=", nil)
87
85
  end
88
86
 
89
87
  respond_to do |format|
@@ -91,17 +89,10 @@ module Avo
91
89
  end
92
90
  end
93
91
 
94
- def order
95
- @parent_resource = @resource.dup
96
- @resource, @model = @related_resource, @related_model
97
-
98
- super
99
- end
100
-
101
92
  private
102
93
 
103
94
  def set_reflection
104
- @reflection = @model._reflections[params[:related_name].to_s]
95
+ @reflection = @record._reflections[params[:related_name].to_s]
105
96
  end
106
97
 
107
98
  def set_attachment_class
@@ -109,16 +100,16 @@ module Avo
109
100
  end
110
101
 
111
102
  def set_attachment_resource
112
- @attachment_resource = @field.use_resource || (App.get_resource_by_model_name @attachment_class)
103
+ @attachment_resource = @field.use_resource || (Avo.resource_manager.get_resource_by_model_class @attachment_class)
113
104
  end
114
105
 
115
- def set_attachment_model
116
- @attachment_model = @related_resource.find_record attachment_id, params: params
106
+ def set_attachment_record
107
+ @attachment_record = @related_resource.find_record attachment_id, params: params
117
108
  end
118
109
 
119
110
  def set_reflection_field
120
111
  @field = @resource.get_field_definitions.find { |f| f.id == @related_resource_name.to_sym }
121
- @field.hydrate(resource: @resource, model: @model, view: :new)
112
+ @field.hydrate(resource: @resource, record: @record, view: :new)
122
113
  rescue
123
114
  end
124
115
 
@@ -127,7 +118,7 @@ module Avo
127
118
  end
128
119
 
129
120
  def reflection_class
130
- reflection = @model._reflections[params[:related_name]]
121
+ reflection = @record._reflections[params[:related_name]]
131
122
 
132
123
  klass = reflection.class.name.demodulize.to_s
133
124
  klass = reflection.through_reflection.class.name.demodulize.to_s if klass == "ThroughReflection"
@@ -136,7 +127,7 @@ module Avo
136
127
  end
137
128
 
138
129
  def authorize_if_defined(method)
139
- @authorization.set_record(@model)
130
+ @authorization.set_record(@record)
140
131
 
141
132
  if @authorization.has_method?(method.to_sym)
142
133
  @authorization.authorize_action method.to_sym
@@ -158,8 +149,8 @@ module Avo
158
149
  private
159
150
 
160
151
  def set_related_authorization
161
- @related_authorization = if related_resource
162
- related_resource.authorization(user: _current_user)
152
+ @related_authorization = if @related_resource.present?
153
+ @related_resource.authorization(user: _current_user)
163
154
  else
164
155
  Services::AuthorizationService.new _current_user
165
156
  end
@@ -4,17 +4,17 @@ module Avo
4
4
  class AttachmentsController < ApplicationController
5
5
  before_action :set_resource_name, only: [:destroy, :create]
6
6
  before_action :set_resource, only: [:destroy, :create]
7
- before_action :set_model, only: [:destroy, :create]
7
+ before_action :set_record, only: [:destroy, :create]
8
8
 
9
9
  def create
10
10
  blob = ActiveStorage::Blob.create_and_upload! io: params[:file].to_io, filename: params[:filename]
11
- association_name = BaseResource.valid_attachment_name(@model, params[:attachment_key])
11
+ association_name = BaseResource.valid_attachment_name(@record, params[:attachment_key])
12
12
 
13
13
  if association_name.blank?
14
14
  raise ActionController::BadRequest.new("Could not find the attachment association for #{params[:attachment_key]} (check the `attachment_key` for this Trix field)")
15
15
  end
16
16
 
17
- @model.send(association_name).attach blob
17
+ @record.send(association_name).attach blob
18
18
 
19
19
  render json: {
20
20
  url: main_app.url_for(blob),
@@ -47,7 +47,7 @@ module Avo
47
47
  private
48
48
 
49
49
  def authorized_to(action)
50
- @resource.authorization.authorize_action("#{action}_#{params[:attachment_name]}?", record: @model, raise_exception: false)
50
+ @resource.authorization.authorize_action("#{action}_#{params[:attachment_name]}?", record: @record, raise_exception: false)
51
51
  end
52
52
  end
53
53
  end