avo 0.5.0.beta5 → 0.5.0.beta10

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 (275) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +47 -48
  3. data/Gemfile.lock +28 -22
  4. data/Rakefile +14 -14
  5. data/app/components/avo/common/badge_viewer_component.html.erb +1 -1
  6. data/app/components/avo/common/gravatar_viewer_component.html.erb +2 -2
  7. data/app/components/avo/common/gravatar_viewer_component.rb +2 -1
  8. data/app/components/avo/common/multiple_file_viewer_component.rb +1 -1
  9. data/app/components/avo/common/single_file_viewer_component.rb +1 -1
  10. data/app/components/avo/edit/field_wrapper_component.rb +3 -3
  11. data/app/components/avo/edit/fields/trix_field_component.html.erb +1 -1
  12. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  13. data/app/components/avo/index/field_wrapper_component.rb +1 -1
  14. data/app/components/avo/index/fields/belongs_to_field_component.html.erb +1 -5
  15. data/app/components/avo/index/fields/boolean_group_field_component.html.erb +1 -1
  16. data/app/components/avo/index/fields/gravatar_field_component.html.erb +2 -1
  17. data/app/components/avo/index/fields/has_one_field_component.html.erb +1 -5
  18. data/app/components/avo/index/fields/id_field_component.html.erb +1 -1
  19. data/app/components/avo/index/grid_item_component.html.erb +2 -2
  20. data/app/components/avo/index/grid_item_component.rb +10 -9
  21. data/app/components/avo/index/resource_controls_component.html.erb +12 -4
  22. data/app/components/avo/index/resource_controls_component.rb +2 -2
  23. data/app/components/avo/panel_component.rb +7 -6
  24. data/app/components/avo/resource_component.rb +4 -3
  25. data/app/components/avo/show/field_wrapper_component.html.erb +1 -1
  26. data/app/components/avo/show/field_wrapper_component.rb +3 -3
  27. data/app/components/avo/show/fields/boolean_group_field_component.html.erb +1 -1
  28. data/app/components/avo/show/fields/external_image_field_component.html.erb +1 -1
  29. data/app/components/avo/views/resource_edit_component.rb +4 -3
  30. data/app/components/avo/views/resource_index_component.rb +8 -7
  31. data/app/components/avo/views/resource_new_component.rb +4 -3
  32. data/app/components/avo/views/resource_show_component.html.erb +14 -2
  33. data/app/components/avo/views/resource_show_component.rb +21 -21
  34. data/app/controllers/avo/actions_controller.rb +34 -33
  35. data/app/controllers/avo/application_controller.rb +124 -116
  36. data/app/controllers/avo/attachments_controller.rb +3 -3
  37. data/app/controllers/avo/base_controller.rb +80 -87
  38. data/app/controllers/avo/home_controller.rb +2 -2
  39. data/app/controllers/avo/relations_controller.rb +29 -28
  40. data/app/controllers/avo/resources_controller.rb +1 -1
  41. data/app/controllers/avo/search_controller.rb +20 -19
  42. data/app/helpers/avo/application_helper.rb +49 -43
  43. data/app/helpers/avo/resources_helper.rb +11 -11
  44. data/app/mailers/avo/application_mailer.rb +2 -2
  45. data/app/{frontend/css → packs/entrypoints}/application.css +12 -11
  46. data/app/{frontend/packs → packs/entrypoints}/application.js +9 -3
  47. data/app/{frontend → packs}/fonts/nunito-v16-latin-700.eot +0 -0
  48. data/app/{frontend → packs}/fonts/nunito-v16-latin-700.svg +0 -0
  49. data/app/{frontend → packs}/fonts/nunito-v16-latin-700.ttf +0 -0
  50. data/app/{frontend → packs}/fonts/nunito-v16-latin-700.woff +0 -0
  51. data/app/{frontend → packs}/fonts/nunito-v16-latin-700.woff2 +0 -0
  52. data/app/{frontend → packs}/fonts/nunito-v16-latin-regular.eot +0 -0
  53. data/app/{frontend → packs}/fonts/nunito-v16-latin-regular.svg +0 -0
  54. data/app/{frontend → packs}/fonts/nunito-v16-latin-regular.ttf +0 -0
  55. data/app/{frontend → packs}/fonts/nunito-v16-latin-regular.woff +0 -0
  56. data/app/{frontend → packs}/fonts/nunito-v16-latin-regular.woff2 +0 -0
  57. data/app/{frontend → packs}/images/logo.png +0 -0
  58. data/app/{frontend → packs}/importmap.json.erb +0 -0
  59. data/app/{frontend → packs}/js/controllers/action_controller.js +0 -0
  60. data/app/{frontend → packs}/js/controllers/actions_picker_controller.js +0 -0
  61. data/app/{frontend → packs}/js/controllers/alerts_controller.js +0 -0
  62. data/app/{frontend → packs}/js/controllers/attachments_controller.js +0 -0
  63. data/app/{frontend → packs}/js/controllers/boolean_filter_controller.js +0 -0
  64. data/app/{frontend → packs}/js/controllers/fields/code_field_controller.js +14 -14
  65. data/app/{frontend → packs}/js/controllers/fields/date_field_controller.js +0 -0
  66. data/app/{frontend → packs}/js/controllers/fields/simple_mde_controller.js +0 -0
  67. data/app/{frontend → packs}/js/controllers/filter_controller.js +20 -3
  68. data/app/{frontend → packs}/js/controllers/hidden_input_controller.js +0 -0
  69. data/app/{frontend → packs}/js/controllers/item_selector_controller.js +0 -0
  70. data/app/{frontend → packs}/js/controllers/modal_controller.js +0 -0
  71. data/app/{frontend → packs}/js/controllers/per_page_controller.js +5 -1
  72. data/app/{frontend → packs}/js/controllers/select_filter_controller.js +0 -0
  73. data/app/{frontend → packs}/js/controllers/tippy_controller.js +0 -0
  74. data/app/{frontend → packs}/js/controllers/toggle_panel_controller.js +0 -0
  75. data/app/{frontend → packs}/js/helpers/cast_boolean.js +0 -0
  76. data/app/{frontend → packs}/js/toastr.js +1 -0
  77. data/app/{frontend/css → packs/stylesheets}/alerts.css +0 -0
  78. data/app/packs/stylesheets/components/code.css +11 -0
  79. data/app/{frontend/css → packs/stylesheets}/components/status.css +0 -0
  80. data/app/{frontend/css → packs/stylesheets}/fonts.css +0 -0
  81. data/app/{frontend/css → packs/stylesheets}/loader.css +0 -0
  82. data/app/{frontend/css → packs/stylesheets}/pagination.css +0 -0
  83. data/app/{frontend/css → packs/stylesheets}/tailwindcss/base.css +0 -0
  84. data/app/{frontend/css → packs/stylesheets}/tailwindcss/components.css +0 -0
  85. data/app/{frontend/css → packs/stylesheets}/tailwindcss/utilities.css +0 -0
  86. data/app/{frontend/css → packs/stylesheets}/tooltips.css +0 -0
  87. data/app/{frontend/css → packs/stylesheets}/typography.css +0 -0
  88. data/app/{frontend → packs}/svgs/arrow-circle-right.svg +0 -0
  89. data/app/{frontend → packs}/svgs/arrow-left.svg +0 -0
  90. data/app/{frontend → packs}/svgs/avocado.svg +0 -0
  91. data/app/{frontend → packs}/svgs/badge-check-sm.svg +0 -0
  92. data/app/{frontend → packs}/svgs/check-circle.svg +0 -0
  93. data/app/{frontend → packs}/svgs/chevron-down.svg +0 -0
  94. data/app/{frontend → packs}/svgs/chevron-up.svg +0 -0
  95. data/app/{frontend → packs}/svgs/code.svg +0 -0
  96. data/app/{frontend → packs}/svgs/color-swatch.svg +0 -0
  97. data/app/{frontend → packs}/svgs/document-text.svg +0 -0
  98. data/app/{frontend → packs}/svgs/download.svg +0 -0
  99. data/app/{frontend → packs}/svgs/edit.svg +0 -0
  100. data/app/{frontend → packs}/svgs/exclamation-circle-sm.svg +0 -0
  101. data/app/{frontend → packs}/svgs/exclamation-sm.svg +0 -0
  102. data/app/{frontend → packs}/svgs/exclamation.svg +0 -0
  103. data/app/{frontend → packs}/svgs/eye.svg +0 -0
  104. data/app/{frontend → packs}/svgs/filter.svg +0 -0
  105. data/app/{frontend → packs}/svgs/fire.svg +0 -0
  106. data/app/{frontend → packs}/svgs/game-board.svg +0 -0
  107. data/app/{frontend → packs}/svgs/globe.svg +0 -0
  108. data/app/{frontend → packs}/svgs/information-circle-sm.svg +0 -0
  109. data/app/{frontend → packs}/svgs/information-circle.svg +0 -0
  110. data/app/{frontend → packs}/svgs/library.svg +0 -0
  111. data/app/{frontend → packs}/svgs/photograph.svg +0 -0
  112. data/app/{frontend → packs}/svgs/play.svg +0 -0
  113. data/app/{frontend → packs}/svgs/plus-circle.svg +0 -0
  114. data/app/{frontend → packs}/svgs/plus.svg +0 -0
  115. data/app/{frontend → packs}/svgs/question-mark-circle.svg +0 -0
  116. data/app/{frontend → packs}/svgs/save.svg +0 -0
  117. data/app/{frontend → packs}/svgs/selector.svg +0 -0
  118. data/app/{frontend → packs}/svgs/sort-ascending.svg +0 -0
  119. data/app/{frontend → packs}/svgs/sort-descending.svg +0 -0
  120. data/app/{frontend → packs}/svgs/switch-horizontal.svg +0 -0
  121. data/app/{frontend → packs}/svgs/thumbs-down.svg +0 -0
  122. data/app/{frontend → packs}/svgs/thumbs-up.svg +0 -0
  123. data/app/{frontend → packs}/svgs/times.svg +0 -0
  124. data/app/{frontend → packs}/svgs/trash-sm.svg +0 -0
  125. data/app/{frontend → packs}/svgs/trash.svg +0 -0
  126. data/app/{frontend → packs}/svgs/view-grid-add.svg +0 -0
  127. data/app/{frontend → packs}/svgs/view-grid.svg +0 -0
  128. data/app/{frontend → packs}/svgs/view-list.svg +0 -0
  129. data/app/{frontend → packs}/svgs/x-circle.svg +0 -0
  130. data/app/views/avo/actions/show.html.erb +3 -39
  131. data/app/views/avo/attachments/show.html.erb +8 -1
  132. data/app/views/avo/base/_boolean_filter.html.erb +1 -0
  133. data/app/views/avo/base/_filters.html.erb +1 -0
  134. data/app/views/avo/base/_select_filter.html.erb +1 -0
  135. data/app/views/avo/partials/_paginator.html.erb +24 -5
  136. data/app/views/avo/relations/new.html.erb +5 -1
  137. data/app/views/layouts/avo/application.html.erb +0 -5
  138. data/avo.gemspec +31 -31
  139. data/bin/helpers.rb +0 -0
  140. data/bin/rspec +1 -0
  141. data/bin/webpack +3 -1
  142. data/config/initializers/inline_svg.rb +1 -1
  143. data/config/initializers/pagy.rb +1 -1
  144. data/config/routes.rb +12 -12
  145. data/config/spring.rb +5 -5
  146. data/config/webpack/aliases.js +1 -1
  147. data/config/webpack/base.js +14 -0
  148. data/config/webpack/development.js +2 -2
  149. data/config/webpack/production.js +2 -2
  150. data/config/webpack/test.js +2 -2
  151. data/config/webpacker.yml +5 -44
  152. data/db/factories.rb +4 -5
  153. data/lib/avo.rb +6 -6
  154. data/lib/avo/action_model.rb +20 -0
  155. data/lib/avo/app.rb +34 -62
  156. data/lib/avo/base_action.rb +56 -45
  157. data/lib/avo/base_resource.rb +69 -93
  158. data/lib/avo/configuration.rb +16 -22
  159. data/lib/avo/engine.rb +30 -14
  160. data/lib/avo/fields/badge_field.rb +2 -2
  161. data/lib/avo/fields/base_field.rb +38 -29
  162. data/lib/avo/fields/belongs_to_field.rb +13 -12
  163. data/lib/avo/fields/boolean_field.rb +4 -4
  164. data/lib/avo/fields/boolean_group_field.rb +3 -3
  165. data/lib/avo/fields/code_field.rb +4 -4
  166. data/lib/avo/fields/country_field.rb +2 -2
  167. data/lib/avo/fields/currency_field.rb +3 -3
  168. data/lib/avo/fields/date_field.rb +3 -3
  169. data/lib/avo/fields/date_time_field.rb +2 -2
  170. data/lib/avo/fields/external_image_field.rb +2 -2
  171. data/lib/avo/fields/field_extensions/has_field_name.rb +2 -9
  172. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +34 -33
  173. data/lib/avo/fields/file_field.rb +1 -1
  174. data/lib/avo/fields/files_field.rb +2 -2
  175. data/lib/avo/fields/gravatar_field.rb +10 -10
  176. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -1
  177. data/lib/avo/fields/has_many_field.rb +1 -1
  178. data/lib/avo/fields/has_one_field.rb +2 -2
  179. data/lib/avo/fields/heading_field.rb +2 -2
  180. data/lib/avo/fields/hidden_field.rb +1 -1
  181. data/lib/avo/fields/id_field.rb +3 -3
  182. data/lib/avo/fields/key_value_field.rb +12 -12
  183. data/lib/avo/fields/markdown_field.rb +2 -2
  184. data/lib/avo/fields/number_field.rb +3 -3
  185. data/lib/avo/fields/password_field.rb +1 -1
  186. data/lib/avo/fields/select_field.rb +8 -12
  187. data/lib/avo/fields/status_field.rb +4 -4
  188. data/lib/avo/fields/text_field.rb +2 -2
  189. data/lib/avo/fields/textarea_field.rb +2 -2
  190. data/lib/avo/fields/trix_field.rb +1 -1
  191. data/lib/avo/fields_collector.rb +30 -0
  192. data/lib/avo/filters/base_filter.rb +6 -6
  193. data/lib/avo/filters/boolean_filter.rb +1 -1
  194. data/lib/avo/filters/select_filter.rb +1 -1
  195. data/lib/avo/grid_collector.rb +39 -0
  196. data/lib/avo/has_context.rb +7 -0
  197. data/lib/avo/licensing/h_q.rb +56 -55
  198. data/lib/avo/licensing/license.rb +5 -5
  199. data/lib/avo/licensing/license_manager.rb +4 -4
  200. data/lib/avo/licensing/null_license.rb +2 -2
  201. data/lib/avo/licensing/pro_license.rb +1 -1
  202. data/lib/avo/loaders/fields_loader.rb +4 -4
  203. data/lib/avo/services/authorization_service.rb +2 -2
  204. data/lib/avo/services/panel_service.rb +4 -4
  205. data/lib/avo/version.rb +1 -1
  206. data/lib/generators/avo/action_generator.rb +4 -4
  207. data/lib/generators/avo/controller_generator.rb +4 -4
  208. data/lib/generators/avo/filter_generator.rb +5 -5
  209. data/lib/generators/avo/install_generator.rb +8 -8
  210. data/lib/generators/avo/locales_generator.rb +5 -5
  211. data/lib/generators/avo/partials_generator.rb +4 -4
  212. data/lib/generators/avo/resource_generator.rb +5 -5
  213. data/lib/generators/avo/templates/action.tt +2 -2
  214. data/lib/tasks/avo_tasks.rake +52 -53
  215. data/public/avo-packs/css/application-4e16d6a6.css +5975 -0
  216. data/public/avo-packs/css/application-4e16d6a6.css.br +0 -0
  217. data/public/avo-packs/css/application-4e16d6a6.css.gz +0 -0
  218. data/public/avo-packs/css/application-4e16d6a6.css.map +1 -0
  219. data/public/avo-packs/css/application-4e16d6a6.css.map.br +0 -0
  220. data/public/avo-packs/css/application-4e16d6a6.css.map.gz +0 -0
  221. data/public/avo-packs/js/219-9aa2b689f44613118203.chunk.js +2 -0
  222. data/public/avo-packs/js/219-9aa2b689f44613118203.chunk.js.br +0 -0
  223. data/public/avo-packs/js/219-9aa2b689f44613118203.chunk.js.gz +0 -0
  224. data/public/avo-packs/js/219-9aa2b689f44613118203.chunk.js.map +1 -0
  225. data/public/avo-packs/js/219-9aa2b689f44613118203.chunk.js.map.br +0 -0
  226. data/public/avo-packs/js/219-9aa2b689f44613118203.chunk.js.map.gz +0 -0
  227. data/public/avo-packs/js/application-8eb130a4688f2c667703.js +26 -0
  228. data/public/avo-packs/js/{application-8849c6e2c8f75d55c666.js.LICENSE.txt → application-8eb130a4688f2c667703.js.LICENSE.txt} +17 -17
  229. data/public/avo-packs/js/application-8eb130a4688f2c667703.js.br +0 -0
  230. data/public/avo-packs/js/application-8eb130a4688f2c667703.js.gz +0 -0
  231. data/public/avo-packs/js/application-8eb130a4688f2c667703.js.map +1 -0
  232. data/public/avo-packs/js/application-8eb130a4688f2c667703.js.map.br +0 -0
  233. data/public/avo-packs/js/application-8eb130a4688f2c667703.js.map.gz +0 -0
  234. data/public/avo-packs/manifest.json +46 -23
  235. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-00fbd8a72a3708b8314cce5f0515640e.svg → images/13ae283c0d7cc04efe7e.svg} +0 -0
  236. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-00fbd8a72a3708b8314cce5f0515640e.svg.br → images/13ae283c0d7cc04efe7e.svg.br} +0 -0
  237. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-00fbd8a72a3708b8314cce5f0515640e.svg.gz → images/13ae283c0d7cc04efe7e.svg.gz} +0 -0
  238. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-35bd1c96bc2e402cf22ea812ae067995.svg → images/195026a50008c53526ef.svg} +0 -0
  239. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-35bd1c96bc2e402cf22ea812ae067995.svg.br → images/195026a50008c53526ef.svg.br} +0 -0
  240. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-35bd1c96bc2e402cf22ea812ae067995.svg.gz → images/195026a50008c53526ef.svg.gz} +0 -0
  241. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-cb632c9fe211ba2c2bf1564c9a9295cc.woff → images/1f30e08faa7c60d1f7ac.woff} +0 -0
  242. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-2cc22f9c0cf217cbfc371f3b74992305.ttf → images/1fd17dabf6b7d2b15348.ttf} +0 -0
  243. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-2cc22f9c0cf217cbfc371f3b74992305.ttf.br → images/1fd17dabf6b7d2b15348.ttf.br} +0 -0
  244. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-2cc22f9c0cf217cbfc371f3b74992305.ttf.gz → images/1fd17dabf6b7d2b15348.ttf.gz} +0 -0
  245. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-bcf84d6cb8a0ac214c8c14ba9af834f3.woff2 → images/39a18f443d434999b89b.woff2} +0 -0
  246. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-412073df419ad5f6f8f2ea76eb4aced9.woff2 → images/4ad349571e28bb59c5a5.woff2} +0 -0
  247. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-2fae1e2418251b68fe5d0505ab93dd5c.eot → images/57a5470848663767abbf.eot} +0 -0
  248. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-df8c4bee41b6ca0ed2b7b71456ed7fbb.ttf → images/b2e4cf0fab6c8ca66b7f.ttf} +0 -0
  249. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-df8c4bee41b6ca0ed2b7b71456ed7fbb.ttf.br → images/b2e4cf0fab6c8ca66b7f.ttf.br} +0 -0
  250. data/public/avo-packs/media/{fonts/nunito-v16-latin-regular-df8c4bee41b6ca0ed2b7b71456ed7fbb.ttf.gz → images/b2e4cf0fab6c8ca66b7f.ttf.gz} +0 -0
  251. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-df7e79af617f98cd3b95d320e8b2a1af.eot → images/b78d61ab7e046de8c156.eot} +0 -0
  252. data/public/avo-packs/media/{fonts/nunito-v16-latin-700-7c472b19cb573f537bad8ef62ca917ac.woff → images/c9ab29becb76ddab01d0.woff} +0 -0
  253. data/public/avo-packs/media/images/{logo-edf8d8d0d263e0c1f73bb32a222d9991.png → f1b4befac91a3336db9a.png} +0 -0
  254. metadata +135 -132
  255. data/app/frontend/css/components/code.css +0 -27
  256. data/app/views/layouts/avo/application_vue.html.erb +0 -61
  257. data/config/webpack/environment.js +0 -18
  258. data/db/migrate/20210305082639_add_url_to_teams.rb +0 -5
  259. data/public/avo-packs/css/application-c75ac28c.css +0 -6
  260. data/public/avo-packs/css/application-c75ac28c.css.br +0 -0
  261. data/public/avo-packs/css/application-c75ac28c.css.gz +0 -0
  262. data/public/avo-packs/js/1-0565987ca0c3045602ad.chunk.js +0 -2
  263. data/public/avo-packs/js/1-0565987ca0c3045602ad.chunk.js.br +0 -0
  264. data/public/avo-packs/js/1-0565987ca0c3045602ad.chunk.js.gz +0 -0
  265. data/public/avo-packs/js/1-0565987ca0c3045602ad.chunk.js.map +0 -1
  266. data/public/avo-packs/js/1-0565987ca0c3045602ad.chunk.js.map.br +0 -0
  267. data/public/avo-packs/js/1-0565987ca0c3045602ad.chunk.js.map.gz +0 -0
  268. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js +0 -26
  269. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.br +0 -0
  270. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.gz +0 -0
  271. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.map +0 -1
  272. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.map.br +0 -0
  273. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.map.gz +0 -0
  274. data/public/avo-packs/manifest.json.br +0 -0
  275. data/public/avo-packs/manifest.json.gz +0 -0
@@ -11,7 +11,7 @@ module Avo
11
11
  rescue_from Pundit::NotAuthorizedError, with: :render_unauthorized
12
12
  rescue_from ActiveRecord::RecordInvalid, with: :exception_logger
13
13
 
14
- helper_method :_current_user, :resources_path, :resource_path, :new_resource_path, :edit_resource_path, :resource_attach_path, :resource_detach_path
14
+ helper_method :_current_user, :resources_path, :resource_path, :new_resource_path, :edit_resource_path, :resource_attach_path, :resource_detach_path, :related_resources_path
15
15
  add_flash_types :info, :warning, :success, :error
16
16
 
17
17
  def init_app
@@ -23,11 +23,13 @@ module Avo
23
23
  def exception_logger(exception)
24
24
  respond_to do |format|
25
25
  format.html { raise exception }
26
- format.json { render json: {
27
- errors: exception.record.present? ? exception.record.errors : [],
28
- message: exception.message,
29
- traces: exception.backtrace,
30
- }, status: ActionDispatch::ExceptionWrapper.status_code_for_exception(exception.class.name) }
26
+ format.json {
27
+ render json: {
28
+ errors: exception.respond_to?(:record) && exception.record.present? ? exception.record.errors : [],
29
+ message: exception.message,
30
+ traces: exception.backtrace
31
+ }, status: ActionDispatch::ExceptionWrapper.status_code_for_exception(exception.class.name)
32
+ }
31
33
  end
32
34
  end
33
35
 
@@ -48,20 +50,26 @@ module Avo
48
50
  if keep_query_params
49
51
  existing_params = Addressable::URI.parse(request.fullpath).query_values.symbolize_keys
50
52
  end
51
- rescue;end
52
-
53
+ rescue; end
53
54
  send :"resources_#{model.model_name.route_key}_path", **existing_params, **args
54
55
  end
55
56
 
56
- def resource_path(model = nil, resource_id: nil, keep_query_params: false, **args)
57
+ def related_resources_path(parent_model, model, keep_query_params: false, **args)
58
+ return if model.nil?
59
+
57
60
  existing_params = {}
58
61
 
59
62
  begin
60
63
  if keep_query_params
61
64
  existing_params = Addressable::URI.parse(request.fullpath).query_values.symbolize_keys
62
65
  end
63
- rescue;end
66
+ rescue; end
67
+ Addressable::Template.new("#{Avo.configuration.root_path}/resources/#{@parent_resource.model.model_name.route_key}/#{@parent_resource.model.id}/#{@resource.route_key}{?query*}")
68
+ .expand({query: {**existing_params, **args}})
69
+ .to_str
70
+ end
64
71
 
72
+ def resource_path(model = nil, resource_id: nil, keep_query_params: false, **args)
65
73
  return send :"resources_#{model.model_name.route_key.singularize}_path", resource_id, **args if resource_id.present?
66
74
 
67
75
  send :"resources_#{model.model_name.route_key.singularize}_path", model, **args
@@ -92,146 +100,146 @@ module Avo
92
100
  end
93
101
 
94
102
  private
95
- def set_resource_name
96
- @resource_name = resource_name
97
- end
98
103
 
99
- def set_related_resource_name
100
- @related_resource_name = related_resource_name
101
- end
104
+ def set_resource_name
105
+ @resource_name = resource_name
106
+ end
102
107
 
103
- def set_resource
104
- @resource = resource.hydrate(params: params)
105
- end
108
+ def set_related_resource_name
109
+ @related_resource_name = related_resource_name
110
+ end
106
111
 
107
- def set_related_resource
108
- @related_resource = related_resource.hydrate(params: params)
109
- end
112
+ def set_resource
113
+ @resource = resource.hydrate(params: params)
114
+ end
110
115
 
111
- def set_model
112
- @model = eager_load_files(@resource, @resource.model_class).find params[:id]
113
- end
116
+ def set_related_resource
117
+ @related_resource = related_resource.hydrate(params: params)
118
+ end
114
119
 
115
- def set_related_model
116
- @related_model = eager_load_files(@related_resource, @related_resource.model_class).find params[:related_id]
117
- end
120
+ def set_model
121
+ @model = eager_load_files(@resource, @resource.model_class).find params[:id]
122
+ end
118
123
 
119
- def hydrate_resource
120
- @resource.hydrate(view: action_name.to_sym, user: _current_user)
121
- end
124
+ def set_related_model
125
+ @related_model = eager_load_files(@related_resource, @related_resource.model_class).find params[:related_id]
126
+ end
122
127
 
123
- def hydrate_related_resource
124
- @related_resource.hydrate(view: action_name.to_sym, user: _current_user)
125
- end
128
+ def hydrate_resource
129
+ @resource.hydrate(view: action_name.to_sym, user: _current_user)
130
+ end
126
131
 
127
- def authorize_action
128
- if @model.present?
129
- @authorization.set_record(@model).authorize_action :index
130
- else
131
- @authorization.set_record(@resource.model_class).authorize_action :index
132
- end
132
+ def hydrate_related_resource
133
+ @related_resource.hydrate(view: action_name.to_sym, user: _current_user)
134
+ end
135
+
136
+ def authorize_action
137
+ if @model.present?
138
+ @authorization.set_record(@model).authorize_action :index
139
+ else
140
+ @authorization.set_record(@resource.model_class).authorize_action :index
133
141
  end
142
+ end
134
143
 
135
- # Get the pluralized resource name for this request
136
- # Ex: projects, teams, users
137
- def resource_name
138
- return params[:resource_name] if params[:resource_name].present?
144
+ # Get the pluralized resource name for this request
145
+ # Ex: projects, teams, users
146
+ def resource_name
147
+ return params[:resource_name] if params[:resource_name].present?
139
148
 
140
- return controller_name if controller_name.present?
149
+ return controller_name if controller_name.present?
141
150
 
142
- begin
143
- request.path
144
- .match(/\/?#{Avo.configuration.root_path.gsub('/', '')}\/resources\/([a-z1-9\-_]*)\/?/mi)
145
- .captures
146
- .first
147
- rescue => exception
148
- end
151
+ begin
152
+ request.path
153
+ .match(/\/?#{Avo.configuration.root_path.delete('/')}\/resources\/([a-z1-9\-_]*)\/?/mi)
154
+ .captures
155
+ .first
156
+ rescue
149
157
  end
158
+ end
150
159
 
151
- def related_resource_name
152
- params[:related_name]
153
- end
160
+ def related_resource_name
161
+ params[:related_name]
162
+ end
154
163
 
155
- # Gets the Avo resource for this request based on the request from the `resource_name` "param"
156
- # Ex: Avo::Resources::Project, Avo::Resources::Team, Avo::Resources::User
157
- def resource
158
- App.get_resource @resource_name.to_s.camelize.singularize
159
- end
164
+ # Gets the Avo resource for this request based on the request from the `resource_name` "param"
165
+ # Ex: Avo::Resources::Project, Avo::Resources::Team, Avo::Resources::User
166
+ def resource
167
+ resource = App.get_resource @resource_name.to_s.camelize.singularize
160
168
 
161
- def related_resource
162
- reflection = @model._reflections[params[:related_name]]
169
+ return resource if resource.present?
163
170
 
164
- if reflection.is_a? ::ActiveRecord::Reflection::HasOneReflection
165
- reflected_model = reflection.klass
166
- else
167
- reflected_model = reflection.klass
168
- end
171
+ App.get_resource_by_controller_name @resource_name
172
+ end
169
173
 
170
- App.get_resource_by_model_name reflected_model
171
- end
174
+ def related_resource
175
+ reflection = @model._reflections[params[:related_name]]
176
+
177
+ reflected_model = reflection.klass
178
+
179
+ App.get_resource_by_model_name reflected_model
180
+ end
172
181
 
173
- def eager_load_files(resource, query)
174
- if resource.attached_file_fields.present?
175
- resource.attached_file_fields.map do |field|
176
- # abort "#{field.pluralize}".inspect
177
- # abort field.class.inspect
178
- attachment = case field.class.to_s
179
- when 'Avo::Fields::FileField'
180
- 'attachment'
181
- when 'Avo::Fields::FilesField'
182
- 'attachments'
183
- else
184
- 'attachment'
185
- end
186
-
187
- return query.eager_load "#{field.id}_#{attachment}": :blob
188
- # return query.send :"with_attached_#{field}"
182
+ def eager_load_files(resource, query)
183
+ if resource.attached_file_fields.present?
184
+ resource.attached_file_fields.map do |field|
185
+ # abort "#{field.pluralize}".inspect
186
+ # abort field.class.inspect
187
+ attachment = case field.class.to_s
188
+ when "Avo::Fields::FileField"
189
+ "attachment"
190
+ when "Avo::Fields::FilesField"
191
+ "attachments"
192
+ else
193
+ "attachment"
189
194
  end
190
- end
191
195
 
192
- query
196
+ return query.eager_load "#{field.id}_#{attachment}": :blob
197
+ # return query.send :"with_attached_#{field}"
198
+ end
193
199
  end
194
200
 
201
+ query
202
+ end
195
203
 
196
- # def authorize_user
197
- # return if params[:controller] == 'avo/search'
204
+ # def authorize_user
205
+ # return if params[:controller] == 'avo/search'
198
206
 
199
- # model = record = resource.model
207
+ # model = record = resource.model
200
208
 
201
- # if ['show', 'edit', 'update'].include?(params[:action]) && params[:controller] == 'avo/resources'
202
- # record = resource
203
- # end
209
+ # if ['show', 'edit', 'update'].include?(params[:action]) && params[:controller] == 'avo/resources'
210
+ # record = resource
211
+ # end
204
212
 
205
- # # AuthorizationService::authorize_action _current_user, record, params[:action] return render_unauthorized unless
206
- # end
213
+ # # AuthorizationService::authorize_action _current_user, record, params[:action] return render_unauthorized unless
214
+ # end
207
215
 
208
- def _authenticate!
209
- instance_eval(&Avo.configuration.authenticate)
210
- end
216
+ def _authenticate!
217
+ instance_eval(&Avo.configuration.authenticate)
218
+ end
211
219
 
212
- def render_unauthorized(exception)
213
- if !exception.is_a? Pundit::NotDefinedError
214
- flash[:notice] = t 'avo.not_authorized'
220
+ def render_unauthorized(exception)
221
+ if !exception.is_a? Pundit::NotDefinedError
222
+ flash[:notice] = t "avo.not_authorized"
215
223
 
216
- redirect_url = if request.referrer.blank? or request.referrer == request.url
217
- root_url
218
- else
219
- request.referrer
220
- end
221
-
222
- redirect_to(redirect_url)
224
+ redirect_url = if request.referrer.blank? || (request.referrer == request.url)
225
+ root_url
226
+ else
227
+ request.referrer
223
228
  end
224
- end
225
229
 
226
- def set_authorization
227
- @authorization = Services::AuthorizationService.new _current_user
230
+ redirect_to(redirect_url)
228
231
  end
232
+ end
233
+
234
+ def set_authorization
235
+ @authorization = Services::AuthorizationService.new _current_user
236
+ end
229
237
 
230
- def set_container_classes
231
- contain = !Avo.configuration.full_width_container
232
- contain = false if Avo.configuration.full_width_index_view && action_name.to_sym == :index && self.class.superclass.to_s == 'Avo::ResourcesController'
238
+ def set_container_classes
239
+ contain = !Avo.configuration.full_width_container
240
+ contain = false if Avo.configuration.full_width_index_view && action_name.to_sym == :index && self.class.superclass.to_s == "Avo::ResourcesController"
233
241
 
234
- @container_classes = contain ? '2xl:container 2xl:mx-auto' : ''
235
- end
242
+ @container_classes = contain ? "2xl:container 2xl:mx-auto" : ""
243
+ end
236
244
  end
237
245
  end
@@ -1,4 +1,4 @@
1
- require_dependency 'avo/application_controller'
1
+ require_dependency "avo/application_controller"
2
2
 
3
3
  module Avo
4
4
  class AttachmentsController < ApplicationController
@@ -16,9 +16,9 @@ module Avo
16
16
  if attachment.present?
17
17
  attachment.destroy
18
18
 
19
- redirect_to params[:referrer] || resource_path(@model), notice: t('avo.attachment_destroyed')
19
+ redirect_to params[:referrer] || resource_path(@model), notice: t("avo.attachment_destroyed")
20
20
  else
21
- redirect_back fallback_location: resource_path(@model), notice: t('avo.failed_to_find_attachment')
21
+ redirect_back fallback_location: resource_path(@model), notice: t("avo.failed_to_find_attachment")
22
22
  end
23
23
  end
24
24
  end
@@ -1,4 +1,4 @@
1
- require_dependency 'avo/application_controller'
1
+ require_dependency "avo/application_controller"
2
2
 
3
3
  module Avo
4
4
  class BaseController < ApplicationController
@@ -66,16 +66,16 @@ module Avo
66
66
 
67
67
  respond_to do |format|
68
68
  if saved
69
- if params[:via_relation_class].present? && params[:via_resource_id].present?
70
- redirect_path = resource_path(params[:via_relation_class].safe_constantize, resource_id: params[:via_resource_id])
69
+ redirect_path = if params[:via_relation_class].present? && params[:via_resource_id].present?
70
+ resource_path(params[:via_relation_class].safe_constantize, resource_id: params[:via_resource_id])
71
71
  else
72
- redirect_path = resource_path(@model)
72
+ resource_path(@model)
73
73
  end
74
74
 
75
75
  format.html { redirect_to redirect_path, notice: "#{@model.class.name} was successfully created." }
76
76
  format.json { render :show, status: :created, location: @model }
77
77
  else
78
- flash[:error] = t 'avo.you_missed_something_check_form'
78
+ flash[:error] = t "avo.you_missed_something_check_form"
79
79
  format.html { render :new, status: :unprocessable_entity }
80
80
  format.json { render json: @model.errors, status: :unprocessable_entity }
81
81
  end
@@ -92,7 +92,7 @@ module Avo
92
92
  format.html { redirect_to params[:referrer] || resource_path(@model), notice: "#{@model.class.name} was successfully updated." }
93
93
  format.json { render :show, status: :ok, location: @model }
94
94
  else
95
- flash[:error] = t 'avo.you_missed_something_check_form'
95
+ flash[:error] = t "avo.you_missed_something_check_form"
96
96
  format.html { render :edit, status: :unprocessable_entity }
97
97
  format.json { render json: @model.errors, status: :unprocessable_entity }
98
98
  end
@@ -103,124 +103,117 @@ module Avo
103
103
  @model.destroy!
104
104
 
105
105
  respond_to do |format|
106
- format.html { redirect_to params[:referrer] || resources_path(@model), notice: t('avo.resource_destroyed', attachment_class: @attachment_class) }
106
+ format.html { redirect_to params[:referrer] || resources_path(@model, turbo_frame: params[:turbo_frame], view_type: params[:view_type]), notice: t("avo.resource_destroyed", attachment_class: @attachment_class) }
107
107
  format.json { head :no_content }
108
108
  end
109
109
  end
110
110
 
111
111
  private
112
- def model_route_key
113
- @resource.model_class.model_name.route_key.singularize
114
- end
115
112
 
116
- def model_params
117
- request_params = params.require(model_route_key).permit(permitted_params)
113
+ def model_route_key
114
+ @resource.model_class.model_name.route_key.singularize
115
+ end
118
116
 
119
- if @resource.devise_password_optional and request_params[:password].blank? and request_params[:password_confirmation].blank?
120
- request_params.delete(:password_confirmation)
121
- request_params.delete(:password)
122
- end
117
+ def model_params
118
+ request_params = params.require(model_route_key).permit(permitted_params)
123
119
 
124
- request_params
120
+ if @resource.devise_password_optional && request_params[:password].blank? && request_params[:password_confirmation].blank?
121
+ request_params.delete(:password_confirmation)
122
+ request_params.delete(:password)
125
123
  end
126
124
 
127
- def permitted_params
128
- @resource.get_field_definitions.select(&:updatable).map(&:to_permitted_param)
129
- end
125
+ request_params
126
+ end
130
127
 
131
- def cast_nullable(params)
132
- fields = @resource.get_field_definitions
128
+ def permitted_params
129
+ @resource.get_field_definitions.select(&:updatable).map(&:to_permitted_param)
130
+ end
133
131
 
134
- nullable_fields = fields.filter do |field|
135
- field.nullable
136
- end
132
+ def cast_nullable(params)
133
+ fields = @resource.get_field_definitions
134
+
135
+ nullable_fields = fields.filter do |field|
136
+ field.nullable
137
+ end
137
138
  .map do |field|
138
- [field.id, field.null_values]
139
- end
139
+ [field.id, field.null_values]
140
+ end
140
141
  .to_h
141
142
 
142
- params.each do |key, value|
143
- nullable = nullable_fields[key.to_sym]
143
+ params.each do |key, value|
144
+ nullable = nullable_fields[key.to_sym]
144
145
 
145
- if nullable.present? && value.in?(nullable)
146
- params[key] = nil
147
- end
146
+ if nullable.present? && value.in?(nullable)
147
+ params[key] = nil
148
148
  end
149
-
150
- params
151
149
  end
152
150
 
153
- def set_index_params
154
- @index_params = {}
155
-
156
- # Pagination
157
- @index_params[:page] = params[:page] || 1
158
- @index_params[:per_page] = Avo.configuration.per_page
159
-
160
- if cookies[:per_page].present?
161
- @index_params[:per_page] = cookies[:per_page]
162
- end
151
+ params
152
+ end
163
153
 
164
- if params[:per_page].present?
165
- @index_params[:per_page] = params[:per_page]
166
- end
154
+ def set_index_params
155
+ @index_params = {}
167
156
 
168
- if params[:per_page].present?
169
- cookies[:per_page] = params[:per_page]
170
- end
157
+ # Pagination
158
+ @index_params[:page] = params[:page] || 1
159
+ @index_params[:per_page] = Avo.configuration.per_page
171
160
 
172
- if @parent_model.present?
173
- @index_params[:per_page] = Avo.configuration.via_per_page
174
- end
161
+ if cookies[:per_page].present?
162
+ @index_params[:per_page] = cookies[:per_page]
163
+ end
175
164
 
176
- # Sorting
177
- @index_params[:sort_by] = params[:sort_by] || :created_at
178
- @index_params[:sort_direction] = params[:sort_direction] || :desc
165
+ if @parent_model.present?
166
+ @index_params[:per_page] = Avo.configuration.via_per_page
167
+ end
179
168
 
180
- # View types
181
- @index_params[:view_type] = params[:view_type] || @resource.default_view_type || Avo.configuration.default_view_type
182
- @index_params[:available_view_types] = @resource.available_view_types
169
+ if params[:per_page].present?
170
+ @index_params[:per_page] = params[:per_page]
171
+ cookies[:per_page] = params[:per_page]
183
172
  end
184
173
 
185
- def set_filters
186
- @filters = @resource.get_filters.map do |filter_class|
187
- filter = filter_class.new
174
+ # Sorting
175
+ @index_params[:sort_by] = params[:sort_by] || :created_at
176
+ @index_params[:sort_direction] = params[:sort_direction] || :desc
188
177
 
189
- filter
190
- end
191
- end
178
+ # View types
179
+ @index_params[:view_type] = params[:view_type] || @resource.default_view_type || Avo.configuration.default_view_type
180
+ @index_params[:available_view_types] = @resource.available_view_types
181
+ end
192
182
 
193
- def set_actions
194
- if params[:resource_id].present?
195
- model = @resource.model_class.find params[:resource_id]
196
- end
183
+ def set_filters
184
+ @filters = @resource.get_filters.map do |filter_class|
185
+ filter = filter_class.new
197
186
 
198
- @actions = @resource.get_actions.map do |action|
199
- action = action.new
187
+ filter
188
+ end
189
+ end
200
190
 
201
- action.hydrate(model: model, resource: @resource)
202
- action.boot_fields request
191
+ def set_actions
192
+ if params[:resource_id].present?
193
+ model = @resource.model_class.find params[:resource_id]
194
+ end
203
195
 
204
- action
205
- end
196
+ @actions = @resource.get_actions.map do |action|
197
+ action.new(model: model, resource: @resource)
206
198
  end
199
+ end
207
200
 
208
- def applied_filters
209
- if params[:filters].present?
210
- return JSON.parse(Base64.decode64(params[:filters]))
211
- end
201
+ def applied_filters
202
+ if params[:filters].present?
203
+ return JSON.parse(Base64.decode64(params[:filters]))
204
+ end
212
205
 
213
- filter_defaults = {}
206
+ filter_defaults = {}
214
207
 
215
- @resource.get_filters.each do |filter_class|
216
- filter = filter_class.new
208
+ @resource.get_filters.each do |filter_class|
209
+ filter = filter_class.new
217
210
 
218
- if filter.default.present?
219
- filter_defaults[filter_class.to_s] = filter.default
220
- end
211
+ if filter.default.present?
212
+ filter_defaults[filter_class.to_s] = filter.default
221
213
  end
222
-
223
- filter_defaults
224
214
  end
215
+
216
+ filter_defaults
217
+ end
225
218
  end
226
219
  end