avo 2.49.0 → 3.0.0.beta1

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

Potentially problematic release.


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

Files changed (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +15 -26
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
  40. data/app/components/avo/fields/index_component.rb +5 -5
  41. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  42. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  43. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  44. data/app/components/avo/fields/show_component.rb +4 -1
  45. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  46. data/app/components/avo/filters_component.html.erb +9 -3
  47. data/app/components/avo/filters_component.rb +4 -4
  48. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  49. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  50. data/app/components/avo/index/grid_item_component.rb +43 -16
  51. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  52. data/app/components/avo/index/resource_controls_component.rb +124 -17
  53. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  54. data/app/components/avo/index/resource_grid_component.rb +5 -2
  55. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  56. data/app/components/avo/index/resource_map_component.rb +3 -3
  57. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  58. data/app/components/avo/index/resource_table_component.rb +14 -20
  59. data/app/components/avo/index/table_row_component.html.erb +8 -4
  60. data/app/components/avo/index/table_row_component.rb +3 -2
  61. data/app/components/avo/item_switcher_component.rb +2 -2
  62. data/app/components/avo/modal_component.html.erb +7 -12
  63. data/app/components/avo/modal_component.rb +0 -21
  64. data/app/components/avo/paginator_component.html.erb +40 -29
  65. data/app/components/avo/paginator_component.rb +5 -23
  66. data/app/components/avo/panel_component.html.erb +8 -6
  67. data/app/components/avo/referrer_params_component.html.erb +1 -2
  68. data/app/components/avo/resource_component.rb +189 -14
  69. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  70. data/app/components/avo/resource_sidebar_component.rb +1 -1
  71. data/app/components/avo/sidebar/link_component.rb +1 -1
  72. data/app/components/avo/sidebar_component.html.erb +10 -3
  73. data/app/components/avo/sidebar_component.rb +5 -3
  74. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  75. data/app/components/avo/tab_group_component.html.erb +13 -7
  76. data/app/components/avo/tab_group_component.rb +1 -6
  77. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  78. data/app/components/avo/tab_switcher_component.rb +4 -39
  79. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  80. data/app/components/avo/views/resource_edit_component.rb +7 -18
  81. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  82. data/app/components/avo/views/resource_index_component.rb +62 -12
  83. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  84. data/app/components/avo/views/resource_show_component.rb +6 -11
  85. data/app/controllers/avo/actions_controller.rb +27 -24
  86. data/app/controllers/avo/application_controller.rb +105 -151
  87. data/app/controllers/avo/associations_controller.rb +34 -43
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +102 -102
  90. data/app/controllers/avo/debug_controller.rb +17 -5
  91. data/app/controllers/avo/home_controller.rb +1 -1
  92. data/app/controllers/avo/search_controller.rb +30 -51
  93. data/app/controllers/avo/team_users_controller.rb +4 -0
  94. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  95. data/app/helpers/avo/application_helper.rb +15 -9
  96. data/app/helpers/avo/resources_helper.rb +1 -1
  97. data/app/helpers/avo/url_helpers.rb +27 -11
  98. data/app/javascript/avo.base.js +1 -0
  99. data/app/javascript/js/application.js +0 -3
  100. data/app/javascript/js/controllers/action_controller.js +5 -3
  101. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  102. data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
  103. data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
  104. data/app/javascript/js/controllers/filter_controller.js +1 -1
  105. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  106. data/app/javascript/js/controllers/preview_controller.js +24 -0
  107. data/app/javascript/js/controllers/search_controller.js +2 -2
  108. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  109. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  110. data/app/javascript/js/controllers.js +10 -6
  111. data/app/javascript/js/custom-stream-actions.js +15 -0
  112. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  113. data/app/views/avo/actions/show.html.erb +10 -7
  114. data/app/views/avo/associations/new.html.erb +2 -2
  115. data/app/views/avo/base/index.html.erb +3 -2
  116. data/app/views/avo/base/new.html.erb +2 -1
  117. data/app/views/avo/base/preview.html.erb +19 -0
  118. data/app/views/avo/base/show.html.erb +1 -1
  119. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  120. data/app/views/avo/debug/report.html.erb +32 -17
  121. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  122. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  123. data/app/views/avo/partials/_footer.html.erb +1 -1
  124. data/app/views/avo/partials/_javascript.html.erb +5 -0
  125. data/app/views/avo/partials/_logo.html.erb +1 -1
  126. data/app/views/avo/partials/_navbar.html.erb +3 -5
  127. data/app/views/avo/partials/_table_header.html.erb +5 -11
  128. data/app/views/layouts/avo/application.html.erb +4 -2
  129. data/avo.gemspec +11 -12
  130. data/bin/dev +1 -1
  131. data/bin/prod +0 -0
  132. data/config/i18n-tasks.yml +1 -1
  133. data/config/initializers/pagy.rb +0 -2
  134. data/config/master.key +1 -0
  135. data/config/routes.rb +6 -10
  136. data/db/factories.rb +7 -1
  137. data/lib/avo/action_model.rb +20 -0
  138. data/lib/avo/asset_manager.rb +30 -0
  139. data/lib/avo/base_action.rb +57 -42
  140. data/lib/avo/base_resource.rb +264 -227
  141. data/lib/avo/base_resource_tool.rb +9 -16
  142. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  143. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  144. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  145. data/lib/avo/concerns/has_controls.rb +37 -0
  146. data/lib/avo/concerns/has_description.rb +23 -0
  147. data/lib/avo/concerns/has_item_type.rb +42 -0
  148. data/lib/avo/concerns/has_items.rb +325 -0
  149. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  150. data/lib/avo/concerns/is_resource_item.rb +24 -36
  151. data/lib/avo/concerns/is_visible.rb +15 -0
  152. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  153. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  154. data/lib/avo/configuration/branding.rb +0 -12
  155. data/lib/avo/configuration.rb +1 -37
  156. data/lib/avo/current.rb +39 -0
  157. data/lib/avo/dsl/field_parser.rb +1 -1
  158. data/lib/avo/dynamic_router.rb +18 -3
  159. data/lib/avo/engine.rb +35 -30
  160. data/lib/avo/error_manager.rb +25 -0
  161. data/lib/avo/execution_context.rb +10 -14
  162. data/lib/avo/fields/badge_field.rb +1 -1
  163. data/lib/avo/fields/base_field.rb +91 -106
  164. data/lib/avo/fields/belongs_to_field.rb +18 -22
  165. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  166. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  167. data/lib/avo/fields/concerns/has_default.rb +1 -5
  168. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  169. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  170. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  171. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  172. data/lib/avo/fields/concerns/is_required.rb +5 -7
  173. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  174. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  175. data/lib/avo/fields/country_field.rb +4 -0
  176. data/lib/avo/fields/date_time_field.rb +3 -14
  177. data/lib/avo/fields/field_manager.rb +55 -0
  178. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  179. data/lib/avo/fields/has_base_field.rb +12 -15
  180. data/lib/avo/fields/has_many_field.rb +5 -2
  181. data/lib/avo/fields/has_one_field.rb +6 -10
  182. data/lib/avo/fields/heading_field.rb +4 -1
  183. data/lib/avo/fields/hidden_field.rb +1 -1
  184. data/lib/avo/fields/id_field.rb +1 -1
  185. data/lib/avo/fields/location_field.rb +8 -8
  186. data/lib/avo/fields/password_field.rb +1 -1
  187. data/lib/avo/fields/preview_field.rb +14 -0
  188. data/lib/avo/fields/select_field.rb +12 -8
  189. data/lib/avo/fields/status_field.rb +4 -0
  190. data/lib/avo/filters/base_filter.rb +8 -4
  191. data/lib/avo/html/builder.rb +7 -8
  192. data/lib/avo/item_grapher.rb +78 -0
  193. data/lib/avo/licensing/h_q.rb +8 -67
  194. data/lib/avo/licensing/license.rb +1 -1
  195. data/lib/avo/licensing/pro_license.rb +1 -7
  196. data/lib/avo/loaders/fields_loader.rb +7 -1
  197. data/lib/avo/plugin.rb +16 -0
  198. data/lib/avo/plugin_manager.rb +56 -0
  199. data/lib/avo/prefixed_test_helpers.rb +20 -0
  200. data/lib/avo/reloader.rb +3 -0
  201. data/lib/avo/resources/controls/actions_list.rb +7 -12
  202. data/lib/avo/resources/controls/attach_button.rb +15 -0
  203. data/lib/avo/resources/controls/back_button.rb +1 -1
  204. data/lib/avo/resources/controls/base_control.rb +15 -49
  205. data/lib/avo/resources/controls/create_button.rb +15 -0
  206. data/lib/avo/resources/controls/delete_button.rb +5 -1
  207. data/lib/avo/resources/controls/detach_button.rb +4 -1
  208. data/lib/avo/resources/controls/edit_button.rb +4 -1
  209. data/lib/avo/resources/controls/order_controls.rb +8 -0
  210. data/lib/avo/resources/controls/save_button.rb +13 -0
  211. data/lib/avo/resources/controls/show_button.rb +15 -0
  212. data/lib/avo/resources/items/holder.rb +84 -0
  213. data/lib/avo/resources/items/item_group.rb +49 -0
  214. data/lib/avo/resources/items/main_panel.rb +2 -0
  215. data/lib/avo/resources/items/panel.rb +2 -0
  216. data/lib/avo/resources/items/row.rb +54 -0
  217. data/lib/avo/resources/items/sidebar.rb +47 -0
  218. data/lib/avo/resources/items/tab.rb +60 -0
  219. data/lib/avo/resources/items/tab_group.rb +68 -0
  220. data/lib/avo/resources/resource_manager.rb +174 -0
  221. data/lib/avo/services/authorization_service.rb +11 -110
  222. data/lib/avo/services/debug_service.rb +93 -0
  223. data/lib/avo/services/encryption_service.rb +5 -1
  224. data/lib/avo/services/telemetry_service.rb +85 -0
  225. data/lib/avo/test_helpers.rb +362 -0
  226. data/lib/avo/tools/tool_manager.rb +30 -0
  227. data/lib/avo/version.rb +1 -1
  228. data/lib/avo.rb +115 -24
  229. data/lib/generators/avo/action_generator.rb +8 -8
  230. data/lib/generators/avo/card_generator.rb +27 -0
  231. data/lib/generators/avo/filter_generator.rb +8 -8
  232. data/lib/generators/avo/resource_generator.rb +4 -4
  233. data/lib/generators/avo/scope_generator.rb +15 -0
  234. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  235. data/lib/generators/avo/templates/action.tt +8 -6
  236. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  237. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  238. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  239. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  240. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  241. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  242. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  243. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  244. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  245. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  246. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  247. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  248. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  249. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  250. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  251. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  252. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  253. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  254. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  255. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  256. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  257. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  258. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  259. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  260. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  261. data/lib/generators/avo/templates/scope.tt +6 -0
  262. data/lib/generators/avo/templates/tool/view.tt +2 -2
  263. data/lib/tasks/avo_tasks.rake +27 -0
  264. data/public/avo-assets/avo.base.css +1810 -1189
  265. data/public/avo-assets/avo.base.js +217 -307
  266. data/public/avo-assets/avo.base.js.map +3 -3
  267. data/public/avo-assets/avo.css +9744 -0
  268. data/public/avo-assets/avo.js +513 -0
  269. data/public/avo-assets/avo.js.map +7 -0
  270. metadata +102 -146
  271. data/app/assets/stylesheets/css/tags.css +0 -32
  272. data/app/components/avo/card_component.html.erb +0 -46
  273. data/app/components/avo/card_component.rb +0 -25
  274. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  275. data/app/components/avo/dashboards/divider_component.rb +0 -19
  276. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  277. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  278. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  279. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  280. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  281. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  282. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  283. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  284. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  285. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  286. data/app/components/avo/index/ordering/base_component.rb +0 -9
  287. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  288. data/app/components/avo/index/ordering/button_component.rb +0 -23
  289. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  290. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  291. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  292. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  293. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  294. data/app/controllers/avo/dashboards_controller.rb +0 -22
  295. data/app/controllers/avo/reorder_controller.rb +0 -25
  296. data/app/javascript/js/controllers/base_controller.js +0 -22
  297. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  298. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  299. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  300. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  301. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  302. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  303. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  304. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  305. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  306. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  307. data/app/views/avo/dashboards/show.html.erb +0 -38
  308. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  309. data/app/views/avo/partials/_global_search.html.erb +0 -19
  310. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  311. data/lib/avo/app.rb +0 -237
  312. data/lib/avo/base_card.rb +0 -161
  313. data/lib/avo/concerns/fetches_things.rb +0 -150
  314. data/lib/avo/concerns/handles_field_args.rb +0 -47
  315. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  316. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  317. data/lib/avo/concerns/has_fields.rb +0 -334
  318. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  319. data/lib/avo/concerns/pagination.rb +0 -53
  320. data/lib/avo/concerns/policy_helpers.rb +0 -31
  321. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  322. data/lib/avo/concerns/visible_items.rb +0 -51
  323. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  324. data/lib/avo/dashboards/base_divider.rb +0 -35
  325. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  326. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  327. data/lib/avo/dashboards/metric_card.rb +0 -9
  328. data/lib/avo/dashboards/partial_card.rb +0 -7
  329. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  330. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  331. data/lib/avo/fields/tags_field.rb +0 -102
  332. data/lib/avo/grid_collector.rb +0 -42
  333. data/lib/avo/hosts/association_scope_host.rb +0 -8
  334. data/lib/avo/hosts/base_host.rb +0 -25
  335. data/lib/avo/hosts/card_visibility.rb +0 -20
  336. data/lib/avo/hosts/dashboard_card.rb +0 -22
  337. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  338. data/lib/avo/hosts/ordering.rb +0 -22
  339. data/lib/avo/hosts/record_host.rb +0 -7
  340. data/lib/avo/hosts/resource_record_host.rb +0 -7
  341. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  342. data/lib/avo/hosts/search_scope_host.rb +0 -7
  343. data/lib/avo/hosts/view_record_host.rb +0 -7
  344. data/lib/avo/hosts/visibility_host.rb +0 -12
  345. data/lib/avo/items_holder.rb +0 -96
  346. data/lib/avo/main_panel.rb +0 -3
  347. data/lib/avo/menu/base_item.rb +0 -25
  348. data/lib/avo/menu/builder.rb +0 -82
  349. data/lib/avo/menu/dashboard.rb +0 -22
  350. data/lib/avo/menu/group.rb +0 -2
  351. data/lib/avo/menu/link.rb +0 -6
  352. data/lib/avo/menu/menu.rb +0 -2
  353. data/lib/avo/menu/resource.rb +0 -22
  354. data/lib/avo/menu/section.rb +0 -2
  355. data/lib/avo/panel.rb +0 -24
  356. data/lib/avo/panel_builder.rb +0 -25
  357. data/lib/avo/resources/controls/action.rb +0 -38
  358. data/lib/avo/resources/controls/execution_context.rb +0 -58
  359. data/lib/avo/resources/controls/items_holder.rb +0 -19
  360. data/lib/avo/resources/controls/link_to.rb +0 -27
  361. data/lib/avo/row.rb +0 -26
  362. data/lib/avo/row_builder.rb +0 -24
  363. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  364. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  365. data/lib/avo/sidebar.rb +0 -30
  366. data/lib/avo/sidebar_builder.rb +0 -24
  367. data/lib/avo/tab.rb +0 -72
  368. data/lib/avo/tab_builder.rb +0 -25
  369. data/lib/avo/tab_group.rb +0 -42
  370. data/lib/avo/tab_group_builder.rb +0 -43
  371. data/lib/avo/tools_manager.rb +0 -11
  372. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  373. data/lib/generators/avo/card/metric_generator.rb +0 -18
  374. data/lib/generators/avo/card/partial_generator.rb +0 -19
  375. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  376. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  377. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -5,17 +5,15 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def is_required?
8
- if required.respond_to? :call
9
- Avo::Hosts::ResourceViewRecordHost.new(block: required, record: model, view: view, resource: resource).handle
10
- else
11
- required.nil? ? required_from_validators : required
12
- end
8
+ return required_from_validators if required.nil?
9
+
10
+ Avo::ExecutionContext.new(target: required, record: record, view: view, resource: resource).handle
13
11
  end
14
12
 
15
13
  private
16
14
 
17
15
  def required_from_validators
18
- return false if model.nil?
16
+ return false if record.nil?
19
17
 
20
18
  validators.any? do |validator|
21
19
  validator.is_a? ActiveModel::Validations::PresenceValidator
@@ -23,7 +21,7 @@ module Avo
23
21
  end
24
22
 
25
23
  def validators
26
- model.class.validators_on(id)
24
+ record.class.validators_on(id)
27
25
  end
28
26
  end
29
27
  end
@@ -0,0 +1,13 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module IsSearchable
5
+ extend ActiveSupport::Concern
6
+
7
+ def is_searchable?
8
+ defined?(Avo::Pro) && @searchable && Avo.license.has_with_trial(:searchable_associations)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -5,7 +5,11 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def use_resource
8
- App.get_resource @use_resource
8
+ Avo.resource_manager.get_resource @use_resource
9
+ rescue
10
+ # On boot we eager load the resources before the app is set.
11
+ # Because of that, we don't have a resource manager.
12
+ nil
9
13
  end
10
14
  end
11
15
  end
@@ -30,6 +30,10 @@ module Avo
30
30
  end
31
31
  end
32
32
  end
33
+
34
+ def options_for_filter
35
+ select_options
36
+ end
33
37
  end
34
38
  end
35
39
  end
@@ -43,26 +43,15 @@ module Avo
43
43
  end
44
44
 
45
45
  def utc_time(value)
46
- time = Time.parse(value)
47
-
48
- if timezone.present? && !time.utc?
49
- ActiveSupport::TimeZone.new(timezone).local_to_utc(time)
46
+ if timezone.present?
47
+ ActiveSupport::TimeZone.new(timezone).local_to_utc(Time.parse(value))
50
48
  else
51
49
  value
52
50
  end
53
51
  end
54
52
 
55
53
  def timezone
56
- timezone = if @timezone.respond_to?(:call)
57
- return Avo::Hosts::ResourceViewRecordHost.new(block: @timezone, record: resource.model, resource: resource, view: view).handle
58
- else
59
- @timezone
60
- end
61
-
62
- # Fix for https://github.com/moment/luxon/issues/1358#issuecomment-2017477897
63
- return "Etc/UTC" if timezone&.downcase == "utc" && view.in?([:new, :create, :edit, :update])
64
-
65
- timezone
54
+ Avo::ExecutionContext.new(target: @timezone, record: resource.record, resource: resource, view: view).handle
66
55
  end
67
56
  end
68
57
  end
@@ -0,0 +1,55 @@
1
+ module Avo
2
+ module Fields
3
+ class FieldManager
4
+ class << self
5
+ def build
6
+ instance = new
7
+ instance.init_fields
8
+ instance
9
+ end
10
+ end
11
+
12
+ attr_reader :fields
13
+
14
+ def initialize
15
+ @fields = []
16
+ end
17
+
18
+ def all
19
+ fields
20
+ .map do |field|
21
+ field[:name] = field[:name].to_s
22
+
23
+ field
24
+ end
25
+ .uniq do |field|
26
+ field[:name]
27
+ end
28
+ end
29
+
30
+ # This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
31
+ # so later we can instantiate them on our resources.
32
+ #
33
+ # If the field has their `def_method` set up it will follow that convention, if not it will snake_case the name:
34
+ #
35
+ # Avo::Fields::TextField -> text
36
+ # Avo::Fields::DateTimeField -> date_time
37
+ def init_fields
38
+ Avo::Fields::BaseField.descendants.each do |class_name|
39
+ next if class_name.to_s == "BaseField"
40
+
41
+ if class_name.to_s.end_with? "Field"
42
+ load_field class_name.get_field_name, class_name
43
+ end
44
+ end
45
+ end
46
+
47
+ def load_field(method_name, klass)
48
+ fields.push(
49
+ name: method_name.to_s,
50
+ class: klass
51
+ )
52
+ end
53
+ end
54
+ end
55
+ end
@@ -4,8 +4,7 @@ module Avo
4
4
  def initialize(id, **args, &block)
5
5
  args[:updatable] = false
6
6
 
7
- hide_on :all
8
- show_on Avo.configuration.resource_default_view
7
+ only_on Avo.configuration.resource_default_view
9
8
 
10
9
  super(id, **args, &block)
11
10
  end
@@ -1,6 +1,7 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class HasBaseField < BaseField
4
+ include Avo::Fields::Concerns::IsSearchable
4
5
  include Avo::Fields::Concerns::UseResource
5
6
 
6
7
  attr_accessor :display
@@ -25,12 +26,8 @@ module Avo
25
26
  @link_to_child_resource = args[:link_to_child_resource] || false
26
27
  end
27
28
 
28
- def searchable
29
- @searchable && ::Avo::App.license.has_with_trial(:searchable_associations)
30
- end
31
-
32
- def resource
33
- @resource || Avo::App.get_resource_by_model_name(@model.class)
29
+ def field_resource
30
+ resource || Avo.resource_manager.get_resource_by_model_class(@record.class)
34
31
  end
35
32
 
36
33
  def turbo_frame
@@ -38,9 +35,9 @@ module Avo
38
35
  end
39
36
 
40
37
  def frame_url
41
- Avo::Services::URIService.parse(@resource.record_path)
38
+ Avo::Services::URIService.parse(field_resource.record_path)
42
39
  .append_path(id.to_s)
43
- .append_query(turbo_frame: turbo_frame.to_s)
40
+ .append_query(turbo_frame: turbo_frame)
44
41
  .to_s
45
42
  end
46
43
 
@@ -53,18 +50,18 @@ module Avo
53
50
 
54
51
  # What the user sees in the text field
55
52
  def field_label
56
- value.send(target_resource.class.title)
53
+ target_resource.hydrate(record: value).record_title
57
54
  rescue
58
55
  nil
59
56
  end
60
57
 
61
58
  def target_resource
62
- if @model._reflections[id.to_s].klass.present?
63
- Avo::App.get_resource_by_model_name @model._reflections[id.to_s].klass.to_s
64
- elsif @model._reflections[id.to_s].options[:class_name].present?
65
- Avo::App.get_resource_by_model_name @model._reflections[id.to_s].options[:class_name]
59
+ if @record._reflections[id.to_s].klass.present?
60
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].klass.to_s
61
+ elsif @record._reflections[id.to_s].options[:class_name].present?
62
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].options[:class_name]
66
63
  else
67
- Avo::App.get_resource_by_name id.to_s
64
+ Avo.resource_manager.get_resource_by_name id.to_s
68
65
  end
69
66
  end
70
67
 
@@ -90,7 +87,7 @@ module Avo
90
87
 
91
88
  def authorized?
92
89
  method = "view_#{id}?".to_sym
93
- service = resource.authorization
90
+ service = field_resource.authorization
94
91
 
95
92
  if service.has_method? method
96
93
  service.authorize_action(method, raise_exception: false)
@@ -4,11 +4,14 @@ module Avo
4
4
  def initialize(id, **args, &block)
5
5
  args[:updatable] = false
6
6
 
7
- hide_on :all
8
- show_on Avo.configuration.resource_default_view
7
+ only_on Avo.configuration.resource_default_view
9
8
 
10
9
  super(id, **args, &block)
11
10
  end
11
+
12
+ def translated_name(default:)
13
+ t(translation_key, count: 2, default: default_name).capitalize
14
+ end
12
15
  end
13
16
  end
14
17
  end
@@ -4,7 +4,7 @@ module Avo
4
4
  attr_accessor :relation_method
5
5
 
6
6
  def initialize(id, **args, &block)
7
- hide_on :new, :edit
7
+ hide_on :forms
8
8
 
9
9
  super(id, **args, &block)
10
10
 
@@ -17,12 +17,8 @@ module Avo
17
17
  value.send(target_resource.title)
18
18
  end
19
19
 
20
- def resource
21
- Avo::App.get_resource_by_model_name @model.class
22
- end
23
-
24
20
  def frame_url
25
- Avo::Services::URIService.parse(@resource.record_path)
21
+ Avo::Services::URIService.parse(field_resource.record_path)
26
22
  .append_paths(id, value.id)
27
23
  .append_query(turbo_frame: turbo_frame)
28
24
  .to_s
@@ -30,14 +26,14 @@ module Avo
30
26
 
31
27
  def fill_field(model, key, value, params)
32
28
  if value.blank?
33
- related_model = nil
29
+ related_record = nil
34
30
  else
35
31
  related_class = model.class.reflections[name.to_s.downcase].class_name
36
- related_resource = ::Avo::App.get_resource_by_model_name(related_class)
37
- related_model = related_resource.find_record value
32
+ related_resource = Avo.resource_manager.get_resource_by_model_class(related_class)
33
+ related_record = related_resource.find_record value
38
34
  end
39
35
 
40
- model.public_send("#{key}=", related_model)
36
+ model.public_send("#{key}=", related_record)
41
37
 
42
38
  model
43
39
  end
@@ -1,4 +1,4 @@
1
- require 'securerandom'
1
+ require "securerandom"
2
2
 
3
3
  module Avo
4
4
  module Fields
@@ -16,6 +16,9 @@ module Avo
16
16
 
17
17
  super(content, **args, &block)
18
18
 
19
+ # this field is not used to update anything
20
+ @for_presentation_only = true
21
+
19
22
  hide_on :index
20
23
 
21
24
  @as_html = args[:as_html].present? ? args[:as_html] : false
@@ -4,7 +4,7 @@ module Avo
4
4
  def initialize(id, **args, &block)
5
5
  super(id, **args, &block)
6
6
 
7
- only_on [:edit, :new]
7
+ only_on :forms
8
8
  end
9
9
  end
10
10
  end
@@ -6,7 +6,7 @@ module Avo
6
6
  def initialize(id, **args, &block)
7
7
  args[:readonly] = true
8
8
 
9
- hide_on [:edit, :new]
9
+ hide_on :forms
10
10
 
11
11
  super(id, **args, &block)
12
12
 
@@ -35,20 +35,20 @@ module Avo
35
35
 
36
36
  def as_lat_long_value(get)
37
37
  if get == :lat
38
- model.send(stored_as.first)
38
+ record.send(stored_as.first)
39
39
  elsif get == :long
40
- model.send(stored_as.last)
40
+ record.send(stored_as.last)
41
41
  end
42
42
  end
43
43
 
44
- def fill_field(model, key, value, params)
44
+ def fill_field(record, key, value, params)
45
45
  if value_as_array?
46
46
  latitude_field, longitude_field = stored_as
47
- model.send("#{latitude_field}=", value[latitude_field])
48
- model.send("#{longitude_field}=", value[longitude_field])
49
- model
47
+ record.send("#{latitude_field}=", value[latitude_field])
48
+ record.send("#{longitude_field}=", value[longitude_field])
49
+ record
50
50
  else
51
- super(model, key, value.split(","), params)
51
+ super(record, key, value.split(","), params)
52
52
  end
53
53
  end
54
54
 
@@ -62,7 +62,7 @@ module Avo
62
62
 
63
63
  def value
64
64
  if value_as_array?
65
- [@model.send(stored_as.first), @model.send(stored_as.last)]
65
+ [@record.send(stored_as.first), @record.send(stored_as.last)]
66
66
  else
67
67
  super
68
68
  end
@@ -6,7 +6,7 @@ module Avo
6
6
 
7
7
  super(id, **args, &block)
8
8
 
9
- hide_on [:index, :show]
9
+ hide_on :index, :show
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,14 @@
1
+ module Avo
2
+ module Fields
3
+ class PreviewField < BaseField
4
+ def table_header_label
5
+ # If the user gives us a name, use that, if not, leave it blank
6
+ if @args[:name].present?
7
+ @args[:name]
8
+ else
9
+ ""
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -14,11 +14,14 @@ module Avo
14
14
 
15
15
  @options_from_args = if args[:options].is_a? Hash
16
16
  ActiveSupport::HashWithIndifferentAccess.new args[:options]
17
+ elsif args[:enum].present?
18
+ args[:enum]
17
19
  else
18
20
  args[:options]
19
21
  end
20
- @enum = args[:enum].present? ? args[:enum] : nil
21
- @display_value = args[:display_value].present? ? args[:display_value] : false
22
+
23
+ @enum = args[:enum]
24
+ @display_value = args[:display_value] || false
22
25
  end
23
26
 
24
27
  def options_for_select
@@ -56,13 +59,14 @@ module Avo
56
59
 
57
60
  private
58
61
 
59
- # Cache options as options given on block or as options received from arguments
60
62
  def options
61
- if options_from_args.respond_to? :call
62
- options_from_args.call model: model, resource: resource, view: view, field: self
63
- else
64
- options_from_args
65
- end
63
+ Avo::ExecutionContext.new(
64
+ target: options_from_args,
65
+ record: record,
66
+ resource: resource,
67
+ view: view,
68
+ field: self
69
+ ).handle
66
70
  end
67
71
  end
68
72
  end
@@ -17,6 +17,10 @@ module Avo
17
17
 
18
18
  status
19
19
  end
20
+
21
+ def options_for_filter
22
+ [@failed_when, @loading_when].flatten
23
+ end
20
24
  end
21
25
  end
22
26
  end
@@ -12,7 +12,12 @@ module Avo
12
12
 
13
13
  attr_reader :arguments
14
14
 
15
- delegate :params, to: Avo::App
15
+ delegate :params, to: Avo::Current
16
+ delegate :request, to: Avo::Current
17
+ delegate :view_context, to: Avo::Current
18
+ def curent_user
19
+ Avo::Current.user
20
+ end
16
21
 
17
22
  class << self
18
23
  def decode_filters(filter_params)
@@ -68,14 +73,13 @@ module Avo
68
73
  return true if visible.blank?
69
74
 
70
75
  # Run the visible block if available
71
- Avo::Hosts::VisibilityHost.new(
72
- block: visible,
76
+ Avo::ExecutionContext.new(
77
+ target: visible,
73
78
  params: params,
74
79
  parent_resource: parent_resource,
75
80
  resource: resource,
76
81
  arguments: arguments
77
82
  ).handle
78
-
79
83
  end
80
84
  end
81
85
  end
@@ -19,9 +19,12 @@ class Avo::HTML::Builder
19
19
  attr_accessor :record
20
20
  attr_accessor :resource
21
21
 
22
- delegate :root_path, to: Avo::App
23
- delegate :params, to: Avo::App
24
- delegate :current_user, to: Avo::App
22
+ delegate :app, to: Avo::Current
23
+ delegate :root_path, to: :app
24
+ delegate :params, to: Avo::Current
25
+ def curent_user
26
+ Avo::Current.user
27
+ end
25
28
 
26
29
  def initialize(record: nil, resource: nil)
27
30
  @wrapper_stack = {}
@@ -120,11 +123,7 @@ class Avo::HTML::Builder
120
123
 
121
124
  # Parse the properties and assign them to the blocks
122
125
  def assign_property(property = :data, payload = nil, &block)
123
- value = if block.present?
124
- Avo::Hosts::RecordHost.new(block: block, record: record).handle
125
- else
126
- payload
127
- end
126
+ value = Avo::ExecutionContext.new(target: block || payload, record: record).handle
128
127
 
129
128
  send("#{property}_stack=", value)
130
129
  end
@@ -0,0 +1,78 @@
1
+ # Use it like this:
2
+ # Avo::ItemGrapher.new(resource).render(view: :edit)
3
+ class Avo::ItemGrapher
4
+ attr_reader :item
5
+
6
+ def initialize(item)
7
+ @item = item
8
+ end
9
+
10
+ def decode_item(item)
11
+ result = ""
12
+ result << "──" * (item[:level])
13
+ result << "→"
14
+ result << item[:id]
15
+ if item[:items].present?
16
+ item[:items].each do |itm|
17
+ result << "<br />"
18
+ result << decode_item(itm)
19
+ end
20
+
21
+ end
22
+ result
23
+ end
24
+
25
+ def unwrap(i, level = 0, view: :show)
26
+ result = []
27
+
28
+ i.items.each do |item|
29
+ label = ""
30
+ label << item.class.name.demodulize
31
+ label << " "
32
+ if item.respond_to?(:name)
33
+ label << "{#{item.name}}"
34
+ label << " "
35
+ end
36
+ label << (item.hydrate(view: view).visible_in_view?(view: view) ? "visible" : "invisible")
37
+ if item.class.ancestors.include?(Avo::Concerns::HasItems)
38
+ if item.visible_items.present?
39
+ label << " | HAS_ITEMS #{item.visible_items.count} items"
40
+ # abort item.visible_items.inspect
41
+ label << item.visible_items.map(&:class).inspect
42
+ else
43
+ label << " | DOES_NOT_HAVE_ITEMS"
44
+ end
45
+ end
46
+ if item.respond_to?(:is_empty?)
47
+ label << " "
48
+ label << (item.is_empty? ? "[IS EMPTY!]" : "[#{item.visible_items.count}]")
49
+ end
50
+ payload = if item.respond_to?(:items) && item.items.present?
51
+ {
52
+ id: label,
53
+ items: unwrap(item, level + 1),
54
+ }
55
+ else
56
+ {
57
+ id: label
58
+ }
59
+ end
60
+
61
+ result << {
62
+ **payload,
63
+ level: level,
64
+ }
65
+ end
66
+
67
+ result
68
+ end
69
+
70
+ def render(**args)
71
+ result = unwrap(item, **args)
72
+ .map do |item|
73
+ decode_item(item)
74
+ end
75
+ .join("<br />")
76
+ "<pre>#{result}</pre>".html_safe
77
+ end
78
+ end