avo 2.44.0 → 3.0.2

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

Potentially problematic release.


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

Files changed (411) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +28 -26
  3. data/Gemfile.lock +231 -161
  4. data/README.md +19 -27
  5. data/Rakefile +2 -0
  6. data/app/assets/stylesheets/avo.base.css +1 -1
  7. data/app/assets/svgs/font.svg +1 -0
  8. data/app/assets/svgs/triangle-up.svg +1 -0
  9. data/app/components/avo/actions_component.html.erb +19 -5
  10. data/app/components/avo/actions_component.rb +39 -19
  11. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  12. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  14. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  15. data/app/components/avo/base_component.rb +15 -12
  16. data/app/components/avo/button_component.rb +20 -3
  17. data/app/components/avo/empty_state_component.rb +1 -1
  18. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  19. data/app/components/avo/field_wrapper_component.rb +9 -15
  20. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  21. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +75 -79
  22. data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
  23. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  24. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  25. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  26. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  27. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  28. data/app/components/avo/fields/common/badge_viewer_component.rb +1 -1
  29. data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
  30. data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
  31. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  32. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
  33. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  34. data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
  35. data/app/components/avo/fields/common/heading_component.html.erb +3 -8
  36. data/app/components/avo/fields/common/heading_component.rb +1 -3
  37. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  38. data/app/components/avo/fields/common/key_value_component.rb +2 -2
  39. data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
  40. data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
  41. data/app/components/avo/fields/edit_component.rb +2 -2
  42. data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
  43. data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
  44. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  45. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  46. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  47. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  48. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  49. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
  51. data/app/components/avo/fields/index_component.rb +6 -6
  52. data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
  53. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  54. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  55. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  56. data/app/components/avo/fields/show_component.rb +5 -2
  57. data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
  58. data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
  59. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  60. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  61. data/app/components/avo/filters_component.html.erb +9 -3
  62. data/app/components/avo/filters_component.rb +4 -4
  63. data/app/components/avo/index/field_wrapper_component.rb +1 -13
  64. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  65. data/app/components/avo/index/grid_item_component.rb +43 -16
  66. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  67. data/app/components/avo/index/resource_controls_component.rb +125 -18
  68. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  69. data/app/components/avo/index/resource_grid_component.rb +5 -2
  70. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  71. data/app/components/avo/index/resource_map_component.rb +3 -3
  72. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  73. data/app/components/avo/index/resource_table_component.rb +24 -7
  74. data/app/components/avo/index/table_row_component.html.erb +9 -5
  75. data/app/components/avo/index/table_row_component.rb +3 -2
  76. data/app/components/avo/items/panel_component.html.erb +25 -0
  77. data/app/components/avo/items/panel_component.rb +43 -0
  78. data/app/components/avo/items/switcher_component.html.erb +17 -0
  79. data/app/components/avo/items/switcher_component.rb +79 -0
  80. data/app/components/avo/items/visible_items_component.html.erb +10 -0
  81. data/app/components/avo/items/visible_items_component.rb +11 -0
  82. data/app/components/avo/modal_component.html.erb +3 -4
  83. data/app/components/avo/paginator_component.html.erb +29 -40
  84. data/app/components/avo/paginator_component.rb +23 -5
  85. data/app/components/avo/panel_component.html.erb +7 -5
  86. data/app/components/avo/referrer_params_component.html.erb +1 -1
  87. data/app/components/avo/resource_component.rb +205 -26
  88. data/app/components/avo/resource_sidebar_component.html.erb +15 -18
  89. data/app/components/avo/resource_sidebar_component.rb +5 -3
  90. data/app/components/avo/sidebar/link_component.rb +1 -1
  91. data/app/components/avo/sidebar_component.html.erb +10 -3
  92. data/app/components/avo/sidebar_component.rb +5 -3
  93. data/app/components/avo/sidebar_profile_component.html.erb +18 -12
  94. data/app/components/avo/tab_group_component.html.erb +14 -8
  95. data/app/components/avo/tab_group_component.rb +1 -6
  96. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  97. data/app/components/avo/tab_switcher_component.rb +6 -41
  98. data/app/components/avo/views/resource_edit_component.html.erb +23 -84
  99. data/app/components/avo/views/resource_edit_component.rb +20 -19
  100. data/app/components/avo/views/resource_index_component.html.erb +42 -47
  101. data/app/components/avo/views/resource_index_component.rb +76 -13
  102. data/app/components/avo/views/resource_show_component.html.erb +16 -177
  103. data/app/components/avo/views/resource_show_component.rb +16 -10
  104. data/app/controllers/avo/actions_controller.rb +29 -31
  105. data/app/controllers/avo/application_controller.rb +119 -181
  106. data/app/controllers/avo/associations_controller.rb +34 -43
  107. data/app/controllers/avo/attachments_controller.rb +4 -4
  108. data/app/controllers/avo/base_controller.rb +145 -98
  109. data/app/controllers/avo/debug_controller.rb +17 -5
  110. data/app/controllers/avo/home_controller.rb +1 -1
  111. data/app/controllers/avo/search_controller.rb +56 -50
  112. data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
  113. data/app/helpers/avo/application_helper.rb +18 -8
  114. data/app/helpers/avo/resources_helper.rb +1 -1
  115. data/app/helpers/avo/url_helpers.rb +28 -12
  116. data/app/javascript/avo.base.js +1 -0
  117. data/app/javascript/js/controllers/action_controller.js +3 -1
  118. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  119. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
  120. data/app/javascript/js/controllers/filter_controller.js +1 -1
  121. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  122. data/app/javascript/js/controllers/preview_controller.js +24 -0
  123. data/app/javascript/js/controllers/search_controller.js +4 -2
  124. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  125. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  126. data/app/javascript/js/controllers.js +11 -5
  127. data/app/javascript/js/custom-stream-actions.js +15 -0
  128. data/app/views/avo/actions/show.html.erb +9 -5
  129. data/app/views/avo/associations/new.html.erb +2 -2
  130. data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
  131. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
  132. data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
  133. data/app/views/avo/base/edit.html.erb +1 -1
  134. data/app/views/avo/base/index.html.erb +4 -3
  135. data/app/views/avo/base/new.html.erb +2 -1
  136. data/app/views/avo/base/preview.html.erb +19 -0
  137. data/app/views/avo/base/show.html.erb +2 -2
  138. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  139. data/app/views/avo/debug/report.html.erb +32 -17
  140. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  141. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  142. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +1 -1
  143. data/app/views/avo/partials/_footer.html.erb +1 -1
  144. data/app/views/avo/partials/_javascript.html.erb +5 -0
  145. data/app/views/avo/partials/_logo.html.erb +1 -1
  146. data/app/views/avo/partials/_navbar.html.erb +3 -5
  147. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  148. data/app/views/avo/partials/_table_header.html.erb +5 -11
  149. data/app/views/layouts/avo/application.html.erb +5 -4
  150. data/avo.gemspec +10 -8
  151. data/bin/dev +3 -1
  152. data/bin/prod +0 -0
  153. data/config/i18n-tasks.yml +1 -1
  154. data/config/initializers/pagy.rb +2 -0
  155. data/config/master.key +1 -0
  156. data/config/routes.rb +7 -10
  157. data/db/factories.rb +6 -0
  158. data/lib/avo/asset_manager.rb +30 -0
  159. data/lib/avo/base_action.rb +78 -60
  160. data/lib/avo/base_resource.rb +286 -225
  161. data/lib/avo/base_resource_tool.rb +9 -16
  162. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  163. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  164. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  165. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  166. data/lib/avo/concerns/has_controls.rb +37 -0
  167. data/lib/avo/concerns/has_description.rb +23 -0
  168. data/lib/avo/concerns/has_helpers.rb +18 -0
  169. data/lib/avo/concerns/has_item_type.rb +42 -0
  170. data/lib/avo/concerns/has_items.rb +339 -0
  171. data/lib/avo/concerns/hydration.rb +17 -0
  172. data/lib/avo/concerns/is_resource_item.rb +16 -36
  173. data/lib/avo/concerns/is_visible.rb +15 -0
  174. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  175. data/lib/avo/concerns/pagination.rb +53 -0
  176. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  177. data/lib/avo/concerns/visible_items.rb +7 -38
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +28 -11
  180. data/lib/avo/current.rb +39 -0
  181. data/lib/avo/dsl/field_parser.rb +3 -3
  182. data/lib/avo/dynamic_router.rb +18 -3
  183. data/lib/avo/engine.rb +35 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +14 -15
  186. data/lib/avo/fields/base_field.rb +84 -121
  187. data/lib/avo/fields/belongs_to_field.rb +19 -23
  188. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  189. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  190. data/lib/avo/fields/concerns/has_default.rb +1 -5
  191. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  192. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  193. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  194. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  195. data/lib/avo/fields/concerns/is_required.rb +5 -7
  196. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  199. data/lib/avo/fields/country_field.rb +4 -0
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/external_image_field.rb +2 -2
  202. data/lib/avo/fields/field_manager.rb +55 -0
  203. data/lib/avo/fields/file_field.rb +2 -2
  204. data/lib/avo/fields/gravatar_field.rb +2 -2
  205. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  206. data/lib/avo/fields/has_base_field.rb +21 -17
  207. data/lib/avo/fields/has_many_field.rb +5 -2
  208. data/lib/avo/fields/has_one_field.rb +8 -12
  209. data/lib/avo/fields/heading_field.rb +9 -14
  210. data/lib/avo/fields/hidden_field.rb +1 -1
  211. data/lib/avo/fields/id_field.rb +3 -3
  212. data/lib/avo/fields/location_field.rb +10 -10
  213. data/lib/avo/fields/password_field.rb +1 -1
  214. data/lib/avo/fields/preview_field.rb +14 -0
  215. data/lib/avo/fields/select_field.rb +12 -8
  216. data/lib/avo/fields/status_field.rb +7 -1
  217. data/lib/avo/fields/text_field.rb +2 -2
  218. data/lib/avo/filters/base_filter.rb +9 -4
  219. data/lib/avo/html/builder.rb +8 -8
  220. data/lib/avo/item_grapher.rb +78 -0
  221. data/lib/avo/licensing/h_q.rb +11 -73
  222. data/lib/avo/licensing/license.rb +5 -1
  223. data/lib/avo/licensing/license_manager.rb +1 -1
  224. data/lib/avo/licensing/pro_license.rb +1 -7
  225. data/lib/avo/loaders/fields_loader.rb +7 -1
  226. data/lib/avo/plugin.rb +36 -0
  227. data/lib/avo/plugin_manager.rb +56 -0
  228. data/lib/avo/prefixed_test_helpers.rb +20 -0
  229. data/lib/avo/reloader.rb +3 -0
  230. data/lib/avo/resources/controls/actions_list.rb +7 -12
  231. data/lib/avo/resources/controls/attach_button.rb +15 -0
  232. data/lib/avo/resources/controls/back_button.rb +1 -1
  233. data/lib/avo/resources/controls/base_control.rb +15 -49
  234. data/lib/avo/resources/controls/create_button.rb +15 -0
  235. data/lib/avo/resources/controls/delete_button.rb +5 -1
  236. data/lib/avo/resources/controls/detach_button.rb +4 -1
  237. data/lib/avo/resources/controls/edit_button.rb +4 -1
  238. data/lib/avo/resources/controls/order_controls.rb +8 -0
  239. data/lib/avo/resources/controls/save_button.rb +13 -0
  240. data/lib/avo/resources/controls/show_button.rb +15 -0
  241. data/lib/avo/resources/items/holder.rb +96 -0
  242. data/lib/avo/resources/items/item_group.rb +44 -0
  243. data/lib/avo/resources/items/main_panel.rb +12 -0
  244. data/lib/avo/resources/items/panel.rb +2 -0
  245. data/lib/avo/resources/items/row.rb +42 -0
  246. data/lib/avo/resources/items/sidebar.rb +46 -0
  247. data/lib/avo/resources/items/tab.rb +54 -0
  248. data/lib/avo/resources/items/tab_group.rb +62 -0
  249. data/lib/avo/resources/resource_manager.rb +179 -0
  250. data/lib/avo/services/authorization_service.rb +11 -110
  251. data/lib/avo/services/debug_service.rb +93 -0
  252. data/lib/avo/services/encryption_service.rb +8 -12
  253. data/lib/avo/services/telemetry_service.rb +85 -0
  254. data/lib/avo/test_helpers.rb +362 -0
  255. data/lib/avo/tools/tool_manager.rb +30 -0
  256. data/lib/avo/version.rb +1 -1
  257. data/lib/avo/view_inquirer.rb +36 -0
  258. data/lib/avo.rb +109 -24
  259. data/lib/generators/avo/action_generator.rb +8 -8
  260. data/lib/generators/avo/card_generator.rb +27 -0
  261. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  262. data/lib/generators/avo/controller_generator.rb +3 -0
  263. data/lib/generators/avo/eject_generator.rb +180 -15
  264. data/lib/generators/avo/field_generator.rb +49 -2
  265. data/lib/generators/avo/filter_generator.rb +8 -8
  266. data/lib/generators/avo/js/install_generator.rb +2 -2
  267. data/lib/generators/avo/resource_generator.rb +12 -9
  268. data/lib/generators/avo/scope_generator.rb +15 -0
  269. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  270. data/lib/generators/avo/templates/action.tt +8 -6
  271. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  272. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  273. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  274. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  275. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  276. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  277. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  278. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  279. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  280. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  281. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  282. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  283. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  284. data/lib/generators/avo/templates/locales/avo.ar.yml +7 -6
  285. data/lib/generators/avo/templates/locales/avo.en.yml +6 -3
  286. data/lib/generators/avo/templates/locales/avo.es.yml +127 -0
  287. data/lib/generators/avo/templates/locales/avo.fr.yml +3 -0
  288. data/lib/generators/avo/templates/locales/avo.nb.yml +3 -0
  289. data/lib/generators/avo/templates/locales/avo.nn.yml +3 -0
  290. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +3 -0
  291. data/lib/generators/avo/templates/locales/avo.pt.yml +3 -0
  292. data/lib/generators/avo/templates/locales/avo.ro.yml +8 -5
  293. data/lib/generators/avo/templates/locales/avo.tr.yml +3 -0
  294. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  295. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  296. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  297. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  298. data/lib/generators/avo/templates/scope.tt +6 -0
  299. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  300. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  301. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  302. data/lib/tasks/avo_tasks.rake +72 -4
  303. data/public/avo-assets/avo.base.css +1893 -1187
  304. data/public/avo-assets/avo.base.js +217 -305
  305. data/public/avo-assets/avo.base.js.map +3 -3
  306. data/public/avo-assets/avo.css +9744 -0
  307. data/public/avo-assets/avo.js +513 -0
  308. data/public/avo-assets/avo.js.map +7 -0
  309. data/tailwind.custom.js +47 -0
  310. data/tailwind.preset.js +152 -0
  311. metadata +107 -114
  312. data/app/components/avo/card_component.html.erb +0 -46
  313. data/app/components/avo/card_component.rb +0 -25
  314. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  315. data/app/components/avo/dashboards/divider_component.rb +0 -19
  316. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  317. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  318. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  319. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  320. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  321. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  322. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  323. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  324. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  325. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  326. data/app/components/avo/index/ordering/base_component.rb +0 -9
  327. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  328. data/app/components/avo/index/ordering/button_component.rb +0 -23
  329. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  330. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  331. data/app/components/avo/item_switcher_component.html.erb +0 -27
  332. data/app/components/avo/item_switcher_component.rb +0 -48
  333. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  334. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  335. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  336. data/app/controllers/avo/dashboards_controller.rb +0 -22
  337. data/app/controllers/avo/reorder_controller.rb +0 -25
  338. data/app/javascript/js/controllers/base_controller.js +0 -22
  339. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  340. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  341. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  342. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  343. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  344. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  345. data/app/views/avo/dashboards/show.html.erb +0 -38
  346. data/app/views/avo/partials/_global_search.html.erb +0 -19
  347. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  348. data/lib/avo/app.rb +0 -237
  349. data/lib/avo/base_card.rb +0 -161
  350. data/lib/avo/concerns/fetches_things.rb +0 -150
  351. data/lib/avo/concerns/handles_field_args.rb +0 -47
  352. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  353. data/lib/avo/concerns/has_fields.rb +0 -334
  354. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  355. data/lib/avo/concerns/policy_helpers.rb +0 -31
  356. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  357. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  358. data/lib/avo/dashboards/base_divider.rb +0 -35
  359. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  360. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  361. data/lib/avo/dashboards/metric_card.rb +0 -9
  362. data/lib/avo/dashboards/partial_card.rb +0 -7
  363. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  364. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  365. data/lib/avo/fields/tags_field.rb +0 -102
  366. data/lib/avo/grid_collector.rb +0 -42
  367. data/lib/avo/hosts/association_scope_host.rb +0 -8
  368. data/lib/avo/hosts/base_host.rb +0 -25
  369. data/lib/avo/hosts/card_visibility.rb +0 -20
  370. data/lib/avo/hosts/dashboard_card.rb +0 -22
  371. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  372. data/lib/avo/hosts/ordering.rb +0 -22
  373. data/lib/avo/hosts/record_host.rb +0 -7
  374. data/lib/avo/hosts/resource_record_host.rb +0 -7
  375. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  376. data/lib/avo/hosts/search_scope_host.rb +0 -7
  377. data/lib/avo/hosts/view_record_host.rb +0 -7
  378. data/lib/avo/hosts/visibility_host.rb +0 -12
  379. data/lib/avo/items_holder.rb +0 -96
  380. data/lib/avo/main_panel.rb +0 -3
  381. data/lib/avo/menu/base_item.rb +0 -25
  382. data/lib/avo/menu/builder.rb +0 -82
  383. data/lib/avo/menu/dashboard.rb +0 -22
  384. data/lib/avo/menu/group.rb +0 -2
  385. data/lib/avo/menu/link.rb +0 -6
  386. data/lib/avo/menu/menu.rb +0 -2
  387. data/lib/avo/menu/resource.rb +0 -22
  388. data/lib/avo/menu/section.rb +0 -2
  389. data/lib/avo/panel.rb +0 -24
  390. data/lib/avo/panel_builder.rb +0 -25
  391. data/lib/avo/resources/controls/action.rb +0 -38
  392. data/lib/avo/resources/controls/execution_context.rb +0 -58
  393. data/lib/avo/resources/controls/items_holder.rb +0 -19
  394. data/lib/avo/resources/controls/link_to.rb +0 -27
  395. data/lib/avo/row.rb +0 -26
  396. data/lib/avo/row_builder.rb +0 -24
  397. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  398. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  399. data/lib/avo/sidebar.rb +0 -30
  400. data/lib/avo/sidebar_builder.rb +0 -24
  401. data/lib/avo/tab.rb +0 -72
  402. data/lib/avo/tab_builder.rb +0 -25
  403. data/lib/avo/tab_group.rb +0 -42
  404. data/lib/avo/tab_group_builder.rb +0 -43
  405. data/lib/avo/tools_manager.rb +0 -11
  406. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  407. data/lib/generators/avo/card/metric_generator.rb +0 -18
  408. data/lib/generators/avo/card/partial_generator.rb +0 -19
  409. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  410. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  411. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -6,7 +6,7 @@ module Avo
6
6
  Avo::ApplicationController.include Pundit
7
7
  end
8
8
 
9
- include Pagy::Backend
9
+ include Avo::InitializesAvo
10
10
  include Avo::ApplicationHelper
11
11
  include Avo::UrlHelpers
12
12
  include Avo::Concerns::Breadcrumbs
@@ -16,7 +16,7 @@ module Avo
16
16
  around_action :set_force_locale, if: -> { params[:force_locale].present? }
17
17
  before_action :set_default_locale, if: -> { params[:set_locale].present? }
18
18
  before_action :init_app
19
- before_action :check_avo_license
19
+ before_action :set_active_storage_current_host
20
20
  before_action :set_resource_name
21
21
  before_action :_authenticate!
22
22
  before_action :set_authorization
@@ -24,19 +24,14 @@ module Avo
24
24
  before_action :add_initial_breadcrumbs
25
25
  before_action :set_view
26
26
  before_action :set_sidebar_open
27
+ before_action :set_stylesheet_assets_path
27
28
 
28
29
  rescue_from Avo::NotAuthorizedError, with: :render_unauthorized
29
30
  rescue_from ActiveRecord::RecordInvalid, with: :exception_logger
30
31
 
31
- 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
32
33
  add_flash_types :info, :warning, :success, :error
33
34
 
34
- def init_app
35
- Avo::App.init request: request, context: context, current_user: _current_user, view_context: view_context, params: params
36
-
37
- @license = Avo::App.license
38
- end
39
-
40
35
  def exception_logger(exception)
41
36
  respond_to do |format|
42
37
  format.html { raise exception }
@@ -50,49 +45,6 @@ module Avo
50
45
  end
51
46
  end
52
47
 
53
- def render(*args)
54
- raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:check_avo_license).source_location.first.match?(/.*\/app\/controllers\/avo\/application_controller\.rb/)
55
-
56
- if params[:controller] == "avo/search" && params[:action] == "index"
57
- raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:index).source_location.first.match?(/.*\/app\/controllers\/avo\/search_controller\.rb/)
58
- end
59
-
60
- if params[:controller] == "avo/dashboards" && params[:action] == "show"
61
- raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:show).source_location.first.match?(/.*\/app\/controllers\/avo\/dashboards_controller\.rb/)
62
- end
63
-
64
- if params[:controller] == "avo/dashboards" && params[:action] == "card"
65
- raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:card).source_location.first.match?(/.*\/app\/controllers\/avo\/dashboards_controller\.rb/)
66
- end
67
-
68
- super(*args)
69
- end
70
-
71
- def check_avo_license
72
- # Check to see if the path is a custom tool
73
- if on_custom_tool_page
74
- if @license.lacks(:custom_tools) || @license.invalid?
75
- message = "Your license is invalid or doesn't support custom tools."
76
- end
77
- end
78
-
79
- # Check to see if the path is a dashboard
80
- if on_dashboards_path
81
- if @license.lacks(:dashboards) || @license.invalid?
82
- message = "Your license is invalid or doesn't support dashboards."
83
- end
84
- end
85
-
86
- if message.present?
87
- if Rails.env.development? || Rails.env.test?
88
- @custom_tools_alert_visible = message
89
- elsif @license.lacks_with_trial(:custom_tools)
90
- # Raise error in non-development environments.
91
- raise Avo::LicenseInvalidError, message
92
- end
93
- end
94
- end
95
-
96
48
  def _current_user
97
49
  instance_eval(&Avo.configuration.current_user)
98
50
  end
@@ -109,6 +61,49 @@ module Avo
109
61
 
110
62
  private
111
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
+
112
107
  def set_resource_name
113
108
  @resource_name = resource_name
114
109
  end
@@ -120,66 +115,78 @@ module Avo
120
115
  def set_resource
121
116
  raise ActionController::RoutingError.new "No route matches" if resource.nil?
122
117
 
123
- @resource = resource.hydrate(params: params)
124
- end
118
+ @resource = resource.new(view: params[:view] || action_name.to_s, user: _current_user, params: params)
125
119
 
126
- def set_related_resource
127
- @related_resource = related_resource.hydrate(params: params)
120
+ set_authorization
128
121
  end
129
122
 
130
- def set_model
131
- @model = @resource.find_record(params[:id], query: model_find_scope, params: params)
123
+ def detect_fields
124
+ @resource.detect_fields
132
125
  end
133
126
 
134
- def model_find_scope
135
- 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
136
129
  end
137
130
 
138
- def model_scope
139
- @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)
140
134
  end
141
135
 
142
- def set_related_model
143
- association_name = BaseResource.valid_association_name(@model, params[:related_name])
144
- @related_model = if @field.is_a? Avo::Fields::HasOneField
145
- @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
146
140
  else
147
- @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
148
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
149
149
  end
150
150
 
151
151
  def set_view
152
- @view = action_name.to_sym
152
+ @view = Avo::ViewInquirer.new(action_name.to_s)
153
153
  end
154
154
 
155
- def set_model_to_fill
156
- @model_to_fill = @resource.model_class.new if @view == :create
157
- @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?
158
158
 
159
- # If resource.model is nil, most likely the user is creating a new record.
160
- # In that case, to access resource.model in visible and readonly blocks we hydrate the resource with a new model.
161
- @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?
162
163
  end
163
164
 
164
- def fill_model
165
- # We have to skip filling the the model if this is an attach action
166
- 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?
167
168
 
168
- unless is_attach_action
169
- @model = @resource.fill_model(@model_to_fill, cast_nullable(model_params), extra_params: extra_params)
170
- 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?
171
171
  end
172
172
 
173
- def hydrate_resource
174
- @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?
175
175
  end
176
176
 
177
- def hydrate_related_resource
178
- @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
179
186
  end
180
187
 
181
188
  def authorize_base_action
182
- class_to_authorize = @model || @resource.model_class
189
+ class_to_authorize = @record || @resource.model_class
183
190
 
184
191
  authorize_action class_to_authorize
185
192
  end
@@ -191,80 +198,11 @@ module Avo
191
198
  @authorization.set_record(class_to_authorize).authorize_action action_to_authorize.to_sym
192
199
  end
193
200
 
194
- # Get the pluralized resource name for this request
195
- # Ex: projects, teams, users
196
- def resource_name
197
- return params[:resource_name] if params[:resource_name].present?
198
-
199
- return controller_name if controller_name.present?
200
-
201
- begin
202
- request.path
203
- .match(/\/?#{Avo::App.root_path.delete('/')}\/resources\/([a-z1-9\-_]*)\/?/mi)
204
- .captures
205
- .first
206
- rescue
207
- end
208
- end
209
-
210
- def related_resource_name
211
- params[:related_name]
212
- end
213
-
214
- # Gets the Avo resource for this request based on the request from the `resource_name` "param"
215
- # Ex: Avo::Resources::Project, Avo::Resources::Team, Avo::Resources::User
216
- def resource
217
- resource = App.get_resource @resource_name.to_s.camelize.singularize
218
-
219
- return resource if resource.present?
220
-
221
- App.get_resource_by_controller_name @resource_name
222
- end
223
-
224
- def related_resource
225
- # Find the field from the parent resource
226
- field = @resource.get_field params[:related_name]
227
-
228
- return field.use_resource if field&.use_resource.present?
229
-
230
- reflection = @model._reflections[params[:related_name]]
231
-
232
- reflected_model = reflection.klass
233
-
234
- App.get_resource_by_model_name reflected_model
235
- end
236
-
237
- def eager_load_files(resource, query)
238
- # Get the non-computed file fields and try to eager load them
239
- attachment_fields = resource
240
- .attachment_fields
241
- .reject do |field|
242
- field.computed
243
- end
244
-
245
- if attachment_fields.present?
246
- attachment_fields.map do |field|
247
- attachment = case field.class.to_s
248
- when "Avo::Fields::FileField"
249
- "attachment"
250
- when "Avo::Fields::FilesField"
251
- "attachments"
252
- else
253
- "attachment"
254
- end
255
-
256
- return query.includes "#{field.id}_#{attachment}": :blob
257
- end
258
- end
259
-
260
- query
261
- end
262
-
263
201
  def _authenticate!
264
202
  instance_eval(&Avo.configuration.authenticate)
265
203
  end
266
204
 
267
- def render_unauthorized(_exception)
205
+ def render_unauthorized(exception)
268
206
  flash[:notice] = t "avo.not_authorized"
269
207
 
270
208
  redirect_url = if request.referrer.blank? || (request.referrer == request.url)
@@ -279,8 +217,8 @@ module Avo
279
217
  def set_authorization
280
218
  # We need to set @resource_name for the #resource method to work properly
281
219
  set_resource_name
282
- @authorization = if resource
283
- resource.authorization(user: _current_user)
220
+ @authorization = if @resource
221
+ @resource.authorization(user: _current_user)
284
222
  else
285
223
  Services::AuthorizationService.new _current_user
286
224
  end
@@ -302,30 +240,6 @@ module Avo
302
240
  instance_eval(&Avo.configuration.initial_breadcrumbs) if Avo.configuration.initial_breadcrumbs.present?
303
241
  end
304
242
 
305
- def on_root_path
306
- [Avo.configuration.root_path, "#{Avo.configuration.root_path}/"].include?(request.original_fullpath)
307
- end
308
-
309
- def on_resources_path
310
- request.original_url.match?(/.*#{Avo.configuration.root_path}\/resources\/.*/)
311
- end
312
-
313
- def on_api_path
314
- request.original_url.match?(/.*#{Avo.configuration.root_path}\/avo_api\/.*/)
315
- end
316
-
317
- def on_dashboards_path
318
- request.original_url.match?(/.*#{Avo.configuration.root_path}\/dashboards\/.*/)
319
- end
320
-
321
- def on_debug_path
322
- request.original_url.match?(/.*#{Avo.configuration.root_path}\/avo_private\/debug.*/)
323
- end
324
-
325
- def on_custom_tool_page
326
- !(on_root_path || on_resources_path || on_api_path || on_dashboards_path || on_debug_path)
327
- end
328
-
329
243
  def model_param_key
330
244
  @resource.form_scope
331
245
  end
@@ -361,5 +275,29 @@ module Avo
361
275
  value = cookies["#{Avo::COOKIES_KEY}.sidebar.open"]
362
276
  @sidebar_open = value.blank? || value == "1"
363
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
364
302
  end
365
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).destroy @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