avo 2.46.0 → 3.0.0.pre2

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 (417) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +12 -23
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +12 -11
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -36
  167. data/lib/avo/base_resource.rb +108 -96
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  175. data/lib/avo/concerns/is_resource_item.rb +24 -36
  176. data/lib/avo/concerns/is_visible.rb +15 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +8 -45
  180. data/lib/avo/current.rb +5 -0
  181. data/lib/avo/dsl/field_parser.rb +1 -1
  182. data/lib/avo/dynamic_router.rb +6 -2
  183. data/lib/avo/engine.rb +37 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +9 -15
  186. data/lib/avo/fields/badge_field.rb +1 -1
  187. data/lib/avo/fields/base_field.rb +72 -124
  188. data/lib/avo/fields/belongs_to_field.rb +14 -25
  189. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  190. data/lib/avo/fields/concerns/has_default.rb +1 -5
  191. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  192. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  193. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  194. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  195. data/lib/avo/fields/concerns/is_required.rb +5 -7
  196. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/country_field.rb +4 -0
  199. data/lib/avo/fields/date_field.rb +3 -16
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/field_manager.rb +45 -0
  202. data/lib/avo/fields/file_field.rb +0 -2
  203. data/lib/avo/fields/files_field.rb +0 -6
  204. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  205. data/lib/avo/fields/has_base_field.rb +11 -14
  206. data/lib/avo/fields/has_many_field.rb +5 -2
  207. data/lib/avo/fields/has_one_field.rb +5 -10
  208. data/lib/avo/fields/heading_field.rb +4 -1
  209. data/lib/avo/fields/hidden_field.rb +1 -1
  210. data/lib/avo/fields/id_field.rb +2 -3
  211. data/lib/avo/fields/password_field.rb +1 -1
  212. data/lib/avo/fields/preview_field.rb +14 -0
  213. data/lib/avo/fields/select_field.rb +12 -8
  214. data/lib/avo/fields/status_field.rb +4 -0
  215. data/lib/avo/filters/base_filter.rb +3 -8
  216. data/lib/avo/grid_collector.rb +7 -9
  217. data/lib/avo/html/builder.rb +5 -8
  218. data/lib/avo/item_grapher.rb +78 -0
  219. data/lib/avo/licensing/h_q.rb +4 -68
  220. data/lib/avo/licensing/license.rb +2 -2
  221. data/lib/avo/licensing/license_manager.rb +1 -1
  222. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  223. data/lib/avo/licensing/pro_license.rb +1 -7
  224. data/lib/avo/plugin.rb +6 -0
  225. data/lib/avo/plugin_manager.rb +58 -0
  226. data/lib/avo/prefixed_test_helpers.rb +20 -0
  227. data/lib/avo/reloader.rb +3 -0
  228. data/lib/avo/resources/controls/actions_list.rb +6 -12
  229. data/lib/avo/resources/controls/attach_button.rb +15 -0
  230. data/lib/avo/resources/controls/back_button.rb +1 -1
  231. data/lib/avo/resources/controls/base_control.rb +15 -49
  232. data/lib/avo/resources/controls/create_button.rb +15 -0
  233. data/lib/avo/resources/controls/delete_button.rb +5 -1
  234. data/lib/avo/resources/controls/detach_button.rb +4 -1
  235. data/lib/avo/resources/controls/edit_button.rb +4 -1
  236. data/lib/avo/resources/controls/order_controls.rb +8 -0
  237. data/lib/avo/resources/controls/save_button.rb +13 -0
  238. data/lib/avo/resources/controls/show_button.rb +15 -0
  239. data/lib/avo/resources/items/holder.rb +76 -0
  240. data/lib/avo/resources/items/item_group.rb +48 -0
  241. data/lib/avo/resources/items/main_panel.rb +2 -0
  242. data/lib/avo/resources/items/panel.rb +2 -0
  243. data/lib/avo/resources/items/sidebar.rb +47 -0
  244. data/lib/avo/resources/items/tab.rb +60 -0
  245. data/lib/avo/resources/items/tab_group.rb +68 -0
  246. data/lib/avo/resources/resource_manager.rb +181 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +92 -0
  249. data/lib/avo/services/telemetry_service.rb +84 -0
  250. data/lib/avo/test_helpers.rb +362 -0
  251. data/lib/avo/tools/tool_manager.rb +30 -0
  252. data/lib/avo/version.rb +1 -1
  253. data/lib/avo.rb +7 -0
  254. data/lib/generators/avo/eject_generator.rb +0 -1
  255. data/lib/generators/avo/install_generator.rb +1 -11
  256. data/lib/generators/avo/resource_generator.rb +5 -23
  257. data/lib/generators/avo/scope_generator.rb +15 -0
  258. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  259. data/lib/generators/avo/templates/action.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  261. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  263. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  265. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  266. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  267. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  268. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  271. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  272. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  273. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  274. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  275. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  280. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  281. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  282. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  283. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  284. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  285. data/lib/generators/avo/templates/scope.tt +6 -0
  286. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  287. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  288. data/lib/generators/avo/templates/tool/view.tt +2 -2
  289. data/lib/tasks/avo_tasks.rake +22 -0
  290. metadata +82 -161
  291. data/app/assets/stylesheets/css/tags.css +0 -32
  292. data/app/assets/svgs/map-empty-state.svg +0 -35
  293. data/app/assets/svgs/map-view-type.svg +0 -3
  294. data/app/components/avo/card_component.html.erb +0 -46
  295. data/app/components/avo/card_component.rb +0 -25
  296. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  297. data/app/components/avo/dashboards/divider_component.rb +0 -19
  298. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  299. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  300. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  301. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  303. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  304. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  305. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  306. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  307. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  309. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  311. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  312. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  313. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  314. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  315. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  317. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  318. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  319. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  320. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  321. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  322. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  323. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  324. data/app/components/avo/index/ordering/base_component.rb +0 -9
  325. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  326. data/app/components/avo/index/ordering/button_component.rb +0 -23
  327. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  328. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  329. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  330. data/app/components/avo/index/resource_map_component.rb +0 -109
  331. data/app/components/avo/row_component.html.erb +0 -3
  332. data/app/components/avo/row_component.rb +0 -12
  333. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  334. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  335. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  336. data/app/controllers/avo/dashboards_controller.rb +0 -22
  337. data/app/controllers/avo/reorder_controller.rb +0 -25
  338. data/app/javascript/js/controllers/base_controller.js +0 -22
  339. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  340. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  341. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  342. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  343. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  344. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  345. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  346. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  347. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  348. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  349. data/app/views/avo/dashboards/show.html.erb +0 -38
  350. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  351. data/app/views/avo/partials/_global_search.html.erb +0 -19
  352. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  353. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  354. data/lib/avo/base_card.rb +0 -161
  355. data/lib/avo/concerns/fetches_things.rb +0 -150
  356. data/lib/avo/concerns/handles_field_args.rb +0 -47
  357. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  358. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  359. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  360. data/lib/avo/concerns/pagination.rb +0 -53
  361. data/lib/avo/concerns/policy_helpers.rb +0 -31
  362. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  363. data/lib/avo/concerns/visible_items.rb +0 -51
  364. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  365. data/lib/avo/dashboards/base_divider.rb +0 -35
  366. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  367. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  368. data/lib/avo/dashboards/metric_card.rb +0 -9
  369. data/lib/avo/dashboards/partial_card.rb +0 -7
  370. data/lib/avo/fields/area_field.rb +0 -39
  371. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  372. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  373. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  374. data/lib/avo/fields/location_field.rb +0 -86
  375. data/lib/avo/fields/tags_field.rb +0 -102
  376. data/lib/avo/hosts/association_scope_host.rb +0 -8
  377. data/lib/avo/hosts/base_host.rb +0 -25
  378. data/lib/avo/hosts/card_visibility.rb +0 -20
  379. data/lib/avo/hosts/dashboard_card.rb +0 -22
  380. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  381. data/lib/avo/hosts/ordering.rb +0 -22
  382. data/lib/avo/hosts/record_host.rb +0 -7
  383. data/lib/avo/hosts/resource_record_host.rb +0 -7
  384. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  385. data/lib/avo/hosts/search_scope_host.rb +0 -7
  386. data/lib/avo/hosts/view_record_host.rb +0 -7
  387. data/lib/avo/hosts/visibility_host.rb +0 -12
  388. data/lib/avo/items_holder.rb +0 -96
  389. data/lib/avo/main_panel.rb +0 -3
  390. data/lib/avo/menu/base_item.rb +0 -25
  391. data/lib/avo/menu/builder.rb +0 -82
  392. data/lib/avo/menu/dashboard.rb +0 -22
  393. data/lib/avo/menu/group.rb +0 -2
  394. data/lib/avo/menu/link.rb +0 -6
  395. data/lib/avo/menu/menu.rb +0 -2
  396. data/lib/avo/menu/resource.rb +0 -22
  397. data/lib/avo/menu/section.rb +0 -2
  398. data/lib/avo/panel.rb +0 -24
  399. data/lib/avo/panel_builder.rb +0 -25
  400. data/lib/avo/resources/controls/action.rb +0 -38
  401. data/lib/avo/resources/controls/execution_context.rb +0 -58
  402. data/lib/avo/resources/controls/items_holder.rb +0 -19
  403. data/lib/avo/resources/controls/link_to.rb +0 -27
  404. data/lib/avo/row.rb +0 -26
  405. data/lib/avo/row_builder.rb +0 -24
  406. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  407. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  408. data/lib/avo/sidebar.rb +0 -30
  409. data/lib/avo/sidebar_builder.rb +0 -24
  410. data/lib/avo/tab.rb +0 -72
  411. data/lib/avo/tab_builder.rb +0 -25
  412. data/lib/avo/tab_group.rb +0 -42
  413. data/lib/avo/tab_group_builder.rb +0 -43
  414. data/lib/avo/tools_manager.rb +0 -11
  415. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  416. data/public/avo-assets/avo.base.js +0 -1037
  417. data/public/avo-assets/avo.base.js.map +0 -7
@@ -1,23 +1,18 @@
1
1
  module Avo
2
2
  module Concerns
3
- module HasFields
3
+ module HasItems
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
7
  class_attribute :items_holder
8
- class_attribute :items_index, default: 0
9
- class_attribute :tabs_holder
10
- class_attribute :tabs_tabs_holder
11
- class_attribute :raw_tabs
12
- class_attribute :tools_holder
13
8
  end
14
9
 
15
10
  class_methods do
16
11
  # DSL methods
17
- def field(name, **args, &block)
12
+ def field(name, as: :text, **args, &block)
18
13
  ensure_items_holder_initialized
19
14
 
20
- items_holder.field name, **args, &block
15
+ items_holder.field name, as: as, **args, &block
21
16
  end
22
17
 
23
18
  def panel(name = nil, **args, &block)
@@ -26,16 +21,10 @@ module Avo
26
21
  items_holder.panel name, **args, &block
27
22
  end
28
23
 
29
- def row(**args, &block)
30
- ensure_items_holder_initialized
31
-
32
- items_holder.row(**args, &block)
33
- end
34
-
35
24
  def tabs(**args, &block)
36
25
  ensure_items_holder_initialized
37
26
 
38
- items_holder.tabs Avo::TabGroupBuilder.parse_block(**args, &block)
27
+ items_holder.tabs Avo::Resources::Items::TabGroup::Builder.parse_block(**args, &block)
39
28
  end
40
29
 
41
30
  def tool(klass, **args)
@@ -53,7 +42,7 @@ module Avo
53
42
  def sidebar(**args, &block)
54
43
  ensure_items_holder_initialized
55
44
 
56
- items_holder.sidebar Avo::SidebarBuilder.parse_block(**args, &block)
45
+ items_holder.sidebar Avo::Resources::Items::Sidebar::Builder.parse_block(**args, &block)
57
46
  end
58
47
  # END DSL methods
59
48
 
@@ -65,10 +54,6 @@ module Avo
65
54
  end
66
55
  end
67
56
 
68
- def tools
69
- tools_holder
70
- end
71
-
72
57
  # Dives deep into panels and tabs to fetch all the fields for a resource.
73
58
  def fields(only_root: false)
74
59
  fields = []
@@ -98,10 +83,6 @@ module Avo
98
83
  if item.is_field?
99
84
  fields << item
100
85
  end
101
-
102
- if item.is_row?
103
- fields << extract_fields_from_items(tab)
104
- end
105
86
  end
106
87
 
107
88
  fields.flatten
@@ -109,7 +90,7 @@ module Avo
109
90
 
110
91
  def tab_groups
111
92
  items.select do |item|
112
- item.instance_of? Avo::TabGroup
93
+ item.is_tab_group?
113
94
  end
114
95
  end
115
96
 
@@ -121,7 +102,7 @@ module Avo
121
102
  thing.items.each do |item|
122
103
  if item.is_field?
123
104
  fields << item
124
- elsif item.is_panel? || item.is_row?
105
+ elsif item.is_panel?
125
106
  fields << extract_fields_from_items(item)
126
107
  end
127
108
  end
@@ -130,35 +111,22 @@ module Avo
130
111
  end
131
112
 
132
113
  def ensure_items_holder_initialized
133
- self.items_holder ||= Avo::ItemsHolder.new
134
- end
135
-
136
- def add_to_fields(instance)
137
- self.items ||= []
138
- self.items << instance
139
- increment_order_index
140
- end
141
-
142
- def increment_order_index
143
- self.items_index += 1
114
+ self.items_holder ||= Avo::Resources::Items::Holder.new
144
115
  end
145
116
  end
146
117
 
118
+ attr_accessor :items_holder
119
+
147
120
  delegate :invalid_fields, to: :items_holder
148
121
  delegate :items, to: :items_holder
149
122
 
150
- def hydrate_fields(model: nil, view: nil)
123
+ def hydrate_fields
151
124
  fields.map do |field|
152
- field.hydrate(model: @model, view: @view, resource: self)
125
+ field.hydrate(record: @record, view: @view, resource: self)
153
126
  end
154
-
155
127
  self
156
128
  end
157
129
 
158
- def get_tabs
159
- tabs_holder
160
- end
161
-
162
130
  def fields(**args)
163
131
  self.class.fields(**args)
164
132
  end
@@ -172,15 +140,30 @@ module Avo
172
140
 
173
141
  return [] if fields.blank?
174
142
 
175
- fields.map do |field|
143
+ items = fields.map do |field|
176
144
  field.hydrate(resource: self, user: user, view: view)
177
145
  end
146
+
147
+ if Avo::App.license.lacks_with_trial(:advanced_fields)
148
+ items = items.reject do |field|
149
+ field.type == "tags"
150
+ end
151
+ end
152
+
153
+ items
154
+ end
155
+
156
+ def get_preview_fields
157
+ get_field_definitions.select do |field|
158
+ field.visible_in_view?(view: :preview)
159
+ end
178
160
  end
179
161
 
180
162
  def get_fields(panel: nil, reflection: nil, only_root: false)
181
163
  fields = get_field_definitions(only_root: only_root)
182
164
  .select do |field|
183
- field.visible_on?(view)
165
+ # Get the fields for this view
166
+ field.visible_in_view?(view: view)
184
167
  end
185
168
  .select do |field|
186
169
  field.visible?
@@ -220,7 +203,7 @@ module Avo
220
203
  end
221
204
  end
222
205
 
223
- hydrate_fields(model: @model, view: @view)
206
+ hydrate_fields
224
207
 
225
208
  fields
226
209
  end
@@ -232,12 +215,9 @@ module Avo
232
215
  end
233
216
 
234
217
  def tools
235
- check_license
236
-
237
- return [] if App.license.lacks_with_trial :resource_tools
238
218
  return [] if self.class.tools.blank?
239
219
 
240
- self.items
220
+ items
241
221
  .select do |item|
242
222
  next if item.nil?
243
223
 
@@ -248,7 +228,7 @@ module Avo
248
228
  tool
249
229
  end
250
230
  .select do |item|
251
- item.visible_on?(view)
231
+ item.visible_in_view?(view: view)
252
232
  end
253
233
  end
254
234
 
@@ -259,75 +239,108 @@ module Avo
259
239
  panelless_items = []
260
240
  panelfull_items = []
261
241
 
262
- items.each do |item|
263
- if item.respond_to? :hydrate
264
- item.hydrate(view: view)
265
- end
266
-
267
- # fields and tabs can be hidden on some views
268
- if item.respond_to? :visible_on?
269
- next unless item.visible_on?(view)
270
- end
271
- # each field has it's own visibility checker
272
- if item.respond_to? :visible?
273
- item.hydrate(view: view) if item.view.nil?
274
-
275
- next unless item.visible?
276
- end
277
- # check if the user is authorized to view it
278
- if item.respond_to? :authorized?
279
- next unless item.hydrate(model: @model).authorized?
280
- end
281
-
282
- if item.is_field?
283
- if item.has_own_panel?
284
- panelfull_items << item
242
+ visible_items
243
+ .each do |item|
244
+ if item.is_field?
245
+ if item.has_own_panel?
246
+ panelfull_items << item
247
+ else
248
+ panelless_items << item
249
+ end
285
250
  else
286
- panelless_items << item
251
+ panelfull_items << item
287
252
  end
288
- else
289
- panelfull_items << item
290
253
  end
291
- end
292
254
 
293
255
  # Make sure all tabs panelfull_items are setted as inside tabs
294
- panelfull_items.grep(Avo::TabGroup).each do |tab_group|
295
- tab_group.items.grep(Avo::Tab).each do |tab|
296
- tab.items.grep(Avo::Panel).each do |panel|
297
- set_target_to_top panel.items.grep(Avo::Fields::BelongsToField)
298
-
299
- panel.items.grep(Avo::Row).each do |row|
300
- set_target_to_top row.items.grep(Avo::Fields::BelongsToField)
256
+ panelfull_items.grep(Avo::Resources::Items::TabGroup).each do |tab_group|
257
+ tab_group.items.grep(Avo::Resources::Items::Tab).each do |tab|
258
+ tab.items.grep(Avo::Resources::Items::Panel).each do |panel|
259
+ panel.items.grep(Avo::Fields::BelongsToField).each do |field|
260
+ field.target = :_top
301
261
  end
302
262
  end
303
263
  end
304
264
  end
305
265
 
306
266
  # Add all the panelles fields to a new panel
307
- main_panel_holder = Avo::ItemsHolder.new
267
+ main_panel_holder = Avo::Resources::Items::Holder.new
308
268
  main_panel_holder.items = panelless_items
309
269
 
310
270
  # Add that panel to the main panel
311
- main_panel = Avo::MainPanel.new
271
+ main_panel = Avo::Resources::Items::MainPanel.new
312
272
  main_panel.items_holder = main_panel_holder
313
273
 
314
274
  # Return all the items but this time with all the panelless ones inside the main panel
315
275
  [main_panel, *panelfull_items]
316
276
  end
317
277
 
318
- private
319
-
320
- def set_target_to_top(fields)
321
- fields.each do |field|
322
- field.target = :_top
278
+ def items
279
+ if items_holder.present?
280
+ items_holder.items
281
+ else
282
+ []
323
283
  end
324
284
  end
325
285
 
326
- def check_license
327
- if !Rails.env.production? && App.license.present? && App.license.lacks(:resource_tools)
328
- # Add error message to let the developer know the resource tool will not be available in a production environment.
329
- Avo::App.error_messages.push "Warning: Your license is invalid or doesn't support resource tools. The resource tools will not be visible in a production environment."
286
+ def visible_items
287
+ items
288
+ .map do |item|
289
+ if view.present?
290
+ res = self.class.ancestors.include?(Avo::BaseResource) ? self : resource
291
+ item.hydrate(view: view, resource: res)
292
+ end
293
+
294
+ item
295
+ end
296
+ .select do |item|
297
+ item.visible_in_view?(view: view)
298
+ end
299
+ .select do |item|
300
+ item.visible?
301
+ end
302
+ .select do |item|
303
+ if item.respond_to?(:visible_in_view?)
304
+ item.visible_in_view? view: view
305
+ else
306
+ true
307
+ end
308
+ end
309
+ .select do |item|
310
+ if !item.is_heading? && view.in?([:edit, :update, :new, :create])
311
+ if item.respond_to?(:id)
312
+ item.resource.record.respond_to?("#{item.id}=")
313
+ else
314
+ true
315
+ end
316
+ else
317
+ true
318
+ end
319
+ end
320
+ .select do |item|
321
+ # Check if the user is authorized to view it.
322
+ # This is usually used for has_* fields
323
+ if item.respond_to? :authorized?
324
+ item.authorized?
325
+ else
326
+ true
327
+ end
328
+ end
329
+ .compact
330
+ end
331
+
332
+ def is_empty?
333
+ visible_items.blank?
334
+ end
335
+
336
+ def hydrate(**args)
337
+ super(**args)
338
+
339
+ items_holder.items.each do |item|
340
+ item.hydrate(**args)
330
341
  end
342
+
343
+ self
331
344
  end
332
345
  end
333
346
  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 unless visible.present?
10
+
11
+ Avo::ExecutionContext.new(target: visible, resource: @resource).handle
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,126 @@
1
+ module Avo
2
+ module Concerns
3
+ module VisibleInDifferentViews
4
+ attr_accessor :show_on_index
5
+ attr_accessor :show_on_show
6
+ attr_accessor :show_on_new
7
+ attr_accessor :show_on_edit
8
+ attr_accessor :show_on_preview
9
+
10
+ def post_initialize
11
+ initialize_views
12
+ end
13
+
14
+ def initialize_views
15
+ # Set defaults
16
+ @show_on_index = @show_on_index.nil? ? true : @show_on_index
17
+ @show_on_show = @show_on_show.nil? ? true : @show_on_show
18
+ @show_on_new = @show_on_new.nil? ? true : @show_on_new
19
+ @show_on_edit = @show_on_edit.nil? ? true : @show_on_edit
20
+ @show_on_preview = @show_on_preview.nil? ? false : @show_on_preview
21
+
22
+ if @args.present?
23
+ # Execute options
24
+ show_on @args[:show_on] if @args[:show_on].present?
25
+ hide_on @args[:hide_on] if @args[:hide_on].present?
26
+ only_on @args[:only_on] if @args[:only_on].present?
27
+ except_on @args[:except_on] if @args[:except_on].present?
28
+ end
29
+ end
30
+
31
+ # Validates if the field is visible on certain view
32
+ def visible_in_view?(view:)
33
+ raise "No view specified on visibility check." if view.blank?
34
+
35
+ send "show_on_#{view}"
36
+ end
37
+
38
+ def show_on(*where)
39
+ return show_on_all if where.include? :all
40
+
41
+ normalize_views(where).flatten.each do |view|
42
+ show_on_view view
43
+ end
44
+ end
45
+
46
+ def hide_on(*where)
47
+ return hide_on_all if where.include? :all
48
+
49
+ normalize_views(where).flatten.each do |view|
50
+ hide_on_view view
51
+ end
52
+ end
53
+
54
+ def only_on(*where)
55
+ hide_on_all
56
+ normalize_views(where).flatten.each do |view|
57
+ show_on_view view
58
+ end
59
+ end
60
+
61
+ def except_on(*where)
62
+ show_on_all
63
+ normalize_views(where).flatten.each do |view|
64
+ show_on_view view
65
+ end
66
+ end
67
+
68
+ # When submitting the form on creation, the new page will be create but we don't have a visibility marker for create so we'll default to new
69
+ def show_on_create
70
+ show_on_new
71
+ end
72
+
73
+ # When submitting the form on update, the new page will be create but we don't have a visibility marker for update so we'll default to edit
74
+ def show_on_update
75
+ show_on_edit
76
+ end
77
+
78
+ private
79
+
80
+ def show_on_view(view)
81
+ send("show_on_#{view}=", true)
82
+ end
83
+
84
+ def hide_on_view(view)
85
+ send("show_on_#{view}=", false)
86
+ end
87
+
88
+ def only_on_view(view)
89
+ hide_on_all
90
+ show_on_view view
91
+ end
92
+
93
+ def except_on_view(view)
94
+ show_on_all
95
+ hide_on_view view
96
+ end
97
+
98
+ def show_on_all
99
+ @show_on_index = true
100
+ @show_on_show = true
101
+ @show_on_edit = true
102
+ @show_on_new = true
103
+ @show_on_preview = true
104
+ end
105
+
106
+ def hide_on_all
107
+ @show_on_index = false
108
+ @show_on_show = false
109
+ @show_on_edit = false
110
+ @show_on_new = false
111
+ @show_on_preview = false
112
+ end
113
+
114
+ def normalize_views(*views_and_groups)
115
+ forms = views_and_groups.flatten! & [:forms]
116
+
117
+ if forms.present?
118
+ views_and_groups -= forms
119
+ views_and_groups += [:new, :edit]
120
+ end
121
+
122
+ views_and_groups.flatten.uniq
123
+ end
124
+ end
125
+ end
126
+ end
@@ -32,40 +32,28 @@ class Avo::Configuration::Branding
32
32
  end
33
33
 
34
34
  def logo
35
- return @default_logo if Avo::App.license.lacks_with_trial(:branding)
36
-
37
35
  @logo || @default_logo
38
36
  end
39
37
 
40
38
  def logomark
41
- return @default_logomark if Avo::App.license.lacks_with_trial(:branding)
42
-
43
39
  @logomark || @default_logomark
44
40
  end
45
41
 
46
42
  def placeholder
47
- return @default_placeholder if Avo::App.license.lacks_with_trial(:branding)
48
-
49
43
  @placeholder || @default_placeholder
50
44
  end
51
45
 
52
46
  def chart_colors
53
- return @default_chart_colors if Avo::App.license.lacks_with_trial(:branding)
54
-
55
47
  @chart_colors || @default_chart_colors
56
48
  end
57
49
 
58
50
  def favicon
59
- return @default_favicon if Avo::App.license.lacks_with_trial(:branding)
60
-
61
51
  @favicon || @default_favicon
62
52
  end
63
53
 
64
54
  private
65
55
 
66
56
  def colors
67
- return @default_colors if Avo::App.license.lacks_with_trial(:branding)
68
-
69
57
  @default_colors.merge(@colors) || @default_colors
70
58
  end
71
59