avo 2.45.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 (371) 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 +8 -8
  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/index_component.rb +5 -5
  40. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  41. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  42. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  43. data/app/components/avo/fields/show_component.rb +4 -1
  44. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  45. data/app/components/avo/filters_component.html.erb +9 -3
  46. data/app/components/avo/filters_component.rb +4 -4
  47. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  48. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  49. data/app/components/avo/index/grid_item_component.rb +43 -16
  50. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  51. data/app/components/avo/index/resource_controls_component.rb +124 -17
  52. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  53. data/app/components/avo/index/resource_grid_component.rb +5 -2
  54. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  55. data/app/components/avo/index/resource_map_component.rb +3 -3
  56. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  57. data/app/components/avo/index/resource_table_component.rb +14 -20
  58. data/app/components/avo/index/table_row_component.html.erb +8 -4
  59. data/app/components/avo/index/table_row_component.rb +3 -2
  60. data/app/components/avo/item_switcher_component.rb +2 -2
  61. data/app/components/avo/modal_component.html.erb +7 -12
  62. data/app/components/avo/modal_component.rb +0 -21
  63. data/app/components/avo/paginator_component.html.erb +40 -29
  64. data/app/components/avo/paginator_component.rb +5 -23
  65. data/app/components/avo/panel_component.html.erb +8 -6
  66. data/app/components/avo/referrer_params_component.html.erb +1 -2
  67. data/app/components/avo/resource_component.rb +189 -14
  68. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  69. data/app/components/avo/resource_sidebar_component.rb +1 -1
  70. data/app/components/avo/sidebar/link_component.rb +1 -1
  71. data/app/components/avo/sidebar_component.html.erb +10 -3
  72. data/app/components/avo/sidebar_component.rb +5 -3
  73. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  74. data/app/components/avo/tab_group_component.html.erb +13 -7
  75. data/app/components/avo/tab_group_component.rb +1 -6
  76. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  77. data/app/components/avo/tab_switcher_component.rb +4 -39
  78. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  79. data/app/components/avo/views/resource_edit_component.rb +7 -18
  80. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  81. data/app/components/avo/views/resource_index_component.rb +62 -12
  82. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  83. data/app/components/avo/views/resource_show_component.rb +6 -11
  84. data/app/controllers/avo/actions_controller.rb +27 -24
  85. data/app/controllers/avo/application_controller.rb +105 -151
  86. data/app/controllers/avo/associations_controller.rb +34 -43
  87. data/app/controllers/avo/attachments_controller.rb +4 -4
  88. data/app/controllers/avo/base_controller.rb +102 -102
  89. data/app/controllers/avo/debug_controller.rb +17 -5
  90. data/app/controllers/avo/home_controller.rb +1 -1
  91. data/app/controllers/avo/search_controller.rb +30 -51
  92. data/app/controllers/avo/team_users_controller.rb +4 -0
  93. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  94. data/app/helpers/avo/application_helper.rb +15 -9
  95. data/app/helpers/avo/resources_helper.rb +1 -1
  96. data/app/helpers/avo/url_helpers.rb +27 -11
  97. data/app/javascript/avo.base.js +1 -0
  98. data/app/javascript/js/application.js +0 -3
  99. data/app/javascript/js/controllers/action_controller.js +5 -3
  100. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  101. data/app/javascript/js/controllers/filter_controller.js +1 -1
  102. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  103. data/app/javascript/js/controllers/preview_controller.js +24 -0
  104. data/app/javascript/js/controllers/search_controller.js +2 -2
  105. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  106. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  107. data/app/javascript/js/controllers.js +10 -6
  108. data/app/javascript/js/custom-stream-actions.js +15 -0
  109. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  110. data/app/views/avo/actions/show.html.erb +9 -6
  111. data/app/views/avo/associations/new.html.erb +2 -2
  112. data/app/views/avo/base/index.html.erb +3 -2
  113. data/app/views/avo/base/new.html.erb +2 -1
  114. data/app/views/avo/base/preview.html.erb +19 -0
  115. data/app/views/avo/base/show.html.erb +1 -1
  116. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  117. data/app/views/avo/debug/report.html.erb +32 -17
  118. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  119. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  120. data/app/views/avo/partials/_footer.html.erb +1 -1
  121. data/app/views/avo/partials/_javascript.html.erb +5 -0
  122. data/app/views/avo/partials/_logo.html.erb +1 -1
  123. data/app/views/avo/partials/_navbar.html.erb +3 -5
  124. data/app/views/avo/partials/_table_header.html.erb +5 -11
  125. data/app/views/layouts/avo/application.html.erb +4 -2
  126. data/avo.gemspec +7 -7
  127. data/bin/dev +1 -1
  128. data/bin/prod +0 -0
  129. data/config/i18n-tasks.yml +1 -1
  130. data/config/initializers/pagy.rb +0 -2
  131. data/config/master.key +1 -0
  132. data/config/routes.rb +6 -10
  133. data/db/factories.rb +7 -1
  134. data/lib/avo/action_model.rb +20 -0
  135. data/lib/avo/asset_manager.rb +30 -0
  136. data/lib/avo/base_action.rb +57 -41
  137. data/lib/avo/base_resource.rb +263 -226
  138. data/lib/avo/base_resource_tool.rb +9 -16
  139. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  140. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  141. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  142. data/lib/avo/concerns/has_controls.rb +37 -0
  143. data/lib/avo/concerns/has_description.rb +23 -0
  144. data/lib/avo/concerns/has_item_type.rb +42 -0
  145. data/lib/avo/concerns/has_items.rb +325 -0
  146. data/lib/avo/concerns/is_resource_item.rb +24 -36
  147. data/lib/avo/concerns/is_visible.rb +15 -0
  148. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  149. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  150. data/lib/avo/configuration/branding.rb +0 -12
  151. data/lib/avo/configuration.rb +1 -37
  152. data/lib/avo/current.rb +39 -0
  153. data/lib/avo/dsl/field_parser.rb +1 -1
  154. data/lib/avo/dynamic_router.rb +18 -3
  155. data/lib/avo/engine.rb +35 -30
  156. data/lib/avo/error_manager.rb +25 -0
  157. data/lib/avo/execution_context.rb +10 -14
  158. data/lib/avo/fields/badge_field.rb +1 -1
  159. data/lib/avo/fields/base_field.rb +91 -105
  160. data/lib/avo/fields/belongs_to_field.rb +18 -22
  161. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  162. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  163. data/lib/avo/fields/concerns/has_default.rb +1 -5
  164. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  165. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  166. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  167. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  168. data/lib/avo/fields/concerns/is_required.rb +5 -7
  169. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  170. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  171. data/lib/avo/fields/country_field.rb +4 -0
  172. data/lib/avo/fields/date_time_field.rb +1 -5
  173. data/lib/avo/fields/field_manager.rb +55 -0
  174. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  175. data/lib/avo/fields/has_base_field.rb +12 -15
  176. data/lib/avo/fields/has_many_field.rb +5 -2
  177. data/lib/avo/fields/has_one_field.rb +6 -10
  178. data/lib/avo/fields/heading_field.rb +4 -1
  179. data/lib/avo/fields/hidden_field.rb +1 -1
  180. data/lib/avo/fields/id_field.rb +1 -1
  181. data/lib/avo/fields/location_field.rb +8 -8
  182. data/lib/avo/fields/password_field.rb +1 -1
  183. data/lib/avo/fields/preview_field.rb +14 -0
  184. data/lib/avo/fields/select_field.rb +12 -8
  185. data/lib/avo/fields/status_field.rb +4 -0
  186. data/lib/avo/filters/base_filter.rb +8 -4
  187. data/lib/avo/html/builder.rb +7 -8
  188. data/lib/avo/item_grapher.rb +78 -0
  189. data/lib/avo/licensing/h_q.rb +7 -66
  190. data/lib/avo/licensing/license.rb +1 -1
  191. data/lib/avo/licensing/pro_license.rb +1 -7
  192. data/lib/avo/loaders/fields_loader.rb +7 -1
  193. data/lib/avo/plugin.rb +16 -0
  194. data/lib/avo/plugin_manager.rb +56 -0
  195. data/lib/avo/prefixed_test_helpers.rb +20 -0
  196. data/lib/avo/reloader.rb +3 -0
  197. data/lib/avo/resources/controls/actions_list.rb +7 -12
  198. data/lib/avo/resources/controls/attach_button.rb +15 -0
  199. data/lib/avo/resources/controls/back_button.rb +1 -1
  200. data/lib/avo/resources/controls/base_control.rb +15 -49
  201. data/lib/avo/resources/controls/create_button.rb +15 -0
  202. data/lib/avo/resources/controls/delete_button.rb +5 -1
  203. data/lib/avo/resources/controls/detach_button.rb +4 -1
  204. data/lib/avo/resources/controls/edit_button.rb +4 -1
  205. data/lib/avo/resources/controls/order_controls.rb +8 -0
  206. data/lib/avo/resources/controls/save_button.rb +13 -0
  207. data/lib/avo/resources/controls/show_button.rb +15 -0
  208. data/lib/avo/resources/items/holder.rb +84 -0
  209. data/lib/avo/resources/items/item_group.rb +49 -0
  210. data/lib/avo/resources/items/main_panel.rb +2 -0
  211. data/lib/avo/resources/items/panel.rb +2 -0
  212. data/lib/avo/resources/items/row.rb +54 -0
  213. data/lib/avo/resources/items/sidebar.rb +47 -0
  214. data/lib/avo/resources/items/tab.rb +60 -0
  215. data/lib/avo/resources/items/tab_group.rb +68 -0
  216. data/lib/avo/resources/resource_manager.rb +174 -0
  217. data/lib/avo/services/authorization_service.rb +11 -110
  218. data/lib/avo/services/debug_service.rb +93 -0
  219. data/lib/avo/services/telemetry_service.rb +85 -0
  220. data/lib/avo/test_helpers.rb +362 -0
  221. data/lib/avo/tools/tool_manager.rb +30 -0
  222. data/lib/avo/version.rb +1 -1
  223. data/lib/avo.rb +115 -24
  224. data/lib/generators/avo/action_generator.rb +8 -8
  225. data/lib/generators/avo/card_generator.rb +27 -0
  226. data/lib/generators/avo/filter_generator.rb +8 -8
  227. data/lib/generators/avo/resource_generator.rb +4 -4
  228. data/lib/generators/avo/scope_generator.rb +15 -0
  229. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  230. data/lib/generators/avo/templates/action.tt +8 -6
  231. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  232. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  233. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  234. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  235. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  236. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  237. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  238. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  239. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  240. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  241. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  242. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  243. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  244. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  245. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  246. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  247. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  248. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  249. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  250. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  251. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  252. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  253. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  254. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  255. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  256. data/lib/generators/avo/templates/scope.tt +6 -0
  257. data/lib/generators/avo/templates/tool/view.tt +2 -2
  258. data/lib/tasks/avo_tasks.rake +27 -0
  259. data/public/avo-assets/avo.base.css +1810 -1189
  260. data/public/avo-assets/avo.base.js +217 -305
  261. data/public/avo-assets/avo.base.js.map +3 -3
  262. data/public/avo-assets/avo.css +9744 -0
  263. data/public/avo-assets/avo.js +513 -0
  264. data/public/avo-assets/avo.js.map +7 -0
  265. metadata +96 -137
  266. data/app/assets/stylesheets/css/tags.css +0 -32
  267. data/app/components/avo/card_component.html.erb +0 -46
  268. data/app/components/avo/card_component.rb +0 -25
  269. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  270. data/app/components/avo/dashboards/divider_component.rb +0 -19
  271. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  272. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  273. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  274. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  275. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  276. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  277. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  278. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  279. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  280. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  281. data/app/components/avo/index/ordering/base_component.rb +0 -9
  282. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  283. data/app/components/avo/index/ordering/button_component.rb +0 -23
  284. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  285. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  286. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  287. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  288. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  289. data/app/controllers/avo/dashboards_controller.rb +0 -22
  290. data/app/controllers/avo/reorder_controller.rb +0 -25
  291. data/app/javascript/js/controllers/base_controller.js +0 -22
  292. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  293. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  294. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  295. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  296. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  297. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  298. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  299. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  300. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  301. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  302. data/app/views/avo/dashboards/show.html.erb +0 -38
  303. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  304. data/app/views/avo/partials/_global_search.html.erb +0 -19
  305. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  306. data/lib/avo/app.rb +0 -237
  307. data/lib/avo/base_card.rb +0 -161
  308. data/lib/avo/concerns/fetches_things.rb +0 -150
  309. data/lib/avo/concerns/handles_field_args.rb +0 -47
  310. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  311. data/lib/avo/concerns/has_fields.rb +0 -334
  312. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  313. data/lib/avo/concerns/pagination.rb +0 -53
  314. data/lib/avo/concerns/policy_helpers.rb +0 -31
  315. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  316. data/lib/avo/concerns/visible_items.rb +0 -51
  317. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  318. data/lib/avo/dashboards/base_divider.rb +0 -35
  319. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  320. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  321. data/lib/avo/dashboards/metric_card.rb +0 -9
  322. data/lib/avo/dashboards/partial_card.rb +0 -7
  323. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  324. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  325. data/lib/avo/fields/tags_field.rb +0 -102
  326. data/lib/avo/grid_collector.rb +0 -42
  327. data/lib/avo/hosts/association_scope_host.rb +0 -8
  328. data/lib/avo/hosts/base_host.rb +0 -25
  329. data/lib/avo/hosts/card_visibility.rb +0 -20
  330. data/lib/avo/hosts/dashboard_card.rb +0 -22
  331. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  332. data/lib/avo/hosts/ordering.rb +0 -22
  333. data/lib/avo/hosts/record_host.rb +0 -7
  334. data/lib/avo/hosts/resource_record_host.rb +0 -7
  335. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  336. data/lib/avo/hosts/search_scope_host.rb +0 -7
  337. data/lib/avo/hosts/view_record_host.rb +0 -7
  338. data/lib/avo/hosts/visibility_host.rb +0 -12
  339. data/lib/avo/items_holder.rb +0 -96
  340. data/lib/avo/main_panel.rb +0 -3
  341. data/lib/avo/menu/base_item.rb +0 -25
  342. data/lib/avo/menu/builder.rb +0 -82
  343. data/lib/avo/menu/dashboard.rb +0 -22
  344. data/lib/avo/menu/group.rb +0 -2
  345. data/lib/avo/menu/link.rb +0 -6
  346. data/lib/avo/menu/menu.rb +0 -2
  347. data/lib/avo/menu/resource.rb +0 -22
  348. data/lib/avo/menu/section.rb +0 -2
  349. data/lib/avo/panel.rb +0 -24
  350. data/lib/avo/panel_builder.rb +0 -25
  351. data/lib/avo/resources/controls/action.rb +0 -38
  352. data/lib/avo/resources/controls/execution_context.rb +0 -58
  353. data/lib/avo/resources/controls/items_holder.rb +0 -19
  354. data/lib/avo/resources/controls/link_to.rb +0 -27
  355. data/lib/avo/row.rb +0 -26
  356. data/lib/avo/row_builder.rb +0 -24
  357. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  358. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  359. data/lib/avo/sidebar.rb +0 -30
  360. data/lib/avo/sidebar_builder.rb +0 -24
  361. data/lib/avo/tab.rb +0 -72
  362. data/lib/avo/tab_builder.rb +0 -25
  363. data/lib/avo/tab_group.rb +0 -42
  364. data/lib/avo/tab_group_builder.rb +0 -43
  365. data/lib/avo/tools_manager.rb +0 -11
  366. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  367. data/lib/generators/avo/card/metric_generator.rb +0 -18
  368. data/lib/generators/avo/card/partial_generator.rb +0 -19
  369. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  370. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  371. /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
@@ -51,11 +51,7 @@ module Avo
51
51
  end
52
52
 
53
53
  def timezone
54
- if @timezone.respond_to?(:call)
55
- return Avo::Hosts::ResourceViewRecordHost.new(block: @timezone, record: resource.model, resource: resource, view: view).handle
56
- end
57
-
58
- @timezone
54
+ Avo::ExecutionContext.new(target: @timezone, record: resource.record, resource: resource, view: view).handle
59
55
  end
60
56
  end
61
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
@@ -4,6 +4,7 @@ module Avo
4
4
  attr_accessor :current_request
5
5
  attr_accessor :cache_store
6
6
 
7
+ # ENDPOINT = "https://v3.avohq.io/api/v1/licenses/check".freeze unless const_defined?(:ENDPOINT)
7
8
  ENDPOINT = "https://avohq.io/api/v1/licenses/check".freeze unless const_defined?(:ENDPOINT)
8
9
  REQUEST_TIMEOUT = 5 unless const_defined?(:REQUEST_TIMEOUT) # seconds
9
10
  CACHE_TIME = 3600 unless const_defined?(:CACHE_TIME) # seconds
@@ -16,7 +17,7 @@ module Avo
16
17
 
17
18
  def initialize(current_request = nil)
18
19
  @current_request = current_request
19
- @cache_store = Avo::App.cache_store
20
+ @cache_store = Avo.cache_store
20
21
  end
21
22
 
22
23
  def response
@@ -69,52 +70,14 @@ module Avo
69
70
  app_name: app_name
70
71
  }
71
72
 
72
- metadata = avo_metadata
73
- if metadata[:resources_count] != 0
74
- result[:avo_metadata] = metadata
75
- end
73
+ # metadata = Avo::Services::DebugService.avo_metadata
74
+ # if metadata[:resources_count] != 0
75
+ # result[:avo_metadata] = "metadata"
76
+ # end
76
77
 
77
78
  result
78
79
  end
79
80
 
80
- def avo_metadata
81
- resources = App.resources
82
- dashboards = App.dashboards
83
- field_definitions = resources.map(&:get_field_definitions)
84
- fields_count = field_definitions.map(&:count).sum
85
- fields_per_resource = sprintf("%0.01f", fields_count / (resources.count + 0.0))
86
-
87
- field_types = {}
88
- custom_fields_count = 0
89
- field_definitions.each do |fields|
90
- fields.each do |field|
91
- field_types[field.type] ||= 0
92
- field_types[field.type] += 1
93
-
94
- custom_fields_count += 1 if field.custom?
95
- end
96
- end
97
-
98
- {
99
- resources_count: resources.count,
100
- dashboards_count: dashboards.count,
101
- fields_count: fields_count,
102
- fields_per_resource: fields_per_resource,
103
- custom_fields_count: custom_fields_count,
104
- field_types: field_types,
105
- **other_metadata(:actions),
106
- **other_metadata(:filters),
107
- main_menu_present: Avo.configuration.main_menu.present?,
108
- profile_menu_present: Avo.configuration.profile_menu.present?,
109
- cache_store: Avo::App.cache_store&.class&.to_s,
110
- **config_metadata
111
- }
112
- rescue => e
113
- {
114
- error: e.message
115
- }
116
- end
117
-
118
81
  def cached_response
119
82
  cache_store.read self.class.cache_key
120
83
  end
@@ -185,7 +148,7 @@ module Avo
185
148
  end
186
149
 
187
150
  def perform_request
188
- ::Rails.logger.debug "[Avo] Performing request to avohq.io API to check license availability." if Rails.env.development?
151
+ Avo.logger.debug "Performing request to avohq.io API to check license availability." if Rails.env.development?
189
152
 
190
153
  if Rails.env.test?
191
154
  OpenStruct.new({code: 200, parsed_response: {id: "pro", valid: true}})
@@ -200,28 +163,6 @@ module Avo
200
163
  nil
201
164
  end
202
165
 
203
- def other_metadata(type = :actions)
204
- resources = App.resources
205
-
206
- types = resources.map(&:"get_#{type}")
207
- type_count = types.flatten.uniq.count
208
- type_per_resource = sprintf("%0.01f", types.map(&:count).sum / (resources.count + 0.0))
209
-
210
- {
211
- "#{type}_count": type_count,
212
- "#{type}_per_resource": type_per_resource
213
- }
214
- end
215
-
216
- def config_metadata
217
- {
218
- config: {
219
- root_path: Avo.configuration.root_path,
220
- app_name: Avo.configuration.app_name
221
- }
222
- }
223
- end
224
-
225
166
  def cache_and_return_error(error, exception_message = "")
226
167
  cache_response response: {
227
168
  id: Avo.configuration.license,