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
data/lib/avo.rb CHANGED
@@ -1,20 +1,20 @@
1
- require 'zeitwerk'
2
- require_relative 'avo/version'
3
- require_relative 'avo/engine' if defined?(Rails)
1
+ require "zeitwerk"
2
+ require_relative "avo/version"
3
+ require_relative "avo/engine" if defined?(Rails)
4
4
 
5
5
  loader = Zeitwerk::Loader.for_gem
6
6
  loader.setup
7
7
 
8
8
  module Avo
9
- ROOT_PATH = Pathname.new(File.join(__dir__, '..'))
10
- IN_DEVELOPMENT = ENV['AVO_IN_DEVELOPMENT'] == '1'
9
+ ROOT_PATH = Pathname.new(File.join(__dir__, ".."))
10
+ IN_DEVELOPMENT = ENV["AVO_IN_DEVELOPMENT"] == "1"
11
11
  PACKED = !IN_DEVELOPMENT
12
12
 
13
13
  class << self
14
14
  def webpacker
15
15
  @webpacker ||= ::Webpacker::Instance.new(
16
16
  root_path: ROOT_PATH,
17
- config_path: ROOT_PATH.join('config/webpacker.yml')
17
+ config_path: ROOT_PATH.join("config/webpacker.yml")
18
18
  )
19
19
  end
20
20
  end
@@ -0,0 +1,20 @@
1
+ module Avo
2
+ class ActionModel
3
+ include ActiveModel::Model
4
+
5
+ # This class augments a model the action form declaration.
6
+ def initialize(attributes = {})
7
+ set_attr_accessors attributes
8
+
9
+ super(attributes)
10
+ end
11
+
12
+ private
13
+
14
+ def set_attr_accessors(attributes)
15
+ attributes.each do |k, v|
16
+ self.class.class_eval { attr_accessor k }
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/avo/app.rb CHANGED
@@ -10,32 +10,15 @@ module Avo
10
10
  class_attribute :license, default: nil
11
11
 
12
12
  class << self
13
- # def load_controllers
14
- # BaseResource.descendants.each do |resource|
15
- # controller_name = "#{resource.to_s.gsub('Resource', '').pluralize}Controller"
16
- # puts controller_name.inspect
17
- # # eval <<DYNAMIC
18
- # # class #{controller_name} < Avo::ResourcesController
19
- # # # title :Person
20
- # # # attribute :name, String
21
- # # # ...or substitute other stuff in here.
22
- # # end
23
- # # DYNAMIC
24
-
25
- # Avo.const_set(controller_name.to_sym, Class.new(Avo::ResourcesController))
26
- # # puts controller_name.inspect
27
- # end
28
- # end
29
-
30
13
  def boot
31
14
  init_fields
32
15
 
33
16
  I18n.locale = Avo.configuration.language_code
34
17
 
35
- if Rails.cache.class == ActiveSupport::Cache::NullStore
36
- self.app[:cache_store] ||= ActiveSupport::Cache::MemoryStore.new
18
+ if Rails.cache.instance_of?(ActiveSupport::Cache::NullStore)
19
+ app[:cache_store] ||= ActiveSupport::Cache::MemoryStore.new
37
20
  else
38
- self.app[:cache_store] = Rails.cache
21
+ app[:cache_store] = Rails.cache
39
22
  end
40
23
  end
41
24
 
@@ -52,7 +35,7 @@ module Avo
52
35
  end
53
36
 
54
37
  def cache_store
55
- self.app[:cache_store]
38
+ app[:cache_store]
56
39
  end
57
40
 
58
41
  # This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
@@ -64,48 +47,23 @@ module Avo
64
47
  # Avo::Fields::DateTimeField -> date_time
65
48
  def init_fields
66
49
  Avo::Fields::BaseField.descendants.each do |class_name|
67
- next if class_name.to_s == 'BaseField'
50
+ next if class_name.to_s == "BaseField"
68
51
 
69
- if class_name.to_s.end_with? 'Field'
52
+ if class_name.to_s.end_with? "Field"
70
53
  load_field class_name.get_field_name, class_name
71
54
  end
72
55
  end
73
56
  end
74
57
 
75
58
  def load_field(method_name, klass)
76
- self.fields.push(
59
+ fields.push(
77
60
  name: method_name,
78
- class: klass,
61
+ class: klass
79
62
  )
80
-
81
- # Avo::Loaders::FieldsLoader.define_method method_name.to_sym do |*args, &block|
82
- # puts ['Avo::Loaders::FieldsLoader.define_method->', args, block.present?].inspect
83
-
84
- # if block.present?
85
- # puts '111->'.inspect
86
- # field = klass.new(args[0], **args[1] || {}, &block)
87
- # else
88
- # puts '222->'.inspect
89
- # field = klass.new(args[0], **args[1] || {})
90
- # end
91
-
92
- # puts field.inspect
93
-
94
- # self.bag.push field
95
-
96
- # # field
97
- # # if block.present?
98
- # # field_class = klass::new(args[0], **args[1] || {}, &block)
99
- # # else
100
- # # field_class = klass::new(args[0], **args[1] || {})
101
- # # end
102
-
103
- # # klass_entity.add_field(self, field_class)
104
- # end
105
63
  end
106
64
 
107
65
  def init_resources
108
- self.app[:resources] = BaseResource.descendants
66
+ app[:resources] = BaseResource.descendants
109
67
  .select do |resource|
110
68
  resource != BaseResource
111
69
  end
@@ -117,35 +75,45 @@ module Avo
117
75
  end
118
76
 
119
77
  def get_resources
120
- self.app[:resources]
78
+ app[:resources]
121
79
  end
122
80
 
123
81
  # Returns the Avo resource by camelized name
124
82
  #
125
- # get_resource_by_name('User') => Avo::Resources::User
83
+ # get_resource_by_name('User') => UserResource
126
84
  def get_resource(resource)
127
- self.app[:resources].find do |available_resource|
85
+ app[:resources].find do |available_resource|
128
86
  "#{resource}Resource".safe_constantize == available_resource.class
129
87
  end
130
88
  end
131
89
 
132
90
  # Returns the Avo resource by singular snake_cased name
133
91
  #
134
- # get_resource_by_name('user') => Avo::Resources::User
92
+ # get_resource_by_name('user') => UserResource
135
93
  def get_resource_by_name(name)
136
- self.get_resource name.singularize.camelize
94
+ get_resource name.singularize.camelize
137
95
  end
138
96
 
139
97
  # Returns the Avo resource by singular snake_cased name
140
98
  #
141
- # get_resource_by_name('User') => Avo::Resources::User
142
- # get_resource_by_name(User) => Avo::Resources::User
99
+ # get_resource_by_name('User') => UserResource
100
+ # get_resource_by_name(User) => UserResource
143
101
  def get_resource_by_model_name(name)
144
102
  get_resources.find do |resource|
145
103
  resource.model_class.model_name.name == name.to_s
146
104
  end
147
105
  end
148
106
 
107
+ # Returns the Avo resource by singular snake_cased name
108
+ #
109
+ # get_resource_by_controller_name('delayed_backend_active_record_jobs') => DelayedJobResource
110
+ # get_resource_by_controller_name('users') => UserResource
111
+ def get_resource_by_controller_name(name)
112
+ get_resources.find do |resource|
113
+ resource.model_class.to_s.pluralize.underscore.tr("/", "_") == name.to_s
114
+ end
115
+ end
116
+
149
117
  # Returns the Rails model class by singular snake_cased name
150
118
  #
151
119
  # get_model_class_by_name('user') => User
@@ -156,7 +124,7 @@ module Avo
156
124
  def get_available_resources(user = nil)
157
125
  App.get_resources
158
126
  .select do |resource|
159
- Services::AuthorizationService.authorize user, resource.model, Avo.configuration.authorization_methods.stringify_keys['index'], raise_exception: false
127
+ Services::AuthorizationService.authorize user, resource.model, Avo.configuration.authorization_methods.stringify_keys["index"], raise_exception: false
160
128
  end
161
129
  .sort_by { |r| r.name }
162
130
  end
@@ -171,14 +139,18 @@ module Avo
171
139
  # We should eager load all the classes so we find all descendants
172
140
  Rails.application.eager_load!
173
141
 
174
- Proc.new do
142
+ proc do
175
143
  BaseResource.descendants
176
144
  .select do |resource|
177
- resource != :Resource
145
+ resource != :BaseResource
178
146
  end
179
147
  .map do |resource|
180
148
  if resource.is_a? Class
181
- route_key = resource.to_s.underscore.gsub('_resource', '').downcase.pluralize.to_sym
149
+ route_key = if resource.model_class.present?
150
+ resource.model_class.model_name.route_key
151
+ else
152
+ resource.to_s.underscore.gsub("_resource", "").downcase.pluralize.to_sym
153
+ end
182
154
 
183
155
  resources route_key
184
156
  end
@@ -1,113 +1,124 @@
1
1
  module Avo
2
2
  class BaseAction
3
+ extend FieldsCollector
4
+ extend HasContext
5
+
3
6
  class_attribute :name, default: self.class.to_s.demodulize.underscore.humanize(keep_id_suffix: true)
4
- class_attribute :message, default: I18n.t('avo.are_you_sure_you_want_to_run_this_option')
5
- class_attribute :confirm_text, default: I18n.t('avo.run')
6
- class_attribute :cancel_text, default: I18n.t('avo.cancel')
7
+ class_attribute :message
8
+ class_attribute :confirm_button_label
9
+ class_attribute :cancel_button_label
7
10
  class_attribute :no_confirmation, default: false
11
+ class_attribute :model
12
+ class_attribute :view
13
+ class_attribute :user
14
+ class_attribute :resource
15
+ class_attribute :fields
8
16
 
9
17
  attr_accessor :response
10
18
  attr_accessor :model
11
19
  attr_accessor :resource
12
20
  attr_accessor :user
21
+ attr_accessor :fields_loader
13
22
 
14
- attr_accessor :field_loader
23
+ def initialize(model: nil, resource: nil, user: nil)
24
+ self.class.model = model if model.present?
25
+ self.class.resource = resource if resource.present?
26
+ self.class.user = user if user.present?
15
27
 
16
- alias :field :field_loader
17
- alias :f :field
28
+ self.class.message ||= I18n.t("avo.are_you_sure_you_want_to_run_this_option")
29
+ self.class.confirm_button_label ||= I18n.t("avo.run")
30
+ self.class.cancel_button_label ||= I18n.t("avo.cancel")
18
31
 
19
- def initialize
20
- @fields ||= []
21
32
  @response ||= {}
22
33
  @response[:message_type] ||= :notice
23
- @response[:message] ||= I18n.t('avo.action_ran_successfully')
34
+ @response[:message] ||= I18n.t("avo.action_ran_successfully")
35
+ end
36
+
37
+ def context
38
+ self.class.context
24
39
  end
25
40
 
26
- def boot_fields(request)
27
- @field_loader = Avo::Loaders::FieldsLoader.new
28
- fields request if self.respond_to? :fields
41
+ def get_field_definitions
42
+ return [] if self.class.fields.blank?
43
+
44
+ self.class.fields.map do |field|
45
+ field.hydrate(action: self)
46
+ end
29
47
  end
30
48
 
31
- def get_fields(view_type: :table)
49
+ def get_fields
32
50
  get_field_definitions.map do |field|
33
51
  field.hydrate(action: self, model: @model)
34
52
  end
35
- .select do |field|
36
- field.can_see.present? ? field.can_see.call : true
53
+ .select do |field|
54
+ field.visible?
37
55
  end
38
56
  end
39
57
 
40
- def get_field_definitions
41
- @field_loader.bag.map do |field|
42
- field.hydrate(action: self)
58
+ def get_attributes_for_action
59
+ get_fields.map do |field|
60
+ [field.id, field.value]
43
61
  end
62
+ .to_h
44
63
  end
45
64
 
46
- def hydrate(model: nil, resource: nil, user: nil)
47
- @model = model if model.present?
48
- @resource = resource if resource.present?
49
- @user = user if user.present?
50
-
51
- self
52
- end
53
-
54
- def handle_action(request, models, raw_fields)
65
+ def handle_action(models:, fields:)
55
66
  avo_fields = get_fields.map { |field| [field.id, field] }.to_h
56
67
 
57
- if raw_fields.present?
58
- fields = raw_fields.to_unsafe_h.map do |name, value|
68
+ if fields.present?
69
+ processed_fields = fields.to_unsafe_h.map do |name, value|
59
70
  [name, avo_fields[name.to_sym].resolve_attribute(value)]
60
71
  end
61
72
 
62
- fields = fields.to_h
73
+ processed_fields = processed_fields.to_h
63
74
  else
64
- fields = {}
75
+ processed_fields = {}
65
76
  end
66
77
 
67
- result = self.handle request, models, fields
78
+ handle models: models, fields: processed_fields
68
79
 
69
80
  self
70
81
  end
71
82
 
72
83
  def param_id
73
- self.class.to_s.demodulize.underscore.gsub '/', '_'
84
+ self.class.to_s.demodulize.underscore.tr "/", "_"
74
85
  end
75
86
 
76
87
  def succeed(text)
77
- self.response[:message_type] = :notice
78
- self.response[:message] = text
88
+ response[:message_type] = :notice
89
+ response[:message] = text
79
90
 
80
91
  self
81
92
  end
82
93
 
83
94
  def fail(text)
84
- self.response[:message_type] = :alert
85
- self.response[:message] = text
95
+ response[:message_type] = :alert
96
+ response[:message] = text
86
97
 
87
98
  self
88
99
  end
89
100
 
90
101
  def redirect_to(path = nil, &block)
91
- self.response[:type] = :redirect
92
- if block.present?
93
- self.response[:path] = block
102
+ response[:type] = :redirect
103
+ response[:path] = if block.present?
104
+ block
94
105
  else
95
- self.response[:path] = path
106
+ path
96
107
  end
97
108
 
98
109
  self
99
110
  end
100
111
 
101
112
  def reload
102
- self.response[:type] = :reload
113
+ response[:type] = :reload
103
114
 
104
115
  self
105
116
  end
106
117
 
107
118
  def download(path, filename)
108
- self.response[:type] = :download
109
- self.response[:path] = path
110
- self.response[:filename] = filename
119
+ response[:type] = :download
120
+ response[:path] = path
121
+ response[:filename] = filename
111
122
 
112
123
  self
113
124
  end
@@ -1,6 +1,8 @@
1
1
  module Avo
2
2
  class BaseResource
3
3
  extend ActiveSupport::DescendantsTracker
4
+ extend FieldsCollector
5
+ extend HasContext
4
6
 
5
7
  attr_accessor :view
6
8
  attr_accessor :model
@@ -11,45 +13,33 @@ module Avo
11
13
  class_attribute :title, default: :id
12
14
  class_attribute :search, default: [:id]
13
15
  class_attribute :includes, default: []
16
+ class_attribute :model_class
14
17
  class_attribute :translation_key
15
18
  class_attribute :default_view_type, default: :table
16
19
  class_attribute :devise_password_optional, default: false
17
- class_attribute :fields_loader
18
20
  class_attribute :actions_loader
19
21
  class_attribute :filters_loader
20
- class_attribute :grid_cover_loader
21
- class_attribute :grid_title_loader
22
- class_attribute :grid_body_loader
22
+ class_attribute :fields
23
+ class_attribute :grid_loader
23
24
 
24
25
  class << self
25
- def fields(&block)
26
- self.fields_loader ||= Avo::Loaders::FieldsLoader.new
27
-
28
- yield(fields_loader)
29
- end
30
-
31
- def actions(&block)
32
- self.actions_loader ||= Avo::Loaders::ActionsLoader.new
26
+ def grid(&block)
27
+ grid_collector = GridCollector.new
28
+ grid_collector.instance_eval(&block)
33
29
 
34
- yield(actions_loader)
30
+ self.grid_loader = grid_collector
35
31
  end
36
32
 
37
- def filters(&block)
38
- self.filters_loader ||= Avo::Loaders::FiltersLoader.new
33
+ def action(action_class)
34
+ self.actions_loader ||= Avo::Loaders::Loader.new
39
35
 
40
- yield(filters_loader)
36
+ self.actions_loader.use action_class
41
37
  end
42
38
 
43
- def grid(&block)
44
- self.grid_cover_loader ||= Avo::Loaders::FieldsLoader.new
45
- self.grid_title_loader ||= Avo::Loaders::FieldsLoader.new
46
- self.grid_body_loader ||= Avo::Loaders::FieldsLoader.new
47
-
48
- yield(grid_cover_loader, grid_title_loader, grid_body_loader)
49
- end
39
+ def filter(filter_class)
40
+ self.filters_loader ||= Avo::Loaders::Loader.new
50
41
 
51
- def context
52
- App.context
42
+ self.filters_loader.use filter_class
53
43
  end
54
44
  end
55
45
 
@@ -67,18 +57,26 @@ module Avo
67
57
  self
68
58
  end
69
59
 
60
+ def get_field_definitions
61
+ return [] if self.class.fields.blank?
62
+
63
+ self.class.fields.map do |field|
64
+ field.hydrate(resource: self, panel_name: default_panel_name, user: user)
65
+ end
66
+ end
67
+
70
68
  def get_fields(panel: nil, reflection: nil)
71
69
  fields = get_field_definitions.select do |field|
72
- field.send("show_on_#{@view.to_s}")
73
- end
74
- .select do |field|
75
- field.can_see.present? ? field.can_see.call : true
70
+ field.send("show_on_#{@view}")
76
71
  end
77
- .select do |field|
72
+ .select do |field|
73
+ field.visible?
74
+ end
75
+ .select do |field|
78
76
  unless field.respond_to?(:foreign_key) &&
79
- reflection.present? &&
80
- reflection.respond_to?(:foreign_key) &&
81
- reflection.foreign_key == field.foreign_key
77
+ reflection.present? &&
78
+ reflection.respond_to?(:foreign_key) &&
79
+ reflection.foreign_key == field.foreign_key
82
80
  true
83
81
  end
84
82
  end
@@ -89,27 +87,15 @@ module Avo
89
87
  end
90
88
  end
91
89
 
92
- fields = fields.map do |field|
90
+ fields.map do |field|
93
91
  field.hydrate(model: @model, view: @view, resource: self)
94
92
  end
95
-
96
- fields
97
93
  end
98
94
 
99
95
  def get_grid_fields
100
- return if self.class.grid_title_loader.blank?
101
-
102
- card = {
103
- cover: [*self.class.grid_cover_loader.bag],
104
- title: [*self.class.grid_title_loader.bag],
105
- body: [*self.class.grid_body_loader.bag],
106
- }
96
+ return if self.class.grid_loader.blank?
107
97
 
108
- card.each do |section, fields|
109
- fields = fields.map do |field|
110
- field.hydrate(model: @model, view: @view, resource: self)
111
- end
112
- end
98
+ self.class.grid_loader.hydrate(model: @model, view: @view, resource: self)
113
99
  end
114
100
 
115
101
  def get_filters
@@ -124,41 +110,35 @@ module Avo
124
110
  self.class.actions_loader.bag
125
111
  end
126
112
 
127
- def get_field_definitions
128
- self.class.fields_loader.bag.map do |field|
129
- field.hydrate(resource: self, panel_name: default_panel_name, user: user)
130
- end
131
- end
132
-
133
113
  def default_panel_name
134
114
  return @params[:related_name].capitalize if @params[:related_name].present?
135
115
 
136
116
  case @view
137
117
  when :show
138
- I18n.t('avo.resource_details', item: self.name.downcase, title: model_title).upcase_first
118
+ I18n.t("avo.resource_details", item: name.downcase, title: model_title).upcase_first
139
119
  when :edit
140
- I18n.t('avo.update_item', item: self.name.downcase, title: model_title).upcase_first
120
+ I18n.t("avo.update_item", item: name.downcase, title: model_title).upcase_first
141
121
  when :new
142
- I18n.t('avo.create_new_item', item: self.name.downcase).upcase_first
122
+ I18n.t("avo.create_new_item", item: name.downcase).upcase_first
143
123
  end
144
124
  end
145
125
 
146
126
  def panels
147
- panels = [
127
+ [
148
128
  {
149
129
  name: default_panel_name,
150
130
  type: :fields,
151
- in_panel: true,
131
+ in_panel: true
152
132
  }
153
133
  ]
154
-
155
- panels
156
134
  end
157
135
 
158
136
  def model_class
137
+ return self.class.model_class if self.class.model_class.present?
138
+
159
139
  return @model.class if @model.present?
160
140
 
161
- self.class.name.demodulize.chomp('Resource').safe_constantize
141
+ self.class.name.demodulize.chomp("Resource").safe_constantize
162
142
  end
163
143
 
164
144
  def model_title
@@ -172,7 +152,7 @@ module Avo
172
152
 
173
153
  return I18n.t(@translation_key, count: 1).capitalize if @translation_key
174
154
 
175
- self.class.name.demodulize.chomp('Resource').titlecase
155
+ self.class.name.demodulize.chomp("Resource").titlecase
176
156
  end
177
157
 
178
158
  def singular_name
@@ -204,14 +184,10 @@ module Avo
204
184
  end
205
185
 
206
186
  def context
207
- App.context
187
+ self.class.context
208
188
  end
209
189
 
210
- # def fields
211
- # raise NotImplementedError
212
- # end
213
-
214
- def query_search(query: '', via_resource_name: , via_resource_id:, user:)
190
+ def query_search(via_resource_name:, via_resource_id:, user:, query: "")
215
191
  # model_class = self.model
216
192
 
217
193
  db_query = AuthorizationService.apply_policy(user, model_class)
@@ -219,18 +195,18 @@ module Avo
219
195
  if via_resource_name.present?
220
196
  related_model = App.get_resource_by_name(via_resource_name).model
221
197
 
222
- db_query = related_model.find(via_resource_id).public_send(self.plural_name.downcase)
198
+ db_query = related_model.find(via_resource_id).public_send(plural_name.downcase)
223
199
  end
224
200
 
225
201
  new_query = []
226
202
 
227
- [self.search].flatten.each_with_index do |search_by, index|
228
- new_query.push 'or' if index != 0
203
+ [search].flatten.each_with_index do |search_by, index|
204
+ new_query.push "or" if index != 0
229
205
 
230
206
  new_query.push "text(#{search_by}) ILIKE '%#{query}%'"
231
207
  end
232
208
 
233
- db_query.where(new_query.join(' '))
209
+ db_query.where(new_query.join(" "))
234
210
  end
235
211
 
236
212
  def attached_file_fields
@@ -241,7 +217,7 @@ module Avo
241
217
 
242
218
  def fill_model(model, params)
243
219
  # Map the received params to their actual fields
244
- fields_by_database_id = self.get_field_definitions.map { |field| [field.database_id(model).to_s, field] }.to_h
220
+ fields_by_database_id = get_field_definitions.map { |field| [field.database_id(model).to_s, field] }.to_h
245
221
 
246
222
  params.each do |key, value|
247
223
  field = fields_by_database_id[key]
@@ -259,16 +235,16 @@ module Avo
259
235
  end
260
236
 
261
237
  def file_hash
262
- content_to_be_hashed = ''
238
+ content_to_be_hashed = ""
263
239
 
264
240
  # resource file hash
265
- resource_path = Rails.root.join('app', 'avo', 'resources', "#{name.underscore}.rb").to_s
241
+ resource_path = Rails.root.join("app", "avo", "resources", "#{name.underscore}.rb").to_s
266
242
  if File.file? resource_path
267
243
  content_to_be_hashed += File.read(resource_path)
268
244
  end
269
245
 
270
246
  # policy file hash
271
- policy_path = Rails.root.join('app', 'policies', "#{name.underscore}_policy.rb").to_s
247
+ policy_path = Rails.root.join("app", "policies", "#{name.underscore}_policy.rb").to_s
272
248
  if File.file? policy_path
273
249
  content_to_be_hashed += File.read(policy_path)
274
250
  end
@@ -278,9 +254,9 @@ module Avo
278
254
 
279
255
  def cache_hash(parent_model)
280
256
  if parent_model.present?
281
- [self.model, self.file_hash, parent_model]
257
+ [model, file_hash, parent_model]
282
258
  else
283
- [self.model, self.file_hash]
259
+ [model, file_hash]
284
260
  end
285
261
  end
286
262
 
@@ -290,24 +266,24 @@ module Avo
290
266
  default_values = get_fields.select do |field|
291
267
  !field.computed
292
268
  end
293
- .map do |field|
294
- id = field.id
295
- value = field.value
269
+ .map do |field|
270
+ id = field.id
271
+ value = field.value
296
272
 
297
- if field.respond_to? :foreign_key
298
- id = field.foreign_key.to_sym
273
+ if field.respond_to? :foreign_key
274
+ id = field.foreign_key.to_sym
299
275
 
300
- reflection = @model._reflections[@params[:via_relation]]
276
+ reflection = @model._reflections[@params[:via_relation]]
301
277
 
302
- if reflection.present? && reflection.foreign_key.present?
303
- value = @params[:via_resource_id]
304
- end
305
- end
278
+ if reflection.present? && reflection.foreign_key.present?
279
+ value = @params[:via_resource_id]
280
+ end
281
+ end
306
282
 
307
- [id, value]
308
- end
309
- .to_h
310
- .select do |id, value|
283
+ [id, value]
284
+ end
285
+ .to_h
286
+ .select do |id, value|
311
287
  value.present?
312
288
  end
313
289