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
@@ -1,9 +0,0 @@
1
- <% if invisible? %>
2
- <div class="relative col-span-full gap-0"></div>
3
- <% else %>
4
- <div class="relative col-span-full border-t border-gray-300 my-4">
5
- <% if label.present? %>
6
- <div class="absolute inset-auto -translate-y-1/2 -translate-x-1/2 ml-1/2 z-20 text-xs font-semibold uppercase leading-none text-gray-500 bg-application px-2"><%= label %></div>
7
- <% end %>
8
- </div>
9
- <% end %>
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Dashboards::DividerComponent < ViewComponent::Base
4
- attr_reader :divider
5
-
6
- delegate :label, to: :divider
7
-
8
- def initialize(divider: nil)
9
- @divider = divider
10
- end
11
-
12
- def render?
13
- @divider.present?
14
- end
15
-
16
- def invisible?
17
- @divider.invisible
18
- end
19
- end
@@ -1,47 +0,0 @@
1
- <div data-controller="search" class="resource-search flex items-center h-full w-full" data-turbo-remove-before-cache>
2
- <div class="w-full hidden"
3
- data-search-target="autocomplete"
4
- data-search-resource="<%= @model_key %>"
5
- data-translation-keys='{"no_item_found": "<%= I18n.translate 'avo.no_item_found' %>"}'
6
- data-via-association="belongs_to"
7
- data-via-association-id="<%= @field.id %>"
8
- data-via-reflection-id="<%= @field.model.id %>"
9
- data-via-reflection-class="<%= @field.model.class.to_s %>"
10
- data-via-parent-resource-id="<%= params[:via_resource_id] %>"
11
- data-via-parent-resource-class="<%= params[:via_relation_class] %>"
12
- data-via-relation="<%= params[:via_relation] %>"
13
- ></div>
14
- <div class="relative w-full" autocomplete="off">
15
- <%= @form.text_field @foreign_key,
16
- class: classes,
17
- # This instructs the search_controller if it should enable/disabled this field when the user switches polymorphic associations
18
- # It should not enable the field if the record is being created through an association
19
- data: {
20
- 'search-target': 'button clearValue',
21
- 'should-be-disabled': @disabled,
22
- **@field.get_html(:data, view: view, element: :input)
23
- },
24
- disabled: true,
25
- placeholder: @field.placeholder,
26
- style: @field.get_html(:style, view: view, element: :input),
27
- type: :text,
28
- value: field_label %>
29
- <% unless @disabled %>
30
- <button class="absolute top-1/2 left-auto right-3 mr-px -mt-2 cursor-pointer hidden text-gray-500"
31
- type="button"
32
- data-tippy="tooltip"
33
- data-search-target="clearButton"
34
- title="<%= I18n.translate 'avo.clear_value' %>"
35
- data-action="click->search#clearValue"
36
- ><%= helpers.svg 'x', class: 'h-4' %>
37
- </button>
38
- <% end %>
39
- </div>
40
- <%= @form.hidden_field @foreign_key,
41
- value: field_value,
42
- data: {
43
- 'search-target': 'hiddenId clearValue',
44
- **@field.get_html(:data, view: view, element: :input)
45
- }
46
- %>
47
- </div>
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::BelongsToField::AutocompleteComponent < ViewComponent::Base
4
- attr_reader :classes
5
- attr_reader :view
6
-
7
- def initialize(form:, field:, model_key:, foreign_key:, disabled: false, type: nil, resource: nil, polymorphic_record: nil, view: nil, style: nil, classes: nil)
8
- @form = form
9
- @field = field
10
- @type = type
11
- @view = view
12
- @model_key = model_key
13
- @foreign_key = foreign_key
14
- @resource = resource
15
- @disabled = disabled
16
- @style = style
17
- @classes = classes
18
- @polymorphic_record = polymorphic_record
19
- end
20
-
21
- def field_label
22
- result = @field.field_label
23
-
24
- # New records won't have the value (instantiated model) present but the polymorphic_type and polymorphic_id prefilled
25
- if should_prefill?
26
- result = @field.value&.class == @type ? @field.field_label : nil
27
- end
28
-
29
- result
30
- end
31
-
32
- def field_value
33
- result = @field.field_value
34
-
35
- # New records won't have the value (instantiated model) present but the polymorphic_type and polymorphic_id prefilled
36
- if should_prefill?
37
- result = @field.value&.class == @type ? @field.field_value : nil
38
- end
39
-
40
- result
41
- end
42
-
43
- def reflection_class
44
- has_polymorphic_association? ? polymorphic_class : @resource.model_class._reflections[@field.id.to_s].klass
45
- end
46
-
47
- private
48
-
49
- def should_prefill?
50
- # default this conditional to true
51
- is_polymorphic = true
52
-
53
- # if this is a field that can be polymorphic (belongs_to)
54
- if @field.respond_to? :is_polymorphic?
55
- is_polymorphic = @field.is_polymorphic?
56
- end
57
-
58
- is_polymorphic && searchable? && !(new_record? && has_polymorphic_association?)
59
- end
60
-
61
- def searchable?
62
- @field.searchable
63
- end
64
-
65
- def new_record?
66
- @resource.model.new_record?
67
- end
68
-
69
- def has_polymorphic_association?
70
- polymorphic_class.present? && polymorphic_id.present?
71
- end
72
-
73
- # Get the polymorphic class
74
- def polymorphic_class
75
- @resource.model["#{@field.foreign_key}_type"]
76
- end
77
-
78
- # Get the polymorphic id
79
- def polymorphic_id
80
- @resource.model["#{@field.foreign_key}_id"]
81
- end
82
-
83
- # Get the resource for that polymorphic class
84
- def polymorphic_resource
85
- ::Avo::App.get_resource_by_model_name polymorphic_class
86
- end
87
-
88
- # Extract the needed fields to identify the record for polymorphic associations
89
- def polymorphic_fields
90
- {
91
- id: polymorphic_resource.id,
92
- label: polymorphic_resource.title
93
- }
94
- end
95
- end
@@ -1,35 +0,0 @@
1
- <%= field_wrapper **field_wrapper_args, data: {
2
- controller: "tags-field",
3
- tags_field_mode_value: @field.mode,
4
- tags_field_whitelist_items_value: @field.suggestions.to_json,
5
- tags_field_disallowed_items_value: @field.disallowed.to_json,
6
- tags_field_enforce_suggestions_value: @field.enforce_suggestions,
7
- tags_field_suggestions_max_items_value: @field.suggestions_max_items,
8
- tags_field_close_on_select_value: @field.close_on_select,
9
- tags_field_delimiters_value: @field.delimiters,
10
- tags_field_fetch_values_from_value: @field.fetch_values_from,
11
- } do %>
12
- <%# We use a dummy field so the back action from Turbo does not brake the field %>
13
- <%# dummy field %>
14
- <%= text_field_tag "#{@field.id}-dummy", '',
15
- class: classes("w-full"),
16
- data: {
17
- tags_field_target: :fakeInput,
18
- },
19
- disabled: disabled?,
20
- placeholder: @field.placeholder,
21
- style: @field.get_html(:style, view: view, element: :input),
22
- value: ''
23
- %>
24
- <%# real field %>
25
- <%= @form.text_field @field.id,
26
- class: classes("hidden w-full border-primary-500 focus-within:border-primary-500"),
27
- data: {
28
- tags_field_target: :input,
29
- },
30
- disabled: disabled?,
31
- placeholder: @field.placeholder,
32
- style: @field.get_html(:style, view: view, element: :input),
33
- value: @field.field_value.to_json
34
- %>
35
- <% end %>
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::TagsField::EditComponent < Avo::Fields::EditComponent
4
- end
@@ -1,10 +0,0 @@
1
- <%= index_field_wrapper **field_wrapper_args, flush: true do %>
2
- <div class="flex gap-1 items-center flex-nowrap">
3
- <% value.take(3).each do |item| %>
4
- <%= render Avo::Fields::TagsField::TagComponent.new(label: label_from_item(item)) %>
5
- <% end %>
6
- <% if value.count > 3 %>
7
- <%= render Avo::Fields::TagsField::TagComponent.new(label: '...', title: I18n.t('avo.x_items_more', count: value.count - 3)) %>
8
- <% end %>
9
- </div>
10
- <% end %>
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::TagsField::IndexComponent < Avo::Fields::IndexComponent
4
- include Avo::Fields::Concerns::ItemLabels
5
-
6
- def value
7
- @field.field_value
8
- end
9
- end
@@ -1,7 +0,0 @@
1
- <%= field_wrapper **field_wrapper_args do %>
2
- <div class="flex gap-1 items-center flex-wrap">
3
- <% @field.field_value.each do |item| %>
4
- <%= render Avo::Fields::TagsField::TagComponent.new(label: label_from_item(item)) %>
5
- <% end %>
6
- </div>
7
- <% end %>
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::TagsField::ShowComponent < Avo::Fields::ShowComponent
4
- include Avo::Fields::Concerns::ItemLabels
5
- end
@@ -1,9 +0,0 @@
1
- <div class="flex px-2 py-1 rounded bg-gray-100 text-sm text-gray-800 font-normal flex-shrink-0"
2
- <% if title.present? %>
3
- data-tippy="tooltip"
4
- title="<%= title %>"
5
- <% end %>
6
- data-target="tag-component"
7
- >
8
- <%= label %>
9
- </div>
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::TagsField::TagComponent < ViewComponent::Base
4
- attr_reader :label
5
- attr_reader :title
6
-
7
- def initialize(label: nil, title: nil)
8
- @label = label
9
- @title = title
10
- end
11
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Index::Ordering::BaseComponent < Avo::BaseComponent
4
- private
5
-
6
- def order_actions
7
- @resource.class.order_actions
8
- end
9
- end
@@ -1,11 +0,0 @@
1
- <%= button_to order_path(direction: direction, referrer: request.fullpath),
2
- title: t("avo.order.#{direction}").capitalize,
3
- method: :patch,
4
- class: 'flex items-center',
5
- data: {
6
- target: "order:#{direction}",
7
- 'turbo-frame': params[:turbo_frame],
8
- 'tippy': 'tooltip',
9
- } do %>
10
- <%= helpers.svg(svg, class: 'text-gray-400 h-6 hover:text-gray-600') %>
11
- <% end %>
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Index::Ordering::ButtonComponent < Avo::Index::Ordering::BaseComponent
4
- attr_accessor :resource
5
- attr_accessor :reflection
6
- attr_accessor :direction
7
- attr_accessor :svg
8
-
9
- def initialize(resource:, direction:, svg: nil, reflection: nil)
10
- @resource = resource
11
- @reflection = reflection
12
- @direction = direction
13
- @svg = svg
14
- end
15
-
16
- def render?
17
- order_actions[direction].present?
18
- end
19
-
20
- def order_path(args)
21
- Avo::App.view_context.avo.reorder_order_path(resource.route_key, resource.model.to_param, **args)
22
- end
23
- end
@@ -1,32 +0,0 @@
1
- <div class="flex items-center justify-center" data-component="<%= self.class.to_s.underscore %>">
2
- <% if display_inline? %>
3
- <div class="flex max-w-xs rounded">
4
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :higher, svg: 'arrow-up' %>
5
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :lower, svg: 'arrow-down' %>
6
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :to_top, svg: 'download-solid-reversed' %>
7
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :to_bottom, svg: 'download-solid' %>
8
- </div>
9
- <% else %>
10
- <div class="popover inline-block"
11
- data-controller="popover"
12
- data-popover-translate-x="<%= Avo.configuration.resource_controls_placement == :left ? '20%' : '-100%' %>"
13
- data-popover-translate-y="-32px"
14
- data-action="mouseover->popover#mouseOver mouseout->popover#mouseOut"
15
- >
16
- <%= button_tag nil,
17
- title: t('avo.order.reorder_record').capitalize,
18
- class: 'flex items-center',
19
- data: {
20
- 'tippy': 'tooltip',
21
- } do
22
- %>
23
- <%= helpers.svg('switch-vertical', class: 'text-gray-400 h-6 hover:text-gray-600') %>
24
- <% end %>
25
- <div class="flex hidden absolute max-w-xs bg-white rounded p-2" data-popover-target="content">
26
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :higher, svg: 'arrow-up' %>
27
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :lower, svg: 'arrow-down' %>
28
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :to_top, svg: 'download-solid-reversed' %>
29
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :to_bottom, svg: 'download-solid' %>
30
- </div>
31
- <% end %>
32
- </div>
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Index::Ordering::ButtonsComponent < Avo::Index::Ordering::BaseComponent
4
- def initialize(resource: nil, reflection: nil, view_type: nil)
5
- @resource = resource
6
- @reflection = reflection
7
- @view_type = view_type
8
- end
9
-
10
- def render?
11
- has_with_trial(:resource_ordering) && can_order_any? && view_type_is_table? && enabled_in_view?
12
- end
13
-
14
- private
15
-
16
- def can_order_any?
17
- order_actions.present?
18
- end
19
-
20
- def view_type_is_table?
21
- @view_type.to_sym == :table
22
- end
23
-
24
- def display_inline?
25
- ordering[:display_inline]
26
- end
27
-
28
- def enabled_in_view?
29
- in_association = @reflection.present?
30
-
31
- if in_association
32
- visible_on_option.include? :association
33
- else
34
- visible_on_option.include? :index
35
- end
36
- end
37
-
38
- def visible_on_option
39
- return [] if ordering.nil?
40
-
41
- [ordering[:visible_on]].flatten
42
- end
43
-
44
- def ordering
45
- @resource.class.ordering
46
- end
47
- end
@@ -1,16 +0,0 @@
1
- <% if item.is_a? Avo::Menu::Link %>
2
- <%= render Avo::Sidebar::LinkComponent.new label: item.name, path: item.path, target: item.target, data: item.data, icon: item.icon %>
3
- <% end %>
4
- <% if item.is_a? Avo::Menu::Resource %>
5
- <%= render Avo::Sidebar::LinkComponent.new label: item.navigation_label, path: helpers.resources_path(resource: resource, **item.fetch_params), data: item.data, icon: item.icon %>
6
- <% end %>
7
- <% if item.is_a? Avo::Menu::Dashboard %>
8
- <%= render Avo::Sidebar::LinkComponent.new label: item.navigation_label, path: dashboard.navigation_path, data: item.data, icon: item.icon %>
9
- <% end %>
10
- <% if item.is_a? Avo::Menu::Section %>
11
- <%= render Avo::Sidebar::SectionComponent.new item: item %>
12
- <% end %>
13
- <% if item.is_a? Avo::Menu::Group %>
14
- <%= render Avo::Sidebar::GroupComponent.new item: item %>
15
- <% end %>
16
-
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Sidebar::ItemSwitcherComponent < Avo::Sidebar::BaseItemComponent
4
- def resource
5
- item.parsed_resource
6
- end
7
-
8
- def dashboard
9
- item.parsed_dashboard
10
- end
11
-
12
- def render?
13
- item.visible?
14
- end
15
- end
@@ -1,37 +0,0 @@
1
- require_dependency "avo/application_controller"
2
-
3
- module Avo
4
- module Dashboards
5
- class CardsController < ApplicationController
6
- before_action :set_dashboard
7
- before_action :set_card
8
- before_action :detect_chartkick
9
-
10
- def show
11
- render(:chartkick_missing) unless @chartkick_installed
12
- end
13
-
14
- private
15
-
16
- def set_dashboard
17
- @dashboard = Avo::App.get_dashboard_by_id params[:dashboard_id]
18
-
19
- raise ActionController::RoutingError.new("Not Found") if @dashboard.nil? || @dashboard.is_hidden?
20
- end
21
-
22
- def set_card
23
- @card = @dashboard.item_at_index(params[:index].to_i).tap do |card|
24
- card.hydrate(dashboard: @dashboard)
25
- end
26
- end
27
-
28
- def detect_chartkick
29
- @chartkick_installed = if @card.class.ancestors.map(&:to_s).include?("Avo::Dashboards::ChartkickCard")
30
- defined?(Chartkick)
31
- else
32
- true
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,22 +0,0 @@
1
- require_dependency "avo/application_controller"
2
-
3
- module Avo
4
- class DashboardsController < ApplicationController
5
- before_action :set_dashboard, only: :show
6
-
7
- def show
8
- @page_title = @dashboard.name
9
- end
10
-
11
- private
12
-
13
- def set_dashboard
14
- @dashboard = Avo::App.get_dashboard_by_id params[:id]
15
-
16
- authorized = Avo::Hosts::BaseHost.new(block: @dashboard.authorize).handle
17
- raise Avo::NotAuthorizedError.new if !authorized
18
-
19
- raise ActionController::RoutingError.new("Not Found") if @dashboard.nil? || @dashboard.is_hidden?
20
- end
21
- end
22
- end
@@ -1,25 +0,0 @@
1
- require_dependency "avo/application_controller"
2
-
3
- module Avo
4
- class ReorderController < ApplicationController
5
- before_action :set_resource_name
6
- before_action :set_resource
7
- before_action :hydrate_resource
8
- before_action :set_model
9
-
10
- def order
11
- direction = params[:direction].to_sym
12
-
13
- if direction.present?
14
- @resource
15
- .hydrate(model: @model, params: params)
16
- .ordering_host
17
- .order direction
18
- end
19
-
20
- respond_to do |format|
21
- format.html { redirect_to params[:referrer] || resources_path(resource: @resource) }
22
- end
23
- end
24
- end
25
- end
@@ -1,22 +0,0 @@
1
- import { Controller } from '@hotwired/stimulus'
2
-
3
- export default class extends Controller {
4
- /**
5
- * Helper that parses the data attribute value to JSON
6
- */
7
- getJsonAttribute(target, attribute, defaultValue = []) {
8
- let result = defaultValue
9
- try {
10
- result = JSON.parse(target.getAttribute(attribute))
11
- } catch (error) {}
12
-
13
- return result
14
- }
15
-
16
- /**
17
- * Parses the attribute to boolean
18
- */
19
- getBooleanAttribute(target, attribute) {
20
- return target.getAttribute(attribute) === '1'
21
- }
22
- }
@@ -1,51 +0,0 @@
1
- import { Controller } from '@hotwired/stimulus'
2
-
3
- // Used as a custom Stream Action <turbo-stream action="update-belongs-to" />
4
- export default class extends Controller {
5
- static values = {
6
- polymorphic: Boolean,
7
- searchable: Boolean,
8
- targetName: String,
9
- relationName: String
10
- }
11
-
12
- beforeStreamRender(event) {
13
- const { relationName } = event.target.dataset
14
- if (event.target.action !== "update-belongs-to" || this.relationNameValue !== relationName) {
15
- return false;
16
- }
17
-
18
- event.detail.render = (stream) => {
19
- if (this.searchableValue) {
20
- this.updateSearchable(stream)
21
- } else{
22
- this.updateNonSearchable(stream)
23
- }
24
- };
25
- }
26
-
27
- updateSearchable(stream) {
28
- // Update the id component
29
- document.querySelector(`input[name="${this.targetNameValue}"][type="hidden"]`).value = stream.dataset.targetResourceId
30
- // Update the label
31
- document.querySelector(`input[name="${this.targetNameValue}"][type="text"]`).value = stream.dataset.targetResourceLabel
32
- }
33
-
34
- updateNonSearchable(stream) {
35
- const select = this.selectorContext(stream).querySelector(`select[name="${this.targetNameValue}"]`)
36
- const option = document.createElement('option')
37
- option.value = stream.dataset.targetResourceId
38
- option.text = stream.dataset.targetResourceLabel
39
- option.selected = true
40
- select.appendChild(option)
41
- }
42
-
43
- selectorContext(stream) {
44
- // if polymorphic, search for the select in the correct sub-container
45
- if (this.polymorphicValue) {
46
- return document.querySelector(`[data-type="${stream.dataset.targetResourceClass}"]`)
47
- }
48
-
49
- return document
50
- }
51
- }