avo 2.46.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 (409) 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 +12 -29
  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 +3 -2
  73. data/app/components/avo/index/resource_table_component.rb +8 -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 +1 -1
  84. data/app/components/avo/paginator_component.rb +6 -6
  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 -86
  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 -180
  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 +139 -91
  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 +5 -3
  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 +10 -6
  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/_footer.html.erb +1 -1
  143. data/app/views/avo/partials/_javascript.html.erb +5 -0
  144. data/app/views/avo/partials/_logo.html.erb +1 -1
  145. data/app/views/avo/partials/_navbar.html.erb +3 -5
  146. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  147. data/app/views/avo/partials/_table_header.html.erb +5 -11
  148. data/app/views/layouts/avo/application.html.erb +5 -4
  149. data/avo.gemspec +10 -8
  150. data/bin/dev +3 -1
  151. data/bin/prod +0 -0
  152. data/config/master.key +1 -0
  153. data/config/routes.rb +7 -10
  154. data/db/factories.rb +6 -0
  155. data/lib/avo/asset_manager.rb +30 -0
  156. data/lib/avo/base_action.rb +82 -67
  157. data/lib/avo/base_resource.rb +286 -226
  158. data/lib/avo/base_resource_tool.rb +9 -16
  159. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  160. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  161. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  162. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  163. data/lib/avo/concerns/has_controls.rb +37 -0
  164. data/lib/avo/concerns/has_description.rb +23 -0
  165. data/lib/avo/concerns/has_helpers.rb +18 -0
  166. data/lib/avo/concerns/has_item_type.rb +42 -0
  167. data/lib/avo/concerns/has_items.rb +339 -0
  168. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  169. data/lib/avo/concerns/hydration.rb +17 -0
  170. data/lib/avo/concerns/is_resource_item.rb +16 -36
  171. data/lib/avo/concerns/is_visible.rb +15 -0
  172. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  173. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  174. data/lib/avo/concerns/visible_items.rb +7 -38
  175. data/lib/avo/configuration/branding.rb +0 -12
  176. data/lib/avo/configuration.rb +28 -11
  177. data/lib/avo/current.rb +39 -0
  178. data/lib/avo/dsl/field_parser.rb +3 -3
  179. data/lib/avo/dynamic_router.rb +18 -3
  180. data/lib/avo/engine.rb +35 -30
  181. data/lib/avo/error_manager.rb +25 -0
  182. data/lib/avo/execution_context.rb +14 -15
  183. data/lib/avo/fields/base_field.rb +84 -122
  184. data/lib/avo/fields/belongs_to_field.rb +19 -23
  185. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  186. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  187. data/lib/avo/fields/concerns/has_default.rb +1 -5
  188. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  189. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  190. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  191. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  192. data/lib/avo/fields/concerns/is_required.rb +5 -7
  193. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  194. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  195. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  196. data/lib/avo/fields/country_field.rb +4 -0
  197. data/lib/avo/fields/date_time_field.rb +1 -5
  198. data/lib/avo/fields/external_image_field.rb +2 -2
  199. data/lib/avo/fields/field_manager.rb +55 -0
  200. data/lib/avo/fields/file_field.rb +2 -2
  201. data/lib/avo/fields/gravatar_field.rb +2 -2
  202. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  203. data/lib/avo/fields/has_base_field.rb +21 -17
  204. data/lib/avo/fields/has_many_field.rb +5 -2
  205. data/lib/avo/fields/has_one_field.rb +8 -12
  206. data/lib/avo/fields/heading_field.rb +9 -14
  207. data/lib/avo/fields/hidden_field.rb +1 -1
  208. data/lib/avo/fields/id_field.rb +3 -3
  209. data/lib/avo/fields/location_field.rb +10 -10
  210. data/lib/avo/fields/password_field.rb +1 -1
  211. data/lib/avo/fields/preview_field.rb +14 -0
  212. data/lib/avo/fields/select_field.rb +12 -8
  213. data/lib/avo/fields/status_field.rb +7 -1
  214. data/lib/avo/fields/text_field.rb +2 -2
  215. data/lib/avo/filters/base_filter.rb +9 -4
  216. data/lib/avo/html/builder.rb +8 -8
  217. data/lib/avo/item_grapher.rb +78 -0
  218. data/lib/avo/licensing/h_q.rb +11 -73
  219. data/lib/avo/licensing/license.rb +5 -1
  220. data/lib/avo/licensing/license_manager.rb +1 -1
  221. data/lib/avo/licensing/pro_license.rb +1 -7
  222. data/lib/avo/loaders/fields_loader.rb +7 -1
  223. data/lib/avo/plugin.rb +36 -0
  224. data/lib/avo/plugin_manager.rb +56 -0
  225. data/lib/avo/prefixed_test_helpers.rb +20 -0
  226. data/lib/avo/reloader.rb +3 -0
  227. data/lib/avo/resources/controls/actions_list.rb +7 -12
  228. data/lib/avo/resources/controls/attach_button.rb +15 -0
  229. data/lib/avo/resources/controls/back_button.rb +1 -1
  230. data/lib/avo/resources/controls/base_control.rb +15 -49
  231. data/lib/avo/resources/controls/create_button.rb +15 -0
  232. data/lib/avo/resources/controls/delete_button.rb +5 -1
  233. data/lib/avo/resources/controls/detach_button.rb +4 -1
  234. data/lib/avo/resources/controls/edit_button.rb +4 -1
  235. data/lib/avo/resources/controls/order_controls.rb +8 -0
  236. data/lib/avo/resources/controls/save_button.rb +13 -0
  237. data/lib/avo/resources/controls/show_button.rb +15 -0
  238. data/lib/avo/resources/items/holder.rb +96 -0
  239. data/lib/avo/resources/items/item_group.rb +44 -0
  240. data/lib/avo/resources/items/main_panel.rb +12 -0
  241. data/lib/avo/resources/items/panel.rb +2 -0
  242. data/lib/avo/resources/items/row.rb +42 -0
  243. data/lib/avo/resources/items/sidebar.rb +46 -0
  244. data/lib/avo/resources/items/tab.rb +54 -0
  245. data/lib/avo/resources/items/tab_group.rb +62 -0
  246. data/lib/avo/resources/resource_manager.rb +179 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +93 -0
  249. data/lib/avo/services/encryption_service.rb +8 -12
  250. data/lib/avo/services/telemetry_service.rb +85 -0
  251. data/lib/avo/test_helpers.rb +362 -0
  252. data/lib/avo/tools/tool_manager.rb +30 -0
  253. data/lib/avo/version.rb +1 -1
  254. data/lib/avo/view_inquirer.rb +36 -0
  255. data/lib/avo.rb +109 -24
  256. data/lib/generators/avo/action_generator.rb +8 -8
  257. data/lib/generators/avo/card_generator.rb +27 -0
  258. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  259. data/lib/generators/avo/controller_generator.rb +3 -0
  260. data/lib/generators/avo/eject_generator.rb +180 -15
  261. data/lib/generators/avo/field_generator.rb +49 -2
  262. data/lib/generators/avo/filter_generator.rb +8 -8
  263. data/lib/generators/avo/js/install_generator.rb +2 -2
  264. data/lib/generators/avo/resource_generator.rb +12 -9
  265. data/lib/generators/avo/scope_generator.rb +15 -0
  266. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  267. data/lib/generators/avo/templates/action.tt +8 -6
  268. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  269. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  270. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  271. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  272. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  273. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  274. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  275. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  276. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  277. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  278. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  279. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  280. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  281. data/lib/generators/avo/templates/locales/avo.ar.yml +1 -0
  282. data/lib/generators/avo/templates/locales/avo.en.yml +4 -3
  283. data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
  284. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
  285. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
  286. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
  287. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
  288. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
  289. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -5
  290. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -0
  291. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  292. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  293. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  294. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  295. data/lib/generators/avo/templates/scope.tt +6 -0
  296. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  297. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  298. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  299. data/lib/tasks/avo_tasks.rake +72 -4
  300. data/public/avo-assets/avo.base.css +1893 -1187
  301. data/public/avo-assets/avo.base.js +217 -305
  302. data/public/avo-assets/avo.base.js.map +3 -3
  303. data/public/avo-assets/avo.css +9744 -0
  304. data/public/avo-assets/avo.js +513 -0
  305. data/public/avo-assets/avo.js.map +7 -0
  306. data/tailwind.custom.js +47 -0
  307. data/tailwind.preset.js +152 -0
  308. metadata +106 -116
  309. data/app/components/avo/card_component.html.erb +0 -46
  310. data/app/components/avo/card_component.rb +0 -25
  311. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  312. data/app/components/avo/dashboards/divider_component.rb +0 -19
  313. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  314. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  315. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  316. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  317. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  318. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  319. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  320. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  321. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  322. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  323. data/app/components/avo/index/ordering/base_component.rb +0 -9
  324. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  325. data/app/components/avo/index/ordering/button_component.rb +0 -23
  326. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  327. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  328. data/app/components/avo/item_switcher_component.html.erb +0 -27
  329. data/app/components/avo/item_switcher_component.rb +0 -48
  330. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  331. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  332. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  333. data/app/controllers/avo/dashboards_controller.rb +0 -22
  334. data/app/controllers/avo/reorder_controller.rb +0 -25
  335. data/app/javascript/js/controllers/base_controller.js +0 -22
  336. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  337. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  338. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  339. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  340. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  341. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  342. data/app/views/avo/dashboards/show.html.erb +0 -38
  343. data/app/views/avo/partials/_global_search.html.erb +0 -19
  344. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  345. data/lib/avo/app.rb +0 -237
  346. data/lib/avo/base_card.rb +0 -161
  347. data/lib/avo/concerns/fetches_things.rb +0 -150
  348. data/lib/avo/concerns/handles_field_args.rb +0 -47
  349. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  350. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  351. data/lib/avo/concerns/has_fields.rb +0 -334
  352. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  353. data/lib/avo/concerns/policy_helpers.rb +0 -31
  354. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  355. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  356. data/lib/avo/dashboards/base_divider.rb +0 -35
  357. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  358. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  359. data/lib/avo/dashboards/metric_card.rb +0 -9
  360. data/lib/avo/dashboards/partial_card.rb +0 -7
  361. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  362. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  363. data/lib/avo/fields/tags_field.rb +0 -102
  364. data/lib/avo/grid_collector.rb +0 -42
  365. data/lib/avo/hosts/association_scope_host.rb +0 -8
  366. data/lib/avo/hosts/base_host.rb +0 -25
  367. data/lib/avo/hosts/card_visibility.rb +0 -20
  368. data/lib/avo/hosts/dashboard_card.rb +0 -22
  369. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  370. data/lib/avo/hosts/ordering.rb +0 -22
  371. data/lib/avo/hosts/record_host.rb +0 -7
  372. data/lib/avo/hosts/resource_record_host.rb +0 -7
  373. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  374. data/lib/avo/hosts/search_scope_host.rb +0 -7
  375. data/lib/avo/hosts/view_record_host.rb +0 -7
  376. data/lib/avo/hosts/visibility_host.rb +0 -12
  377. data/lib/avo/items_holder.rb +0 -96
  378. data/lib/avo/main_panel.rb +0 -3
  379. data/lib/avo/menu/base_item.rb +0 -25
  380. data/lib/avo/menu/builder.rb +0 -82
  381. data/lib/avo/menu/dashboard.rb +0 -22
  382. data/lib/avo/menu/group.rb +0 -2
  383. data/lib/avo/menu/link.rb +0 -6
  384. data/lib/avo/menu/menu.rb +0 -2
  385. data/lib/avo/menu/resource.rb +0 -22
  386. data/lib/avo/menu/section.rb +0 -2
  387. data/lib/avo/panel.rb +0 -24
  388. data/lib/avo/panel_builder.rb +0 -25
  389. data/lib/avo/resources/controls/action.rb +0 -38
  390. data/lib/avo/resources/controls/execution_context.rb +0 -58
  391. data/lib/avo/resources/controls/items_holder.rb +0 -19
  392. data/lib/avo/resources/controls/link_to.rb +0 -27
  393. data/lib/avo/row.rb +0 -26
  394. data/lib/avo/row_builder.rb +0 -24
  395. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  396. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  397. data/lib/avo/sidebar.rb +0 -30
  398. data/lib/avo/sidebar_builder.rb +0 -24
  399. data/lib/avo/tab.rb +0 -72
  400. data/lib/avo/tab_builder.rb +0 -25
  401. data/lib/avo/tab_group.rb +0 -42
  402. data/lib/avo/tab_group_builder.rb +0 -43
  403. data/lib/avo/tools_manager.rb +0 -11
  404. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  405. data/lib/generators/avo/card/metric_generator.rb +0 -18
  406. data/lib/generators/avo/card/partial_generator.rb +0 -19
  407. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  408. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  409. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -6,6 +6,7 @@ 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
@@ -15,7 +16,7 @@ module Avo
15
16
  around_action :set_force_locale, if: -> { params[:force_locale].present? }
16
17
  before_action :set_default_locale, if: -> { params[:set_locale].present? }
17
18
  before_action :init_app
18
- before_action :check_avo_license
19
+ before_action :set_active_storage_current_host
19
20
  before_action :set_resource_name
20
21
  before_action :_authenticate!
21
22
  before_action :set_authorization
@@ -23,19 +24,14 @@ module Avo
23
24
  before_action :add_initial_breadcrumbs
24
25
  before_action :set_view
25
26
  before_action :set_sidebar_open
27
+ before_action :set_stylesheet_assets_path
26
28
 
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,66 +115,78 @@ 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)
123
- end
118
+ @resource = resource.new(view: params[:view] || action_name.to_s, user: _current_user, params: params)
124
119
 
125
- def set_related_resource
126
- @related_resource = related_resource.hydrate(params: params)
120
+ set_authorization
127
121
  end
128
122
 
129
- def set_model
130
- @model = @resource.find_record(params[:id], query: model_find_scope, params: params)
123
+ def detect_fields
124
+ @resource.detect_fields
131
125
  end
132
126
 
133
- def model_find_scope
134
- eager_load_files(@resource, model_scope)
127
+ def set_related_resource
128
+ @related_resource = related_resource.new(params: params, view: action_name.to_sym, user: _current_user, record: @related_record).detect_fields
135
129
  end
136
130
 
137
- def model_scope
138
- @resource.class.find_scope
131
+ def set_record
132
+ @record = @resource.find_record(params[:id], query: model_scope, params: params)
133
+ @resource.hydrate(record: @record)
139
134
  end
140
135
 
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
136
+ def set_related_record
137
+ association_name = BaseResource.valid_association_name(@record, params[:related_name])
138
+ @related_record = if @field.is_a? Avo::Fields::HasOneField
139
+ @record.send association_name
145
140
  else
146
- @related_resource.find_record params[:related_id], query: eager_load_files(@related_resource, @model.send(association_name)), params: params
141
+ @related_resource.find_record params[:related_id], query: @record.send(association_name), params: params
147
142
  end
143
+ @related_resource.hydrate(record: @related_record)
144
+ end
145
+
146
+ def model_scope
147
+ # abort @resource.inspect
148
+ @resource.class.find_scope
148
149
  end
149
150
 
150
151
  def set_view
151
- @view = action_name.to_sym
152
+ @view = Avo::ViewInquirer.new(action_name.to_s)
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,80 +198,11 @@ 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
- def eager_load_files(resource, query)
237
- # Get the non-computed file fields and try to eager load them
238
- attachment_fields = resource
239
- .attachment_fields
240
- .reject do |field|
241
- field.computed
242
- end
243
-
244
- if attachment_fields.present?
245
- attachment_fields.map do |field|
246
- attachment = case field.class.to_s
247
- when "Avo::Fields::FileField"
248
- "attachment"
249
- when "Avo::Fields::FilesField"
250
- "attachments"
251
- else
252
- "attachment"
253
- end
254
-
255
- return query.includes "#{field.id}_#{attachment}": :blob
256
- end
257
- end
258
-
259
- query
260
- end
261
-
262
201
  def _authenticate!
263
202
  instance_eval(&Avo.configuration.authenticate)
264
203
  end
265
204
 
266
- def render_unauthorized(_exception)
205
+ def render_unauthorized(exception)
267
206
  flash[:notice] = t "avo.not_authorized"
268
207
 
269
208
  redirect_url = if request.referrer.blank? || (request.referrer == request.url)
@@ -278,8 +217,8 @@ module Avo
278
217
  def set_authorization
279
218
  # We need to set @resource_name for the #resource method to work properly
280
219
  set_resource_name
281
- @authorization = if resource
282
- resource.authorization(user: _current_user)
220
+ @authorization = if @resource
221
+ @resource.authorization(user: _current_user)
283
222
  else
284
223
  Services::AuthorizationService.new _current_user
285
224
  end
@@ -301,30 +240,6 @@ module Avo
301
240
  instance_eval(&Avo.configuration.initial_breadcrumbs) if Avo.configuration.initial_breadcrumbs.present?
302
241
  end
303
242
 
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
243
  def model_param_key
329
244
  @resource.form_scope
330
245
  end
@@ -360,5 +275,29 @@ module Avo
360
275
  value = cookies["#{Avo::COOKIES_KEY}.sidebar.open"]
361
276
  @sidebar_open = value.blank? || value == "1"
362
277
  end
278
+
279
+ # Set the current host for ActiveStorage
280
+ def set_active_storage_current_host
281
+ if defined?(ActiveStorage::Current)
282
+ if Rails::VERSION::MAJOR === 6
283
+ ActiveStorage::Current.host = request.base_url
284
+ elsif Rails::VERSION::MAJOR === 7
285
+ ActiveStorage::Current.url_options = {protocol: request.protocol, host: request.host, port: request.port}
286
+ end
287
+ end
288
+ rescue => exception
289
+ Avo.logger.debug "Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
290
+ end
291
+
292
+ def set_stylesheet_assets_path
293
+ # Prefer the user's tailwind config if it exists, otherwise use the default one from Avo
294
+ @stylesheet_assets_path = if Rails.root.join("config", "avo", "tailwind.config.js").exist?
295
+ "avo.tailwind"
296
+ elsif Avo::PACKED
297
+ "/avo-assets/avo.base"
298
+ else
299
+ "avo.base"
300
+ end
301
+ end
363
302
  end
364
303
  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