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
@@ -3,52 +3,52 @@ module Avo
3
3
  extend ActiveSupport::DescendantsTracker
4
4
 
5
5
  include ActionView::Helpers::UrlHelper
6
- include Avo::Concerns::HasFields
7
- include Avo::Concerns::CanReplaceFields
8
- include Avo::Concerns::HasEditableControls
9
- include Avo::Concerns::HasResourceStimulusControllers
6
+ include Avo::Concerns::HasItems
7
+ include Avo::Concerns::CanReplaceItems
8
+ include Avo::Concerns::HasControls
9
+ include Avo::Concerns::HasStimulusControllers
10
10
  include Avo::Concerns::ModelClassConstantized
11
- include Avo::Concerns::Pagination
12
11
 
13
- delegate :view_context, to: ::Avo::App
14
- delegate :current_user, to: ::Avo::App
15
- delegate :params, to: ::Avo::App
12
+ delegate :context, to: Avo::Current
13
+ delegate :current_user, to: Avo::Current
14
+ delegate :params, to: Avo::Current
15
+ delegate :request, to: Avo::Current
16
+ delegate :view_context, to: Avo::Current
16
17
  delegate :simple_format, :content_tag, to: :view_context
17
18
  delegate :main_app, to: :view_context
18
19
  delegate :avo, to: :view_context
19
20
  delegate :resource_path, to: :view_context
20
21
  delegate :resources_path, to: :view_context
21
22
  delegate :t, to: ::I18n
22
- delegate :context, to: ::Avo::App
23
23
 
24
24
  attr_accessor :view
25
25
  attr_accessor :reflection
26
26
  attr_accessor :user
27
27
  attr_accessor :params
28
+ attr_accessor :record
28
29
 
29
30
  class_attribute :id, default: :id
30
31
  class_attribute :title, default: :id
31
32
  class_attribute :description, default: :id
32
33
  class_attribute :search_query, default: nil
33
34
  class_attribute :search_query_help, default: ""
34
- class_attribute :search_result_path
35
35
  class_attribute :includes, default: []
36
36
  class_attribute :authorization_policy
37
37
  class_attribute :translation_key
38
38
  class_attribute :default_view_type, default: :table
39
39
  class_attribute :devise_password_optional, default: false
40
40
  class_attribute :actions_loader
41
+ class_attribute :scopes_loader
41
42
  class_attribute :filters_loader
42
43
  class_attribute :grid_loader
43
44
  class_attribute :visible_on_sidebar, default: true
44
45
  class_attribute :unscoped_queries_on_index, default: false
45
- class_attribute :resolve_query_scope
46
+ class_attribute :resolve_index_query
46
47
  class_attribute :resolve_find_scope
47
48
  # TODO: refactor this into a Host without args
48
49
  class_attribute :find_record_method, default: ->(model_class:, id:, params:) {
49
50
  model_class.find id
50
51
  }
51
- class_attribute :ordering
52
52
  class_attribute :hide_from_global_search, default: false
53
53
  class_attribute :after_create_path, default: :show
54
54
  class_attribute :after_update_path, default: :show
@@ -56,11 +56,13 @@ module Avo
56
56
  class_attribute :keep_filters_panel_open, default: false
57
57
  class_attribute :extra_params
58
58
  class_attribute :link_to_child_resource, default: false
59
- class_attribute :map_view
59
+
60
+ # EXTRACT:
61
+ class_attribute :ordering
60
62
 
61
63
  class << self
62
64
  delegate :t, to: ::I18n
63
- delegate :context, to: ::Avo::App
65
+ delegate :context, to: ::Avo::Current
64
66
 
65
67
  def grid(&block)
66
68
  grid_collector = GridCollector.new
@@ -72,7 +74,7 @@ module Avo
72
74
  def action(action_class, arguments: {})
73
75
  self.actions_loader ||= Avo::Loaders::Loader.new
74
76
 
75
- action = { class: action_class, arguments: arguments }
77
+ action = {class: action_class, arguments: arguments}
76
78
  self.actions_loader.use action
77
79
  end
78
80
 
@@ -89,28 +91,38 @@ module Avo
89
91
  query_scope
90
92
  end
91
93
 
94
+ def scopes(*args)
95
+ self.scopes_loader ||= Avo::Loaders::Loader.new
96
+
97
+ args.each do |scope_class|
98
+ self.scopes_loader.use scope_class
99
+ end
100
+ end
101
+
92
102
  # This resolves the scope when doing "where" queries (not find queries)
93
103
  def query_scope
94
- final_scope = resolve_query_scope.present? ? resolve_query_scope.call(model_class: model_class) : model_class
104
+ final_scope = if resolve_index_query.present?
105
+ Avo::ExecutionContext.new(target: resolve_index_query, model_class: model_class).handle
106
+ else
107
+ model_class
108
+ end
95
109
 
96
110
  authorization.apply_policy final_scope
97
111
  end
98
112
 
99
113
  # This resolves the scope when finding records (not "where" queries)
100
114
  def find_scope
101
- final_scope = resolve_find_scope.present? ? resolve_find_scope.call(model_class: model_class) : model_class
115
+ final_scope = if resolve_find_scope.present?
116
+ Avo::ExecutionContext.new(target: resolve_find_scope, model_class: model_class).handle
117
+ else
118
+ model_class
119
+ end
102
120
 
103
121
  authorization.apply_policy final_scope
104
122
  end
105
123
 
106
124
  def authorization
107
- Avo::Services::AuthorizationService.new Avo::App.current_user, model_class, policy_class: authorization_policy
108
- end
109
-
110
- def order_actions
111
- return {} if ordering.blank?
112
-
113
- ordering.dig(:actions) || {}
125
+ Avo::Services::AuthorizationService.new Avo::Current.current_user, model_class, policy_class: authorization_policy
114
126
  end
115
127
 
116
128
  def get_record_associations(record)
@@ -134,13 +146,15 @@ module Avo
134
146
  ApplicationRecord.descendants
135
147
  end
136
148
 
137
- def valid_model_class(model_class)
149
+ def get_model_by_name(model_name)
138
150
  get_available_models.find do |m|
139
- m.to_s == model_class.to_s
151
+ m.to_s == model_name.to_s
140
152
  end
141
153
  end
142
154
  end
143
155
 
156
+ delegate :context, to: ::Avo::Current
157
+
144
158
  def initialize
145
159
  unless self.class.model_class.present?
146
160
  if model_class.present? && model_class.respond_to?(:base_class)
@@ -149,19 +163,13 @@ module Avo
149
163
  end
150
164
  end
151
165
 
152
- def record
153
- @model
154
- end
155
- alias_method :model, :record
156
-
157
-
158
- def hydrate(model: nil, view: nil, user: nil, params: nil)
166
+ def hydrate(record: nil, view: nil, user: nil, params: nil)
159
167
  @view = view if view.present?
160
168
  @user = user if user.present?
161
169
  @params = params if params.present?
162
170
 
163
- if model.present?
164
- @model = model
171
+ if record.present?
172
+ @record = record
165
173
 
166
174
  hydrate_model_with_default_values if @view == :new
167
175
  end
@@ -172,7 +180,7 @@ module Avo
172
180
  def get_grid_fields
173
181
  return if self.class.grid_loader.blank?
174
182
 
175
- self.class.grid_loader.hydrate(model: @model, view: @view, resource: self)
183
+ self.class.grid_loader.hydrate(record: @record, view: @view, resource: self)
176
184
  end
177
185
 
178
186
  def get_filters
@@ -199,45 +207,47 @@ module Avo
199
207
  action[:arguments]
200
208
  end
201
209
 
210
+ def get_scopes
211
+ return [] if self.class.scopes_loader.blank?
212
+
213
+ self.class.scopes_loader.bag
214
+ end
215
+
202
216
  def default_panel_name
203
217
  return @params[:related_name].capitalize if @params.present? && @params[:related_name].present?
204
218
 
205
219
  case @view
206
220
  when :show
207
- model_title
221
+ record_title
208
222
  when :edit
209
- model_title
223
+ record_title
210
224
  when :new
211
225
  t("avo.create_new_item", item: name.downcase).upcase_first
212
226
  end
213
227
  end
214
228
 
215
- def class_name_without_resource
216
- self.class.name.demodulize.delete_suffix("Resource")
229
+ def class_name
230
+ self.class.name.demodulize
217
231
  end
218
232
 
219
233
  def model_class
220
234
  # get the model class off of the static property
221
235
  return self.class.model_class if self.class.model_class.present?
222
236
 
223
- # get the model class off of the model for STI models
224
- return @model.base_class if @model.present?
237
+ # get the model class off of the record
238
+ return @record.base_class if @record.present?
225
239
 
226
240
  # generate a model class
227
- class_name_without_resource.safe_constantize
241
+ class_name.safe_constantize
228
242
  end
229
243
 
230
- def model_id
231
- @model.send id
232
- end
233
-
234
- def model_title
235
- return name if @model.nil?
244
+ def record_title
245
+ return name if @record.nil?
236
246
 
237
- the_title = @model.send title
247
+ the_title = @record.send title
238
248
  return the_title if the_title.present?
239
249
 
240
- model_id
250
+ @record.id
241
251
  rescue
242
252
  name
243
253
  end
@@ -253,18 +263,16 @@ module Avo
253
263
  end
254
264
 
255
265
  def translation_key
256
- return "avo.resource_translations.#{class_name_without_resource.underscore}" if ::Avo::App.translation_enabled
257
-
258
- self.class.translation_key
266
+ self.class.translation_key || "avo.resource_translations.#{class_name.underscore}"
259
267
  end
260
268
 
261
269
  def name
262
- default = class_name_without_resource.to_s.gsub('::', ' ').underscore.humanize
270
+ default = class_name.underscore.humanize
263
271
 
264
272
  return @name if @name.present?
265
273
 
266
- if translation_key && ::Avo::App.translation_enabled
267
- t(translation_key, count: 1, default: default).humanize
274
+ if translation_key
275
+ t(translation_key, count: 1, default: default).capitalize
268
276
  else
269
277
  default
270
278
  end
@@ -277,8 +285,8 @@ module Avo
277
285
  def plural_name
278
286
  default = name.pluralize
279
287
 
280
- if translation_key && ::Avo::App.translation_enabled
281
- t(translation_key, count: 2, default: default).humanize
288
+ if translation_key
289
+ t(translation_key, count: 2, default: default).capitalize
282
290
  else
283
291
  default
284
292
  end
@@ -298,20 +306,19 @@ module Avo
298
306
  view_types = [:table]
299
307
 
300
308
  view_types << :grid if get_grid_fields.present?
301
- view_types << :map if map_view.present?
302
309
 
303
310
  view_types
304
311
  end
305
312
 
306
- def attachment_fields
313
+ def attached_file_fields
307
314
  get_field_definitions.select do |field|
308
315
  [Avo::Fields::FileField, Avo::Fields::FilesField].include? field.class
309
316
  end
310
317
  end
311
318
 
312
- # Map the received params to their actual fields.
313
- def fields_by_database_id
314
- get_field_definitions
319
+ def fill_record(record, params, extra_params: [])
320
+ # Map the received params to their actual fields
321
+ fields_by_database_id = get_field_definitions
315
322
  .reject do |field|
316
323
  field.computed
317
324
  end
@@ -319,30 +326,28 @@ module Avo
319
326
  [field.database_id.to_s, field]
320
327
  end
321
328
  .to_h
322
- end
323
329
 
324
- def fill_model(model, params, extra_params: [])
325
330
  # Write the field values
326
331
  params.each do |key, value|
327
332
  field = fields_by_database_id[key]
328
333
 
329
334
  next unless field.present?
330
335
 
331
- model = field.fill_field model, key, value, params
336
+ record = field.fill_field record, key, value, params
332
337
  end
333
338
 
334
- # Write the user configured extra params to the model
339
+ # Write the user configured extra params to the record
335
340
  if extra_params.present?
336
341
  # Let Rails fill in the rest of the params
337
- model.assign_attributes params.permit(extra_params)
342
+ record.assign_attributes params.permit(extra_params)
338
343
  end
339
344
 
340
- model
345
+ record
341
346
  end
342
347
 
343
348
  def authorization(user: nil)
344
- current_user = user || Avo::App.current_user
345
- Avo::Services::AuthorizationService.new(current_user, model || model_class, policy_class: authorization_policy)
349
+ current_user = user || Avo::Current.current_user
350
+ Avo::Services::AuthorizationService.new(current_user, record || model_class, policy_class: authorization_policy)
346
351
  end
347
352
 
348
353
  def file_hash
@@ -363,54 +368,57 @@ module Avo
363
368
  Digest::MD5.hexdigest(content_to_be_hashed)
364
369
  end
365
370
 
366
- def cache_hash(parent_model)
367
- if parent_model.present?
368
- [model, file_hash, parent_model]
371
+ def cache_hash(parent_record)
372
+ if parent_record.present?
373
+ [record, file_hash, parent_record]
369
374
  else
370
- [model, file_hash]
375
+ [record, file_hash]
371
376
  end
372
377
  end
373
378
 
374
- # We will not overwrite any attributes that come pre-filled in the model.
379
+ # We will not overwrite any attributes that come pre-filled in the record.
375
380
  def hydrate_model_with_default_values
376
381
  default_values = get_fields
377
382
  .select do |field|
378
383
  !field.computed
379
384
  end
380
385
  .map do |field|
386
+ id = field.id
381
387
  value = field.value
382
388
 
383
389
  if field.type == "belongs_to"
390
+ id = field.foreign_key.to_sym
384
391
 
385
- reflection = @model._reflections[@params[:via_relation]]
392
+ reflection = @record._reflections[@params[:via_relation]]
386
393
 
387
394
  if field.polymorphic_as.present? && field.types.map(&:to_s).include?(@params[:via_relation_class])
388
395
  # set the value to the actual record
389
- via_resource = ::Avo::App.get_resource_by_model_name(@params[:via_relation_class])
390
- value = via_resource.find_record(@params[:via_resource_id])
396
+ value = @params[:via_relation_class].safe_constantize.find(@params[:via_record_id])
391
397
  elsif reflection.present? && reflection.foreign_key.present? && field.id.to_s == @params[:via_relation].to_s
392
- resource = Avo::App.get_resource_by_model_name params[:via_relation_class]
393
- model = resource.find_record @params[:via_resource_id], params: params
398
+ resource = Avo::App.resources.get_resource_by_model_class params[:via_relation_class]
399
+ record = resource.find_record @params[:via_record_id], params: params
394
400
  id_param = reflection.options[:primary_key] || :id
395
401
 
396
- value = model.send(id_param)
402
+ value = record.send(id_param)
397
403
  end
398
404
  end
399
405
 
400
- [field, value]
406
+ [id, value]
401
407
  end
402
408
  .to_h
403
- .select do |_, value|
409
+ .select do |id, value|
404
410
  value.present?
405
411
  end
406
412
 
407
- default_values.each do |field, value|
408
- field.assign_value record: @model, value: value
413
+ default_values.each do |id, value|
414
+ if @record.send(id).nil?
415
+ @record.send("#{id}=", value)
416
+ end
409
417
  end
410
418
  end
411
419
 
412
420
  def route_key
413
- class_name_without_resource.underscore.pluralize
421
+ class_name.underscore.pluralize
414
422
  end
415
423
 
416
424
  def singular_route_key
@@ -434,7 +442,7 @@ module Avo
434
442
  end
435
443
 
436
444
  def record_path
437
- resource_path(model: model, resource: self)
445
+ resource_path(record: record, resource: self)
438
446
  end
439
447
 
440
448
  def records_path
@@ -450,7 +458,7 @@ module Avo
450
458
  end
451
459
 
452
460
  def label
453
- label_field&.value || model_title
461
+ label_field&.value || record_title
454
462
  end
455
463
 
456
464
  def avatar_field
@@ -493,12 +501,8 @@ module Avo
493
501
  model_class.base_class.to_s.underscore.downcase
494
502
  end
495
503
 
496
- def ordering_host(**args)
497
- Avo::Hosts::Ordering.new resource: self, options: self.class.ordering, **args
498
- end
499
-
500
- def has_model_id?
501
- model.present? && model.id.present?
504
+ def has_record_id?
505
+ record.present? && record_id.present?
502
506
  end
503
507
 
504
508
  def find_record(id, query: nil, params: nil)
@@ -506,5 +510,13 @@ module Avo
506
510
 
507
511
  self.class.find_record_method.call(model_class: query, id: id, params: params)
508
512
  end
513
+
514
+ def id_attribute
515
+ :id
516
+ end
517
+
518
+ def record_id
519
+ record.send(id_attribute)
520
+ end
509
521
  end
510
522
  end
@@ -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
@@ -1,6 +1,6 @@
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
@@ -12,7 +12,7 @@ module Avo
12
12
  # back-up the previous items
13
13
  self.backup_items_holder = items_holder
14
14
 
15
- self.items_holder = Avo::ItemsHolder.new
15
+ self.items_holder = Avo::Resources::Items::Holder.new
16
16
 
17
17
  instance_eval(&block)
18
18
  end
@@ -22,7 +22,7 @@ module Avo
22
22
  end
23
23
 
24
24
  def with_new_items(&block)
25
- self.items_holder = Avo::ItemsHolder.new
25
+ self.items_holder = Avo::Resources::Items::Holder.new
26
26
 
27
27
  instance_eval(&block)
28
28
  end
@@ -1,3 +1,4 @@
1
+
1
2
  module Avo
2
3
  module Concerns
3
4
  module FiltersSessionHandler
@@ -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,38 @@
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
+ end
37
+ end
38
+ end