avo 2.51.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 +105 -110
  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 -4
  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
@@ -4,9 +4,10 @@ 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
- CACHE_TIME = 3600*12 unless const_defined?(:CACHE_TIME) # seconds
10
+ CACHE_TIME = 3600 unless const_defined?(:CACHE_TIME) # seconds
10
11
 
11
12
  class << self
12
13
  def cache_key
@@ -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,
@@ -64,7 +64,7 @@ module Avo
64
64
  if id.present?
65
65
  id.humanize
66
66
  else
67
- self.class.to_s.split('::').last.underscore.humanize.gsub ' license', ''
67
+ self.class.to_s.split("::").last.underscore.humanize.gsub " license", ""
68
68
  end
69
69
  end
70
70
  end
@@ -4,19 +4,13 @@ module Avo
4
4
  def abilities
5
5
  [
6
6
  :authorization,
7
- :localization,
8
- :custom_tools,
9
- :custom_fields,
10
- :resource_tools,
11
7
  :global_search,
12
8
  :enhanced_search_results,
13
9
  :searchable_associations,
14
10
  :resource_ordering,
15
11
  :dashboards,
16
12
  :menu_editor,
17
- :stimulus_js_integration,
18
- :resource_show_controls,
19
- :branding,
13
+ :customizable_controls,
20
14
  :resource_sidebar,
21
15
  :advanced_fields
22
16
  ]
@@ -6,7 +6,7 @@ module Avo
6
6
  end
7
7
 
8
8
  def method_missing(method, *args, &block)
9
- matched_field = Avo::App.fields.find do |field|
9
+ matched_field = Avo.field_manager.find do |field|
10
10
  field[:name].to_s == method.to_s
11
11
  end
12
12
 
@@ -22,6 +22,12 @@ module Avo
22
22
  add_field field
23
23
  end
24
24
  end
25
+
26
+ def respond_to_missing?(method)
27
+ Avo.field_manager.find do |field|
28
+ field[:name].to_s == method.to_s
29
+ end
30
+ end
25
31
  end
26
32
  end
27
33
  end
data/lib/avo/plugin.rb ADDED
@@ -0,0 +1,16 @@
1
+ module Avo
2
+ class Plugin
3
+ def initialize(*, **, &block)
4
+ end
5
+
6
+ class << self
7
+ def version
8
+ "#{namespace}::VERSION".safe_constantize
9
+ end
10
+
11
+ def namespace
12
+ to_s.split("::").first
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,56 @@
1
+ module Avo
2
+ class PluginManager
3
+ attr_reader :plugins
4
+
5
+ alias_method :all, :plugins
6
+
7
+ def initialize
8
+ @plugins = []
9
+ end
10
+
11
+ def register(plugin_klass, priority: 10)
12
+ @plugins << OpenStruct.new(klass: plugin_klass, priority: priority)
13
+ end
14
+
15
+ def boot_plugins
16
+ Avo.plugin_manager.all.sort_by(&:priority).each do |plugin|
17
+ plugin.klass.boot
18
+ end
19
+ end
20
+
21
+ def init_plugins
22
+ Avo.plugin_manager.all.sort_by(&:priority).each do |plugin|
23
+ plugin.klass.init
24
+ end
25
+ end
26
+
27
+ def register_field(method_name, klass)
28
+ Avo.field_manager.load_field method_name, klass
29
+ end
30
+
31
+ def register_resource_tool
32
+ end
33
+
34
+ def register_tool
35
+ end
36
+
37
+ def as_json(*arg)
38
+ plugins.map do |plugin|
39
+ {
40
+ klass: plugin.klass.to_s,
41
+ priority: plugin.priority,
42
+ }
43
+ end
44
+ end
45
+
46
+ def installed?(name)
47
+ plugins.any? do |plugin|
48
+ plugin.klass.to_s.chomp("::Plugin").underscore.tr("/", "-") == name.to_s
49
+ end
50
+ end
51
+ end
52
+
53
+ def self.plugin_manager
54
+ @plugin_manager ||= PluginManager.new
55
+ end
56
+ end
@@ -0,0 +1,20 @@
1
+ # This module is used to namespace all of the methods from Avo::TestHelpers.
2
+ #
3
+ # It loops through all of the public instance methods from Avo::TestHelpers and defines new methods in the current
4
+ # module with the same name but prefixed with "avo_".
5
+ #
6
+ # For example, if Avo::TestHelpers has a public instance method called example_method, this code will define a new
7
+ # method called avo_example_method in Avo::PrefixedTestHelpers module which when called will call example_method
8
+ # with the same arguments.
9
+
10
+ module Avo
11
+ module PrefixedTestHelpers
12
+ include Avo::TestHelpers
13
+
14
+ Avo::TestHelpers.public_instance_methods.each do |method|
15
+ define_method("avo_#{method}") do |**args|
16
+ send(method, **args)
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/avo/reloader.rb CHANGED
@@ -45,6 +45,9 @@ class Avo::Reloader
45
45
  # watch the lib directory in Avo development
46
46
  if reload_lib?
47
47
  dirs[Avo::Engine.root.join("lib", "avo").to_s] = ["rb"]
48
+ if Avo.avo_filters_installed?
49
+ dirs[Avo::DynamicFilters::Engine.root.join("lib", "avo", "dynamic_filters").to_s] = ["rb"]
50
+ end
48
51
  end
49
52
 
50
53
  dirs
@@ -2,20 +2,15 @@ module Avo
2
2
  module Resources
3
3
  module Controls
4
4
  class ActionsList < BaseControl
5
- def exclude
6
- Array.wrap(@args[:exclude]) || []
7
- end
8
-
9
- def include
10
- Array.wrap(@args[:include]) || []
11
- end
5
+ attr_reader :color, :exclude, :include, :style
12
6
 
13
- def color
14
- @args[:color] || :primary
15
- end
7
+ def initialize(**args)
8
+ super(**args)
16
9
 
17
- def style
18
- @args[:style] || :outline
10
+ @color = args[:color] || :primary
11
+ @exclude = args[:exclude] || []
12
+ @include = args[:include] || []
13
+ @style = args[:style] || :outline
19
14
  end
20
15
  end
21
16
  end
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class AttachButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ if args[:item].present?
9
+ @label = I18n.t("avo.attach_item", item: args[:item]) if label.nil?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,7 +5,7 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.go_back")
8
+ @label = args[:label] || I18n.t("avo.go_back")
9
9
  end
10
10
  end
11
11
  end
@@ -2,56 +2,22 @@ module Avo
2
2
  module Resources
3
3
  module Controls
4
4
  class BaseControl
5
- def initialize(**args)
6
- @args = args
7
- end
8
-
9
- def label
10
- @args[:label] || @label
11
- end
5
+ attr_reader :label, :title, :color, :style, :icon, :icon_class, :confirmation_message, :size, :as_index_control
12
6
 
13
- def title
14
- @args[:title]
15
- end
16
-
17
- def color
18
- @args[:color] || :gray
19
- end
20
-
21
- def style
22
- @args[:style] || :text
23
- end
24
-
25
- def icon
26
- @args[:icon] || nil
27
- end
28
-
29
- def back_button?
30
- is_a? Avo::Resources::Controls::BackButton
31
- end
32
-
33
- def edit_button?
34
- is_a? Avo::Resources::Controls::EditButton
35
- end
36
-
37
- def delete_button?
38
- is_a? Avo::Resources::Controls::DeleteButton
39
- end
40
-
41
- def actions_list?
42
- is_a? Avo::Resources::Controls::ActionsList
43
- end
44
-
45
- def link_to?
46
- is_a? Avo::Resources::Controls::LinkTo
47
- end
48
-
49
- def detach_button?
50
- is_a? Avo::Resources::Controls::DetachButton
51
- end
52
-
53
- def action?
54
- is_a? Avo::Resources::Controls::Action
7
+ def initialize(**args)
8
+ @label = args[:label]
9
+ @title = args[:title]
10
+ @color = args[:color] || :gray
11
+ @style = args[:style] || :text
12
+ @icon = args[:icon]
13
+ @icon_class = @style == :icon ? " text-gray-600 h-6 hover:text-gray-600" : ""
14
+ @confirmation_message = args[:confirmation_message]
15
+ @size = args[:size] || :md
16
+ @as_index_control = args[:as_index_control]
17
+ end
18
+
19
+ def type
20
+ self.class.name.demodulize.underscore.to_sym
55
21
  end
56
22
  end
57
23
  end
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class CreateButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ if args[:item].present?
9
+ @label = I18n.t("avo.create_new_item", item: args[:item].humanize(capitalize: false)) if label.nil?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,7 +5,11 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.delete").capitalize
8
+ @label = args[:label] || I18n.t("avo.delete").capitalize
9
+ if args[:item].present?
10
+ @title = I18n.t("avo.delete_item", item: args[:item]).humanize if title.nil?
11
+ @confirmation_message = I18n.t("avo.are_you_sure") if confirmation_message.nil?
12
+ end
9
13
  end
10
14
  end
11
15
  end
@@ -5,7 +5,10 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.detach_item", item: title).humanize
8
+ if args[:item].present?
9
+ @title = I18n.t("avo.detach_item", item: args[:item]).humanize if title.nil?
10
+ @confirmation_message = I18n.t("avo.are_you_sure_detach_item", item: args[:item]) if confirmation_message.nil?
11
+ end
9
12
  end
10
13
  end
11
14
  end
@@ -5,7 +5,10 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.edit").capitalize
8
+ @label = args[:label] || I18n.t("avo.edit").capitalize
9
+ if args[:item].present?
10
+ @title = I18n.t("avo.edit_item", item: args[:item]).humanize if title.nil?
11
+ end
9
12
  end
10
13
  end
11
14
  end
@@ -0,0 +1,8 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class OrderControls < BaseControl
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class SaveButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ @label = args[:label] || I18n.t("avo.save").capitalize
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class ShowButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ if args[:item].present?
9
+ @title = I18n.t("avo.view_item", item: args[:item]).humanize if title.nil?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,84 @@
1
+ class Avo::Resources::Items::Holder
2
+ attr_reader :tools
3
+ attr_accessor :items
4
+ attr_accessor :invalid_fields
5
+
6
+ def initialize
7
+ @items = []
8
+ @items_index = 0
9
+ @invalid_fields = []
10
+ end
11
+
12
+ # Adds a field to the items_holder
13
+ def field(field_name, **args, &block)
14
+ field_parser = Avo::Dsl::FieldParser.new(id: field_name, order_index: @items_index, **args, &block).parse
15
+
16
+ if field_parser.invalid?
17
+ as = args.fetch(:as, nil)
18
+
19
+ # End execution ehre and add the field to the invalid_fileds payload so we know to wanr the developer about that.
20
+ # @todo: Make sure this warning is still active
21
+ return add_invalid_field({
22
+ name: field_name,
23
+ as: as,
24
+ # resource: resource_class.name,
25
+ message: "There's an invalid field configuration for this resource. <br/> <code class='px-1 py-px rounded bg-red-600'>field :#{field_name}, as: :#{as}</code>"
26
+ })
27
+ end
28
+
29
+ add_item field_parser.instance
30
+ end
31
+
32
+ def tabs(tab = nil, **kwargs, &block)
33
+ if tab.present?
34
+ add_item tab
35
+ else
36
+ add_item Avo::Resources::Items::TabGroup::Builder.parse_block(**kwargs, &block)
37
+ end
38
+ end
39
+
40
+ def tab(name, **args, &block)
41
+ add_item Avo::Resources::Items::Tab::Builder.parse_block(name: name, **args, &block)
42
+ end
43
+
44
+ def row(**args, &block)
45
+ add_item Avo::Resources::Items::Row::Builder.parse_block(**args, &block)
46
+ end
47
+
48
+ def tool(klass, **args)
49
+ instance = klass.new(**args)
50
+ add_item instance
51
+ end
52
+
53
+ def panel(panel_name = nil, **args, &block)
54
+ panel = Avo::Resources::Items::ItemGroup::Builder.parse_block(name: panel_name, **args, &block)
55
+
56
+ add_item panel
57
+ end
58
+
59
+ def heading(body = nil, **args, &block)
60
+ field = Avo::Fields::HeadingField.new(body, **args)
61
+
62
+ add_item field
63
+ end
64
+
65
+ def sidebar(**args, &block)
66
+ add_item Avo::Resources::Items::Sidebar::Builder.parse_block(**args, &block)
67
+ end
68
+
69
+ def add_item(instance)
70
+ @items << instance
71
+
72
+ increment_order_index
73
+ end
74
+
75
+ private
76
+
77
+ def add_invalid_field(payload)
78
+ @invalid_fields << payload
79
+ end
80
+
81
+ def increment_order_index
82
+ @items_index += 1
83
+ end
84
+ end
@@ -0,0 +1,49 @@
1
+ class Avo::Resources::Items::ItemGroup
2
+ prepend Avo::Concerns::IsResourceItem
3
+
4
+ include Avo::Concerns::HasItems
5
+ include Avo::Concerns::HasItemType
6
+ include Avo::Concerns::IsVisible
7
+ include Avo::Concerns::VisibleInDifferentViews
8
+
9
+ attr_reader :name
10
+ attr_reader :description
11
+
12
+ delegate :items, :add_item, to: :items_holder
13
+
14
+ def initialize(name: nil, description: nil, view: nil, **args)
15
+ @name = name
16
+ @view = view
17
+ @description = description
18
+ @items_holder = Avo::Resources::Items::Holder.new
19
+ @args = args
20
+
21
+ post_initialize if respond_to?(:post_initialize)
22
+ end
23
+
24
+ class Builder
25
+ class << self
26
+ def parse_block(**args, &block)
27
+ Docile.dsl_eval(new(**args), &block).build
28
+ end
29
+ end
30
+
31
+ delegate :heading, to: :items_holder
32
+ delegate :field, to: :items_holder
33
+ delegate :row, to: :items_holder
34
+ delegate :items, to: :items_holder
35
+
36
+ attr_reader :items_holder
37
+
38
+ def initialize(name: nil, **args)
39
+ @panel = Avo::Resources::Items::Panel.new(name: name, **args)
40
+ @items_holder = Avo::Resources::Items::Holder.new
41
+ end
42
+
43
+ # Fetch the tab
44
+ def build
45
+ @panel.items_holder = @items_holder
46
+ @panel
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,2 @@
1
+ class Avo::Resources::Items::MainPanel < Avo::Resources::Items::Panel
2
+ end
@@ -0,0 +1,2 @@
1
+ class Avo::Resources::Items::Panel < Avo::Resources::Items::ItemGroup
2
+ end