avo 2.43.0 → 3.0.2

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