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
@@ -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
@@ -0,0 +1,54 @@
1
+ class Avo::Resources::Items::Row
2
+ include Avo::Concerns::IsResourceItem
3
+ include Avo::Concerns::HasItems
4
+ include Avo::Concerns::HasItemType
5
+ include Avo::Concerns::IsVisible
6
+
7
+ class_attribute :item_type, default: :row
8
+
9
+ attr_reader :view
10
+ attr_accessor :items_holder
11
+
12
+ delegate :items, :add_item, to: :items_holder
13
+
14
+ def initialize(view: nil)
15
+ @view = view
16
+ @items_holder = Avo::Resources::Items::Holder.new
17
+ end
18
+
19
+ def hydrate(view: nil, resource: nil, **args)
20
+ @view = view
21
+ @resource = resource
22
+
23
+ self
24
+ end
25
+
26
+ def has_items?
27
+ @items.present?
28
+ end
29
+
30
+ class Builder
31
+ class << self
32
+ def parse_block(**args, &block)
33
+ Docile.dsl_eval(new(**args), &block).build
34
+ end
35
+ end
36
+
37
+ attr_reader :items_holder
38
+
39
+ delegate :field, to: :items_holder
40
+ delegate :tool, to: :items_holder
41
+ delegate :items, to: :items_holder
42
+
43
+ def initialize(**args)
44
+ @row = Avo::Resources::Items::Row.new(**args)
45
+ @items_holder = Avo::Resources::Items::Holder.new
46
+ end
47
+
48
+ # Fetch the tab
49
+ def build
50
+ @row.items_holder = @items_holder
51
+ @row
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,47 @@
1
+ class Avo::Resources::Items::Sidebar
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
+ delegate :items, :add_item, to: :items_holder
10
+
11
+ attr_reader :name
12
+
13
+ def initialize(name: nil, view: nil, **args)
14
+ @name = name
15
+ @items_holder = Avo::Resources::Items::Holder.new
16
+ @view = view
17
+ @args = args
18
+
19
+ post_initialize if respond_to?(:post_initialize)
20
+ end
21
+
22
+ class Builder
23
+ class << self
24
+ def parse_block(**args, &block)
25
+ Docile.dsl_eval(new(**args), &block).build
26
+ end
27
+ end
28
+
29
+ attr_reader :items_holder
30
+
31
+ delegate :field, to: :items_holder
32
+ delegate :items, to: :items_holder
33
+ delegate :heading, to: :items_holder
34
+
35
+ def initialize(name: nil, **args)
36
+ @sidebar = Avo::Resources::Items::Sidebar.new(**args)
37
+ @items_holder = Avo::Resources::Items::Holder.new
38
+ end
39
+
40
+ # Fetch the sidebar
41
+ def build
42
+ @sidebar.items_holder = @items_holder
43
+ @sidebar
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,60 @@
1
+ class Avo::Resources::Items::Tab
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
+ delegate :items, :add_item, to: :items_holder
10
+
11
+ attr_accessor :description
12
+
13
+ def initialize(name: nil, description: nil, view: nil, **args)
14
+ @name = name
15
+ @description = description
16
+ @items_holder = Avo::Resources::Items::Holder.new
17
+ @view = view
18
+ @args = args
19
+
20
+ post_initialize if respond_to?(:post_initialize)
21
+ end
22
+
23
+ def name
24
+ Avo::ExecutionContext.new(target: @name).handle
25
+ end
26
+
27
+ def turbo_frame_id(parent: nil)
28
+ id = "#{Avo::Resources::Items::Tab.to_s.parameterize} #{name}".parameterize
29
+
30
+ return id if parent.nil?
31
+
32
+ "#{parent.turbo_frame_id} #{id}".parameterize
33
+ end
34
+
35
+ class Builder
36
+ class << self
37
+ def parse_block(**args, &block)
38
+ Docile.dsl_eval(new(**args), &block).build
39
+ end
40
+ end
41
+
42
+ attr_reader :items_holder
43
+
44
+ delegate :field, to: :items_holder
45
+ delegate :tool, to: :items_holder
46
+ delegate :panel, to: :items_holder
47
+ delegate :items, to: :items_holder
48
+
49
+ def initialize(name: nil, **args)
50
+ @tab = Avo::Resources::Items::Tab.new(name: name, **args)
51
+ @items_holder = Avo::Resources::Items::Holder.new
52
+ end
53
+
54
+ # Fetch the tab
55
+ def build
56
+ @tab.items_holder = @items_holder
57
+ @tab
58
+ end
59
+ end
60
+ end