avo 2.48.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 (376) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +15 -26
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
  40. data/app/components/avo/fields/index_component.rb +5 -5
  41. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  42. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  43. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  44. data/app/components/avo/fields/show_component.rb +4 -1
  45. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  46. data/app/components/avo/filters_component.html.erb +9 -3
  47. data/app/components/avo/filters_component.rb +4 -4
  48. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  49. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  50. data/app/components/avo/index/grid_item_component.rb +43 -16
  51. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  52. data/app/components/avo/index/resource_controls_component.rb +124 -17
  53. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  54. data/app/components/avo/index/resource_grid_component.rb +5 -2
  55. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  56. data/app/components/avo/index/resource_map_component.rb +3 -3
  57. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  58. data/app/components/avo/index/resource_table_component.rb +14 -20
  59. data/app/components/avo/index/table_row_component.html.erb +8 -4
  60. data/app/components/avo/index/table_row_component.rb +3 -2
  61. data/app/components/avo/item_switcher_component.rb +2 -2
  62. data/app/components/avo/modal_component.html.erb +7 -12
  63. data/app/components/avo/modal_component.rb +0 -21
  64. data/app/components/avo/paginator_component.html.erb +40 -29
  65. data/app/components/avo/paginator_component.rb +5 -23
  66. data/app/components/avo/panel_component.html.erb +8 -6
  67. data/app/components/avo/referrer_params_component.html.erb +1 -2
  68. data/app/components/avo/resource_component.rb +189 -14
  69. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  70. data/app/components/avo/resource_sidebar_component.rb +1 -1
  71. data/app/components/avo/sidebar/link_component.rb +1 -1
  72. data/app/components/avo/sidebar_component.html.erb +10 -3
  73. data/app/components/avo/sidebar_component.rb +5 -3
  74. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  75. data/app/components/avo/tab_group_component.html.erb +13 -7
  76. data/app/components/avo/tab_group_component.rb +1 -6
  77. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  78. data/app/components/avo/tab_switcher_component.rb +4 -39
  79. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  80. data/app/components/avo/views/resource_edit_component.rb +7 -18
  81. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  82. data/app/components/avo/views/resource_index_component.rb +62 -12
  83. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  84. data/app/components/avo/views/resource_show_component.rb +6 -11
  85. data/app/controllers/avo/actions_controller.rb +27 -24
  86. data/app/controllers/avo/application_controller.rb +105 -151
  87. data/app/controllers/avo/associations_controller.rb +34 -43
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +102 -102
  90. data/app/controllers/avo/debug_controller.rb +17 -5
  91. data/app/controllers/avo/home_controller.rb +1 -1
  92. data/app/controllers/avo/search_controller.rb +30 -51
  93. data/app/controllers/avo/team_users_controller.rb +4 -0
  94. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  95. data/app/helpers/avo/application_helper.rb +15 -9
  96. data/app/helpers/avo/resources_helper.rb +1 -1
  97. data/app/helpers/avo/url_helpers.rb +27 -11
  98. data/app/javascript/avo.base.js +1 -0
  99. data/app/javascript/js/application.js +0 -3
  100. data/app/javascript/js/controllers/action_controller.js +5 -3
  101. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  102. data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
  103. data/app/javascript/js/controllers/filter_controller.js +1 -1
  104. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  105. data/app/javascript/js/controllers/preview_controller.js +24 -0
  106. data/app/javascript/js/controllers/search_controller.js +2 -2
  107. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  108. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  109. data/app/javascript/js/controllers.js +10 -6
  110. data/app/javascript/js/custom-stream-actions.js +15 -0
  111. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  112. data/app/views/avo/actions/show.html.erb +10 -7
  113. data/app/views/avo/associations/new.html.erb +2 -2
  114. data/app/views/avo/base/index.html.erb +3 -2
  115. data/app/views/avo/base/new.html.erb +2 -1
  116. data/app/views/avo/base/preview.html.erb +19 -0
  117. data/app/views/avo/base/show.html.erb +1 -1
  118. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  119. data/app/views/avo/debug/report.html.erb +32 -17
  120. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  121. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  122. data/app/views/avo/partials/_footer.html.erb +1 -1
  123. data/app/views/avo/partials/_javascript.html.erb +5 -0
  124. data/app/views/avo/partials/_logo.html.erb +1 -1
  125. data/app/views/avo/partials/_navbar.html.erb +3 -5
  126. data/app/views/avo/partials/_table_header.html.erb +5 -11
  127. data/app/views/layouts/avo/application.html.erb +4 -2
  128. data/avo.gemspec +7 -7
  129. data/bin/dev +1 -1
  130. data/bin/prod +0 -0
  131. data/config/i18n-tasks.yml +1 -1
  132. data/config/initializers/pagy.rb +0 -2
  133. data/config/master.key +1 -0
  134. data/config/routes.rb +6 -10
  135. data/db/factories.rb +7 -1
  136. data/lib/avo/action_model.rb +20 -0
  137. data/lib/avo/asset_manager.rb +30 -0
  138. data/lib/avo/base_action.rb +57 -42
  139. data/lib/avo/base_resource.rb +264 -227
  140. data/lib/avo/base_resource_tool.rb +9 -16
  141. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  142. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  143. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  144. data/lib/avo/concerns/has_controls.rb +37 -0
  145. data/lib/avo/concerns/has_description.rb +23 -0
  146. data/lib/avo/concerns/has_item_type.rb +42 -0
  147. data/lib/avo/concerns/has_items.rb +325 -0
  148. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  149. data/lib/avo/concerns/is_resource_item.rb +24 -36
  150. data/lib/avo/concerns/is_visible.rb +15 -0
  151. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  152. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  153. data/lib/avo/configuration/branding.rb +0 -12
  154. data/lib/avo/configuration.rb +1 -37
  155. data/lib/avo/current.rb +39 -0
  156. data/lib/avo/dsl/field_parser.rb +1 -1
  157. data/lib/avo/dynamic_router.rb +18 -3
  158. data/lib/avo/engine.rb +35 -30
  159. data/lib/avo/error_manager.rb +25 -0
  160. data/lib/avo/execution_context.rb +10 -14
  161. data/lib/avo/fields/badge_field.rb +1 -1
  162. data/lib/avo/fields/base_field.rb +91 -106
  163. data/lib/avo/fields/belongs_to_field.rb +18 -22
  164. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  165. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  166. data/lib/avo/fields/concerns/has_default.rb +1 -5
  167. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  168. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  169. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  170. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  171. data/lib/avo/fields/concerns/is_required.rb +5 -7
  172. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  173. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  174. data/lib/avo/fields/country_field.rb +4 -0
  175. data/lib/avo/fields/date_time_field.rb +1 -5
  176. data/lib/avo/fields/field_manager.rb +55 -0
  177. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  178. data/lib/avo/fields/has_base_field.rb +12 -15
  179. data/lib/avo/fields/has_many_field.rb +5 -2
  180. data/lib/avo/fields/has_one_field.rb +6 -10
  181. data/lib/avo/fields/heading_field.rb +4 -1
  182. data/lib/avo/fields/hidden_field.rb +1 -1
  183. data/lib/avo/fields/id_field.rb +1 -1
  184. data/lib/avo/fields/location_field.rb +8 -8
  185. data/lib/avo/fields/password_field.rb +1 -1
  186. data/lib/avo/fields/preview_field.rb +14 -0
  187. data/lib/avo/fields/select_field.rb +12 -8
  188. data/lib/avo/fields/status_field.rb +4 -0
  189. data/lib/avo/filters/base_filter.rb +8 -4
  190. data/lib/avo/html/builder.rb +7 -8
  191. data/lib/avo/item_grapher.rb +78 -0
  192. data/lib/avo/licensing/h_q.rb +8 -67
  193. data/lib/avo/licensing/license.rb +1 -1
  194. data/lib/avo/licensing/pro_license.rb +1 -7
  195. data/lib/avo/loaders/fields_loader.rb +7 -1
  196. data/lib/avo/plugin.rb +16 -0
  197. data/lib/avo/plugin_manager.rb +56 -0
  198. data/lib/avo/prefixed_test_helpers.rb +20 -0
  199. data/lib/avo/reloader.rb +3 -0
  200. data/lib/avo/resources/controls/actions_list.rb +7 -12
  201. data/lib/avo/resources/controls/attach_button.rb +15 -0
  202. data/lib/avo/resources/controls/back_button.rb +1 -1
  203. data/lib/avo/resources/controls/base_control.rb +15 -49
  204. data/lib/avo/resources/controls/create_button.rb +15 -0
  205. data/lib/avo/resources/controls/delete_button.rb +5 -1
  206. data/lib/avo/resources/controls/detach_button.rb +4 -1
  207. data/lib/avo/resources/controls/edit_button.rb +4 -1
  208. data/lib/avo/resources/controls/order_controls.rb +8 -0
  209. data/lib/avo/resources/controls/save_button.rb +13 -0
  210. data/lib/avo/resources/controls/show_button.rb +15 -0
  211. data/lib/avo/resources/items/holder.rb +84 -0
  212. data/lib/avo/resources/items/item_group.rb +49 -0
  213. data/lib/avo/resources/items/main_panel.rb +2 -0
  214. data/lib/avo/resources/items/panel.rb +2 -0
  215. data/lib/avo/resources/items/row.rb +54 -0
  216. data/lib/avo/resources/items/sidebar.rb +47 -0
  217. data/lib/avo/resources/items/tab.rb +60 -0
  218. data/lib/avo/resources/items/tab_group.rb +68 -0
  219. data/lib/avo/resources/resource_manager.rb +174 -0
  220. data/lib/avo/services/authorization_service.rb +11 -110
  221. data/lib/avo/services/debug_service.rb +93 -0
  222. data/lib/avo/services/encryption_service.rb +5 -1
  223. data/lib/avo/services/telemetry_service.rb +85 -0
  224. data/lib/avo/test_helpers.rb +362 -0
  225. data/lib/avo/tools/tool_manager.rb +30 -0
  226. data/lib/avo/version.rb +1 -1
  227. data/lib/avo.rb +115 -24
  228. data/lib/generators/avo/action_generator.rb +8 -8
  229. data/lib/generators/avo/card_generator.rb +27 -0
  230. data/lib/generators/avo/filter_generator.rb +8 -8
  231. data/lib/generators/avo/resource_generator.rb +4 -4
  232. data/lib/generators/avo/scope_generator.rb +15 -0
  233. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  234. data/lib/generators/avo/templates/action.tt +8 -6
  235. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  236. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  237. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  238. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  239. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  240. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  241. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  242. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  243. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  244. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  245. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  246. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  247. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  248. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  249. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  250. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  251. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  252. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  253. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  254. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  255. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  256. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  257. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  258. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  259. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  260. data/lib/generators/avo/templates/scope.tt +6 -0
  261. data/lib/generators/avo/templates/tool/view.tt +2 -2
  262. data/lib/tasks/avo_tasks.rake +27 -0
  263. data/public/avo-assets/avo.base.css +1810 -1189
  264. data/public/avo-assets/avo.base.js +217 -307
  265. data/public/avo-assets/avo.base.js.map +3 -3
  266. data/public/avo-assets/avo.css +9744 -0
  267. data/public/avo-assets/avo.js +513 -0
  268. data/public/avo-assets/avo.js.map +7 -0
  269. metadata +97 -139
  270. data/app/assets/stylesheets/css/tags.css +0 -32
  271. data/app/components/avo/card_component.html.erb +0 -46
  272. data/app/components/avo/card_component.rb +0 -25
  273. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  274. data/app/components/avo/dashboards/divider_component.rb +0 -19
  275. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  276. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  277. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  278. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  279. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  280. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  281. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  282. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  283. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  284. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  285. data/app/components/avo/index/ordering/base_component.rb +0 -9
  286. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  287. data/app/components/avo/index/ordering/button_component.rb +0 -23
  288. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  289. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  290. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  291. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  292. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  293. data/app/controllers/avo/dashboards_controller.rb +0 -22
  294. data/app/controllers/avo/reorder_controller.rb +0 -25
  295. data/app/javascript/js/controllers/base_controller.js +0 -22
  296. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  297. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  298. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  299. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  300. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  301. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  302. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  303. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  304. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  305. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  306. data/app/views/avo/dashboards/show.html.erb +0 -38
  307. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  308. data/app/views/avo/partials/_global_search.html.erb +0 -19
  309. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  310. data/lib/avo/app.rb +0 -237
  311. data/lib/avo/base_card.rb +0 -161
  312. data/lib/avo/concerns/fetches_things.rb +0 -150
  313. data/lib/avo/concerns/handles_field_args.rb +0 -47
  314. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  315. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  316. data/lib/avo/concerns/has_fields.rb +0 -334
  317. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  318. data/lib/avo/concerns/pagination.rb +0 -53
  319. data/lib/avo/concerns/policy_helpers.rb +0 -31
  320. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  321. data/lib/avo/concerns/visible_items.rb +0 -51
  322. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  323. data/lib/avo/dashboards/base_divider.rb +0 -35
  324. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  325. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  326. data/lib/avo/dashboards/metric_card.rb +0 -9
  327. data/lib/avo/dashboards/partial_card.rb +0 -7
  328. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  329. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  330. data/lib/avo/fields/tags_field.rb +0 -102
  331. data/lib/avo/grid_collector.rb +0 -42
  332. data/lib/avo/hosts/association_scope_host.rb +0 -8
  333. data/lib/avo/hosts/base_host.rb +0 -25
  334. data/lib/avo/hosts/card_visibility.rb +0 -20
  335. data/lib/avo/hosts/dashboard_card.rb +0 -22
  336. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  337. data/lib/avo/hosts/ordering.rb +0 -22
  338. data/lib/avo/hosts/record_host.rb +0 -7
  339. data/lib/avo/hosts/resource_record_host.rb +0 -7
  340. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  341. data/lib/avo/hosts/search_scope_host.rb +0 -7
  342. data/lib/avo/hosts/view_record_host.rb +0 -7
  343. data/lib/avo/hosts/visibility_host.rb +0 -12
  344. data/lib/avo/items_holder.rb +0 -96
  345. data/lib/avo/main_panel.rb +0 -3
  346. data/lib/avo/menu/base_item.rb +0 -25
  347. data/lib/avo/menu/builder.rb +0 -82
  348. data/lib/avo/menu/dashboard.rb +0 -22
  349. data/lib/avo/menu/group.rb +0 -2
  350. data/lib/avo/menu/link.rb +0 -6
  351. data/lib/avo/menu/menu.rb +0 -2
  352. data/lib/avo/menu/resource.rb +0 -22
  353. data/lib/avo/menu/section.rb +0 -2
  354. data/lib/avo/panel.rb +0 -24
  355. data/lib/avo/panel_builder.rb +0 -25
  356. data/lib/avo/resources/controls/action.rb +0 -38
  357. data/lib/avo/resources/controls/execution_context.rb +0 -58
  358. data/lib/avo/resources/controls/items_holder.rb +0 -19
  359. data/lib/avo/resources/controls/link_to.rb +0 -27
  360. data/lib/avo/row.rb +0 -26
  361. data/lib/avo/row_builder.rb +0 -24
  362. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  363. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  364. data/lib/avo/sidebar.rb +0 -30
  365. data/lib/avo/sidebar_builder.rb +0 -24
  366. data/lib/avo/tab.rb +0 -72
  367. data/lib/avo/tab_builder.rb +0 -25
  368. data/lib/avo/tab_group.rb +0 -42
  369. data/lib/avo/tab_group_builder.rb +0 -43
  370. data/lib/avo/tools_manager.rb +0 -11
  371. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  372. data/lib/generators/avo/card/metric_generator.rb +0 -18
  373. data/lib/generators/avo/card/partial_generator.rb +0 -19
  374. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  375. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  376. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -1,36 +1,29 @@
1
1
  module Avo
2
2
  class BaseResourceTool
3
- include Avo::Concerns::IsResourceItem
4
- include Avo::Fields::FieldExtensions::VisibleInDifferentViews
3
+ prepend Avo::Concerns::IsResourceItem
4
+
5
+ include Avo::Concerns::HasItemType
6
+ include Avo::Concerns::IsVisible
7
+ include Avo::Concerns::VisibleInDifferentViews
5
8
 
6
9
  class_attribute :name
7
10
  class_attribute :partial
8
- class_attribute :item_type, default: :tool
9
11
 
10
12
  attr_accessor :params
11
- attr_accessor :resource
12
- attr_accessor :view
13
13
 
14
14
  def initialize(**args)
15
15
  # Set the visibility
16
- show_on Avo.configuration.resource_default_view
17
-
18
- show_on args[:show_on] if args[:show_on].present?
19
- hide_on args[:hide_on] if args[:hide_on].present?
20
- only_on args[:only_on] if args[:only_on].present?
21
- except_on args[:except_on] if args[:except_on].present?
22
- end
16
+ only_on Avo.configuration.resource_default_view
23
17
 
24
- def hydrate(view: nil)
25
- @view = view if view.present?
18
+ @args = args
26
19
 
27
- self
20
+ post_initialize if respond_to?(:post_initialize)
28
21
  end
29
22
 
30
23
  def partial
31
24
  return self.class.partial if self.class.partial.present?
32
25
 
33
- "avo/resource_tools/#{self.class.to_s.underscore}"
26
+ self.class.to_s.underscore
34
27
  end
35
28
  end
36
29
  end
@@ -50,7 +50,7 @@ module Avo
50
50
  when Symbol
51
51
  context.send(name)
52
52
  when Proc
53
- name.call(context)
53
+ Avo::ExecutionContext.new(target: name, context: context).handle
54
54
  else
55
55
  name.to_s
56
56
  end
@@ -61,7 +61,7 @@ module Avo
61
61
  when Symbol
62
62
  context.send(path)
63
63
  when Proc
64
- path.call(context)
64
+ Avo::ExecutionContext.new(target: path, context: context).handle
65
65
  else
66
66
  context.url_for(path)
67
67
  end
@@ -1,28 +1,24 @@
1
1
  module Avo
2
2
  module Concerns
3
- module CanReplaceFields
3
+ module CanReplaceItems
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- class_attribute :backup_items_holder
7
+ class_attribute :temporary_items
8
8
  end
9
9
 
10
10
  class_methods do
11
11
  def with_temporary_items(&block)
12
12
  # back-up the previous items
13
- self.backup_items_holder = items_holder
14
-
15
- self.items_holder = Avo::ItemsHolder.new
16
-
17
- instance_eval(&block)
13
+ self.temporary_items = block
18
14
  end
19
15
 
20
16
  def restore_items_from_backup
21
- self.items_holder = backup_items_holder if backup_items_holder.present?
17
+ self.temporary_items = nil
22
18
  end
23
19
 
24
20
  def with_new_items(&block)
25
- self.items_holder = Avo::ItemsHolder.new
21
+ self.items_holder = Avo::Resources::Items::Holder.new
26
22
 
27
23
  instance_eval(&block)
28
24
  end
@@ -33,9 +33,11 @@ module Avo
33
33
  end
34
34
 
35
35
  def cache_resource_filters?
36
- return Avo.configuration.cache_resource_filters unless Avo.configuration.cache_resource_filters.is_a?(Proc)
37
-
38
- Avo.configuration.cache_resource_filters.call(current_user: current_user, resource: @resource)
36
+ Avo::ExecutionContext.new(
37
+ target: Avo.configuration.cache_resource_filters,
38
+ current_user: current_user,
39
+ resource: @resource
40
+ ).handle
39
41
  end
40
42
  end
41
43
  end
@@ -0,0 +1,37 @@
1
+ module Avo
2
+ module Concerns
3
+ module HasControls
4
+ extend ActiveSupport::Concern
5
+ include Avo::Resources::Controls
6
+
7
+ included do
8
+ class_attribute :show_controls
9
+ class_attribute :edit_controls
10
+ class_attribute :index_controls
11
+ class_attribute :row_controls
12
+ end
13
+
14
+ def render_show_controls
15
+ [BackButton.new, DeleteButton.new, DetachButton.new, ActionsList.new, EditButton.new]
16
+ end
17
+
18
+ def render_edit_controls
19
+ [BackButton.new(label: I18n.t("avo.cancel").capitalize), DeleteButton.new, ActionsList.new, SaveButton.new]
20
+ end
21
+
22
+ def render_index_controls(item:)
23
+ [AttachButton.new(item: item), ActionsList.new(as_index_control: true), CreateButton.new(item: item)]
24
+ end
25
+
26
+ def render_row_controls(item:)
27
+ [
28
+ OrderControls.new,
29
+ ShowButton.new(item: item),
30
+ EditButton.new(item: item),
31
+ DetachButton.new(item: item),
32
+ DeleteButton.new(item: item)
33
+ ]
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,23 @@
1
+ # Adds the ability to set the visibility of an item in the execution context.
2
+ module Avo
3
+ module Concerns
4
+ module HasDescription
5
+ extend ActiveSupport::Concern
6
+
7
+ class_methods do
8
+ attr_accessor :description
9
+ end
10
+
11
+ def description
12
+ Avo::ExecutionContext.new(target: @description || self.class.description, **description_attributes).handle
13
+ end
14
+
15
+ private
16
+
17
+ # Override this method to add custom attributes to the description execution context.
18
+ def description_attributes
19
+ {}
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,42 @@
1
+ # This concern helps us figure out what kind of items (field, tool, tab_group, or panel) have been passed to the resource or action.
2
+ module Avo
3
+ module Concerns
4
+ module HasItemType
5
+ def is_field?
6
+ self.class.ancestors.include?(Avo::Fields::BaseField)
7
+ end
8
+
9
+ def is_heading?
10
+ self.class.ancestors.include?(Avo::Fields::HeadingField)
11
+ end
12
+
13
+ def is_panel?
14
+ self.class.ancestors.include?(Avo::Resources::Items::Panel)
15
+ end
16
+
17
+ def is_main_panel?
18
+ self.class.ancestors.include?(Avo::Resources::Items::MainPanel)
19
+ end
20
+
21
+ def is_tool?
22
+ self.class.ancestors.include?(Avo::BaseResourceTool)
23
+ end
24
+
25
+ def is_tab?
26
+ self.class.ancestors.include?(Avo::Resources::Items::Tab)
27
+ end
28
+
29
+ def is_tab_group?
30
+ self.class.ancestors.include?(Avo::Resources::Items::TabGroup)
31
+ end
32
+
33
+ def is_sidebar?
34
+ self.class.ancestors.include?(Avo::Resources::Items::Sidebar)
35
+ end
36
+
37
+ def is_row?
38
+ self.class.respond_to?(:item_type) && self.class.item_type == :row
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,325 @@
1
+ module Avo
2
+ module Concerns
3
+ module HasItems
4
+ extend ActiveSupport::Concern
5
+
6
+ class_methods do
7
+ def deprecated_dsl_api(name, method)
8
+ message = "This API was deprecated. Please use the `#{name}` method inside the `#{method}` method."
9
+ raise DeprecatedAPIError.new message
10
+ end
11
+
12
+ # DSL methods
13
+ def field(name, as: :text, **args, &block)
14
+ deprecated_dsl_api __method__, "fields"
15
+ end
16
+
17
+ def panel(name = nil, **args, &block)
18
+ deprecated_dsl_api __method__, "fields"
19
+ end
20
+
21
+ def row(**args, &block)
22
+ deprecated_dsl_api __method__, "fields"
23
+ end
24
+
25
+ def tabs(**args, &block)
26
+ deprecated_dsl_api __method__, "fields"
27
+ end
28
+
29
+ def tool(klass, **args)
30
+ deprecated_dsl_api __method__, "fields"
31
+ end
32
+
33
+ def heading(body, **args)
34
+ deprecated_dsl_api __method__, "fields"
35
+ end
36
+
37
+ def sidebar(**args, &block)
38
+ deprecated_dsl_api __method__, "fields"
39
+ end
40
+ # END DSL methods
41
+ end
42
+
43
+ attr_writer :items_holder
44
+
45
+ delegate :invalid_fields, to: :items_holder
46
+
47
+ delegate :field, to: :items_holder
48
+ delegate :panel, to: :items_holder
49
+ delegate :row, to: :items_holder
50
+ delegate :tabs, to: :items_holder
51
+ delegate :tool, to: :items_holder
52
+ delegate :heading, to: :items_holder
53
+ delegate :sidebar, to: :items_holder
54
+
55
+ def items_holder
56
+ @items_holder || Avo::Resources::Items::Holder.new
57
+ end
58
+
59
+ # def items
60
+ # items_holder.items
61
+ # end
62
+
63
+ def invalid_fields
64
+ items_holder.invalid_fields
65
+ end
66
+
67
+ def fields(**args)
68
+ self.class.fields(**args)
69
+ end
70
+
71
+ def tab_groups
72
+ self.class.tab_groups
73
+ end
74
+
75
+ # Dives deep into panels and tabs to fetch all the fields for a resource.
76
+ def only_fields(only_root: false)
77
+ fields = []
78
+
79
+ items.each do |item|
80
+ next if item.nil?
81
+
82
+ unless only_root
83
+ # Dive into panels to fetch their fields
84
+ if item.is_panel?
85
+ fields << extract_fields_from_items(item)
86
+ end
87
+
88
+ # Dive into tabs to fetch their fields
89
+ if item.is_tab_group?
90
+ item.items.map do |tab|
91
+ fields << extract_fields_from_items(tab)
92
+ end
93
+ end
94
+
95
+ # Dive into sidebar to fetch their fields
96
+ if item.is_sidebar?
97
+ fields << extract_fields_from_items(item)
98
+ end
99
+ end
100
+
101
+ if item.is_field?
102
+ fields << item
103
+ end
104
+
105
+ if item.is_row?
106
+ fields << extract_fields_from_items(tab)
107
+ end
108
+ end
109
+
110
+ fields.flatten
111
+ end
112
+
113
+ def get_field_definitions(only_root: false)
114
+ only_fields(only_root: only_root).map do |field|
115
+ field.hydrate(resource: self, user: user, view: view)
116
+ end
117
+ end
118
+
119
+ def get_preview_fields
120
+ get_field_definitions.select do |field|
121
+ field.visible_in_view?(view: :preview)
122
+ end
123
+ end
124
+
125
+ def get_fields(panel: nil, reflection: nil, only_root: false)
126
+ fields = get_field_definitions(only_root: only_root)
127
+ .select do |field|
128
+ # Get the fields for this view
129
+ field.visible_in_view?(view: view)
130
+ end
131
+ .select do |field|
132
+ field.visible?
133
+ end
134
+ .select do |field|
135
+ is_valid = true
136
+
137
+ # Strip out the reflection field in index queries with a parent association.
138
+ if reflection.present?
139
+ # regular non-polymorphic association
140
+ # we're matching the reflection inverse_of foriegn key with the field's foreign_key
141
+ if field.is_a?(Avo::Fields::BelongsToField)
142
+ if field.respond_to?(:foreign_key) &&
143
+ reflection.inverse_of.present? &&
144
+ reflection.inverse_of.respond_to?(:foreign_key) &&
145
+ reflection.inverse_of.foreign_key == field.foreign_key
146
+ is_valid = false
147
+ end
148
+
149
+ # polymorphic association
150
+ if field.respond_to?(:foreign_key) &&
151
+ field.is_polymorphic? &&
152
+ reflection.respond_to?(:polymorphic?) &&
153
+ reflection.inverse_of.respond_to?(:foreign_key) &&
154
+ reflection.inverse_of.foreign_key == field.reflection.foreign_key
155
+ is_valid = false
156
+ end
157
+ end
158
+ end
159
+
160
+ is_valid
161
+ end
162
+
163
+ if panel.present?
164
+ fields = fields.select do |field|
165
+ field.panel_name == panel
166
+ end
167
+ end
168
+
169
+ # hydrate_fields fields
170
+ fields.each do |field|
171
+ field.hydrate(record: @record, view: @view, resource: self)
172
+ end
173
+
174
+ fields
175
+ end
176
+
177
+ def get_field(id)
178
+ get_field_definitions.find do |f|
179
+ f.id == id.to_sym
180
+ end
181
+ end
182
+
183
+ def tools
184
+ return [] if self.class.tools.blank?
185
+
186
+ items
187
+ .select do |item|
188
+ next if item.nil?
189
+
190
+ item.is_tool?
191
+ end
192
+ .map do |tool|
193
+ tool.hydrate view: view
194
+ tool
195
+ end
196
+ .select do |item|
197
+ item.visible_in_view?(view: view)
198
+ end
199
+ end
200
+
201
+ # Separates the fields that are in a panel and those that are just hanging out.
202
+ # Take the ones that aren't placed into a panel and add them to the "default" panel.
203
+ # This is to keep compatibility with the versions before 2.10 when you didn't have the ability to add fields to panels.
204
+ def get_items
205
+ panelless_items = []
206
+ panelfull_items = []
207
+
208
+ visible_items
209
+ .each do |item|
210
+ if item.is_field?
211
+ if item.has_own_panel?
212
+ panelfull_items << item
213
+ else
214
+ panelless_items << item
215
+ end
216
+ else
217
+ panelfull_items << item
218
+ end
219
+ end
220
+
221
+ # Make sure all tabs panelfull_items are setted as inside tabs
222
+ panelfull_items.grep(Avo::Resources::Items::TabGroup).each do |tab_group|
223
+ tab_group.items.grep(Avo::Resources::Items::Tab).each do |tab|
224
+ tab.items.grep(Avo::Resources::Items::Panel).each do |panel|
225
+ set_target_to_top panel.items.grep(Avo::Fields::BelongsToField)
226
+
227
+ panel.items.grep(Avo::Resources::Items::Row).each do |row|
228
+ set_target_to_top row.items.grep(Avo::Fields::BelongsToField)
229
+ end
230
+ end
231
+ end
232
+ end
233
+
234
+ # Add all the panelles fields to a new panel
235
+ main_panel_holder = Avo::Resources::Items::Holder.new
236
+ main_panel_holder.items = panelless_items
237
+
238
+ # Add that panel to the main panel
239
+ main_panel = Avo::Resources::Items::MainPanel.new
240
+ main_panel.items_holder = main_panel_holder
241
+
242
+ # Return all the items but this time with all the panelless ones inside the main panel
243
+ [main_panel, *panelfull_items]
244
+ end
245
+
246
+ def items
247
+ if items_holder.present?
248
+ items_holder.items
249
+ else
250
+ []
251
+ end
252
+ end
253
+
254
+ def visible_items
255
+ items
256
+ .map do |item|
257
+ if view.present?
258
+ res = self.class.ancestors.include?(Avo::BaseResource) ? self : resource
259
+ item.hydrate(view: view, resource: res)
260
+ end
261
+
262
+ item
263
+ end
264
+ .select do |item|
265
+ item.visible?
266
+ end
267
+ .select do |item|
268
+ if item.respond_to?(:visible_in_view?)
269
+ item.visible_in_view? view: view
270
+ else
271
+ true
272
+ end
273
+ end
274
+ .select do |item|
275
+ # On location field we can have field coordinates and setters with different names like latitude and longitude
276
+ if !item.is_a?(Avo::Fields::LocationField) && !item.is_heading? && view.in?([:edit, :update, :new, :create])
277
+ if item.respond_to?(:id)
278
+ item.resource.record.respond_to?("#{item.id}=")
279
+ else
280
+ true
281
+ end
282
+ else
283
+ true
284
+ end
285
+ end
286
+ .select do |item|
287
+ # Check if the user is authorized to view it.
288
+ # This is usually used for has_* fields
289
+ if item.respond_to? :authorized?
290
+ item.authorized?
291
+ else
292
+ true
293
+ end
294
+ end
295
+ .compact
296
+ end
297
+
298
+ def is_empty?
299
+ visible_items.blank?
300
+ end
301
+
302
+ private
303
+
304
+ def set_target_to_top(fields)
305
+ fields.each do |field|
306
+ field.target = :_top
307
+ end
308
+ end
309
+
310
+ def extract_fields_from_items(thing)
311
+ fields = []
312
+
313
+ thing.items.each do |item|
314
+ if item.is_field?
315
+ fields << item
316
+ elsif item.is_panel? || item.is_row?
317
+ fields << extract_fields_from_items(item)
318
+ end
319
+ end
320
+
321
+ fields
322
+ end
323
+ end
324
+ end
325
+ end
@@ -1,6 +1,6 @@
1
1
  module Avo
2
2
  module Concerns
3
- module HasResourceStimulusControllers
3
+ module HasStimulusControllers
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
@@ -2,42 +2,30 @@
2
2
  module Avo
3
3
  module Concerns
4
4
  module IsResourceItem
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- class_attribute :item_type, default: nil
9
- end
10
-
11
- def is_field?
12
- self.class.item_type == :field
13
- end
14
-
15
- def is_panel?
16
- self.class.item_type == :panel || self.class.item_type == :main_panel
17
- end
18
-
19
- def is_main_panel?
20
- self.class.item_type == :main_panel
21
- end
22
-
23
- def is_tool?
24
- self.class.item_type == :tool
25
- end
26
-
27
- def is_tab?
28
- self.class.item_type == :tab
29
- end
30
-
31
- def is_tab_group?
32
- self.class.item_type == :tab_group
33
- end
34
-
35
- def is_sidebar?
36
- self.class.item_type == :sidebar
37
- end
38
-
39
- def is_row?
40
- self.class.item_type == :row
5
+ # These attributes are required to be hydrated in order to properly find the visible_items
6
+ attr_accessor :resource
7
+ attr_accessor :view
8
+
9
+ def hydrate(**args)
10
+ args.each do |key, value|
11
+ if respond_to?("#{key}=")
12
+ send("#{key}=", value)
13
+ end
14
+ end
15
+
16
+ self
17
+ end
18
+
19
+ # Returns the final state of if an item is visible or not
20
+ # For items that have children it checks to see if it contains any visible children.
21
+ def visible?
22
+ # For items that may contains other items like tabs and panels we should also check
23
+ # if any on their children have visible items.
24
+ if self.class.ancestors.include?(Avo::Concerns::HasItems)
25
+ return false unless visible_items.any?
26
+ end
27
+
28
+ super
41
29
  end
42
30
  end
43
31
  end
@@ -0,0 +1,15 @@
1
+ # Adds the ability to set the visibility of an item in the execution context.
2
+ module Avo
3
+ module Concerns
4
+ module IsVisible
5
+ attr_accessor :visible
6
+
7
+ def visible?
8
+ # Default to true
9
+ return true if visible.nil?
10
+
11
+ Avo::ExecutionContext.new(target: visible, resource: @resource).handle
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,8 +4,6 @@ module Avo
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  class_methods do
7
- attr_reader :model_class
8
-
9
7
  # Cast the model class to a constantized version and memoize it like that
10
8
  def model_class=(value)
11
9
  @model_class = case value