avo 2.45.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 (407) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +28 -26
  3. data/Gemfile.lock +231 -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 +3 -2
  73. data/app/components/avo/index/resource_table_component.rb +8 -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 +1 -1
  84. data/app/components/avo/paginator_component.rb +6 -6
  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 -86
  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 +29 -31
  105. data/app/controllers/avo/application_controller.rb +119 -180
  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 +139 -91
  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/controllers/action_controller.js +5 -3
  118. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  119. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
  120. data/app/javascript/js/controllers/filter_controller.js +1 -1
  121. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  122. data/app/javascript/js/controllers/preview_controller.js +24 -0
  123. data/app/javascript/js/controllers/search_controller.js +4 -2
  124. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  125. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  126. data/app/javascript/js/controllers.js +11 -5
  127. data/app/javascript/js/custom-stream-actions.js +15 -0
  128. data/app/views/avo/actions/show.html.erb +9 -5
  129. data/app/views/avo/associations/new.html.erb +2 -2
  130. data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
  131. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
  132. data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
  133. data/app/views/avo/base/edit.html.erb +1 -1
  134. data/app/views/avo/base/index.html.erb +4 -3
  135. data/app/views/avo/base/new.html.erb +2 -1
  136. data/app/views/avo/base/preview.html.erb +19 -0
  137. data/app/views/avo/base/show.html.erb +2 -2
  138. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  139. data/app/views/avo/debug/report.html.erb +32 -17
  140. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  141. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  142. data/app/views/avo/partials/_footer.html.erb +1 -1
  143. data/app/views/avo/partials/_javascript.html.erb +5 -0
  144. data/app/views/avo/partials/_logo.html.erb +1 -1
  145. data/app/views/avo/partials/_navbar.html.erb +3 -5
  146. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  147. data/app/views/avo/partials/_table_header.html.erb +5 -11
  148. data/app/views/layouts/avo/application.html.erb +5 -4
  149. data/avo.gemspec +10 -8
  150. data/bin/dev +3 -1
  151. data/bin/prod +0 -0
  152. data/config/master.key +1 -0
  153. data/config/routes.rb +7 -10
  154. data/db/factories.rb +6 -0
  155. data/lib/avo/asset_manager.rb +30 -0
  156. data/lib/avo/base_action.rb +82 -66
  157. data/lib/avo/base_resource.rb +285 -225
  158. data/lib/avo/base_resource_tool.rb +9 -16
  159. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  160. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  161. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  162. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  163. data/lib/avo/concerns/has_controls.rb +37 -0
  164. data/lib/avo/concerns/has_description.rb +23 -0
  165. data/lib/avo/concerns/has_helpers.rb +18 -0
  166. data/lib/avo/concerns/has_item_type.rb +42 -0
  167. data/lib/avo/concerns/has_items.rb +339 -0
  168. data/lib/avo/concerns/hydration.rb +17 -0
  169. data/lib/avo/concerns/is_resource_item.rb +16 -36
  170. data/lib/avo/concerns/is_visible.rb +15 -0
  171. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  172. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  173. data/lib/avo/concerns/visible_items.rb +7 -38
  174. data/lib/avo/configuration/branding.rb +0 -12
  175. data/lib/avo/configuration.rb +28 -11
  176. data/lib/avo/current.rb +39 -0
  177. data/lib/avo/dsl/field_parser.rb +3 -3
  178. data/lib/avo/dynamic_router.rb +18 -3
  179. data/lib/avo/engine.rb +35 -30
  180. data/lib/avo/error_manager.rb +25 -0
  181. data/lib/avo/execution_context.rb +14 -15
  182. data/lib/avo/fields/base_field.rb +84 -121
  183. data/lib/avo/fields/belongs_to_field.rb +19 -23
  184. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  185. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  186. data/lib/avo/fields/concerns/has_default.rb +1 -5
  187. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  188. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  189. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  190. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  191. data/lib/avo/fields/concerns/is_required.rb +5 -7
  192. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  193. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  194. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  195. data/lib/avo/fields/country_field.rb +4 -0
  196. data/lib/avo/fields/date_time_field.rb +1 -5
  197. data/lib/avo/fields/external_image_field.rb +2 -2
  198. data/lib/avo/fields/field_manager.rb +55 -0
  199. data/lib/avo/fields/file_field.rb +2 -2
  200. data/lib/avo/fields/gravatar_field.rb +2 -2
  201. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  202. data/lib/avo/fields/has_base_field.rb +21 -17
  203. data/lib/avo/fields/has_many_field.rb +5 -2
  204. data/lib/avo/fields/has_one_field.rb +8 -12
  205. data/lib/avo/fields/heading_field.rb +9 -14
  206. data/lib/avo/fields/hidden_field.rb +1 -1
  207. data/lib/avo/fields/id_field.rb +3 -3
  208. data/lib/avo/fields/location_field.rb +10 -10
  209. data/lib/avo/fields/password_field.rb +1 -1
  210. data/lib/avo/fields/preview_field.rb +14 -0
  211. data/lib/avo/fields/select_field.rb +12 -8
  212. data/lib/avo/fields/status_field.rb +7 -1
  213. data/lib/avo/fields/text_field.rb +2 -2
  214. data/lib/avo/filters/base_filter.rb +9 -4
  215. data/lib/avo/html/builder.rb +8 -8
  216. data/lib/avo/item_grapher.rb +78 -0
  217. data/lib/avo/licensing/h_q.rb +11 -73
  218. data/lib/avo/licensing/license.rb +5 -1
  219. data/lib/avo/licensing/license_manager.rb +1 -1
  220. data/lib/avo/licensing/pro_license.rb +1 -7
  221. data/lib/avo/loaders/fields_loader.rb +7 -1
  222. data/lib/avo/plugin.rb +36 -0
  223. data/lib/avo/plugin_manager.rb +56 -0
  224. data/lib/avo/prefixed_test_helpers.rb +20 -0
  225. data/lib/avo/reloader.rb +3 -0
  226. data/lib/avo/resources/controls/actions_list.rb +7 -12
  227. data/lib/avo/resources/controls/attach_button.rb +15 -0
  228. data/lib/avo/resources/controls/back_button.rb +1 -1
  229. data/lib/avo/resources/controls/base_control.rb +15 -49
  230. data/lib/avo/resources/controls/create_button.rb +15 -0
  231. data/lib/avo/resources/controls/delete_button.rb +5 -1
  232. data/lib/avo/resources/controls/detach_button.rb +4 -1
  233. data/lib/avo/resources/controls/edit_button.rb +4 -1
  234. data/lib/avo/resources/controls/order_controls.rb +8 -0
  235. data/lib/avo/resources/controls/save_button.rb +13 -0
  236. data/lib/avo/resources/controls/show_button.rb +15 -0
  237. data/lib/avo/resources/items/holder.rb +96 -0
  238. data/lib/avo/resources/items/item_group.rb +44 -0
  239. data/lib/avo/resources/items/main_panel.rb +12 -0
  240. data/lib/avo/resources/items/panel.rb +2 -0
  241. data/lib/avo/resources/items/row.rb +42 -0
  242. data/lib/avo/resources/items/sidebar.rb +46 -0
  243. data/lib/avo/resources/items/tab.rb +54 -0
  244. data/lib/avo/resources/items/tab_group.rb +62 -0
  245. data/lib/avo/resources/resource_manager.rb +179 -0
  246. data/lib/avo/services/authorization_service.rb +11 -110
  247. data/lib/avo/services/debug_service.rb +93 -0
  248. data/lib/avo/services/encryption_service.rb +8 -12
  249. data/lib/avo/services/telemetry_service.rb +85 -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/view_inquirer.rb +36 -0
  254. data/lib/avo.rb +109 -24
  255. data/lib/generators/avo/action_generator.rb +8 -8
  256. data/lib/generators/avo/card_generator.rb +27 -0
  257. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  258. data/lib/generators/avo/controller_generator.rb +3 -0
  259. data/lib/generators/avo/eject_generator.rb +180 -15
  260. data/lib/generators/avo/field_generator.rb +49 -2
  261. data/lib/generators/avo/filter_generator.rb +8 -8
  262. data/lib/generators/avo/js/install_generator.rb +2 -2
  263. data/lib/generators/avo/resource_generator.rb +12 -9
  264. data/lib/generators/avo/scope_generator.rb +15 -0
  265. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  266. data/lib/generators/avo/templates/action.tt +8 -6
  267. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  268. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  269. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  270. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  271. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  272. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  273. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  274. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  275. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  276. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  277. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  278. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  279. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  280. data/lib/generators/avo/templates/locales/avo.ar.yml +2 -1
  281. data/lib/generators/avo/templates/locales/avo.en.yml +4 -3
  282. data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
  283. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
  284. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
  285. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
  286. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
  287. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
  288. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -5
  289. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -0
  290. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  291. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  292. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  293. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  294. data/lib/generators/avo/templates/scope.tt +6 -0
  295. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  296. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  297. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  298. data/lib/tasks/avo_tasks.rake +72 -4
  299. data/public/avo-assets/avo.base.css +1893 -1187
  300. data/public/avo-assets/avo.base.js +217 -305
  301. data/public/avo-assets/avo.base.js.map +3 -3
  302. data/public/avo-assets/avo.css +9744 -0
  303. data/public/avo-assets/avo.js +513 -0
  304. data/public/avo-assets/avo.js.map +7 -0
  305. data/tailwind.custom.js +47 -0
  306. data/tailwind.preset.js +152 -0
  307. metadata +104 -113
  308. data/app/components/avo/card_component.html.erb +0 -46
  309. data/app/components/avo/card_component.rb +0 -25
  310. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  311. data/app/components/avo/dashboards/divider_component.rb +0 -19
  312. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  313. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  314. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  315. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  317. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  318. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  319. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  320. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  321. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  322. data/app/components/avo/index/ordering/base_component.rb +0 -9
  323. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  324. data/app/components/avo/index/ordering/button_component.rb +0 -23
  325. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  326. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  327. data/app/components/avo/item_switcher_component.html.erb +0 -27
  328. data/app/components/avo/item_switcher_component.rb +0 -48
  329. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  330. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  331. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  332. data/app/controllers/avo/dashboards_controller.rb +0 -22
  333. data/app/controllers/avo/reorder_controller.rb +0 -25
  334. data/app/javascript/js/controllers/base_controller.js +0 -22
  335. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  336. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  337. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  338. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  339. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  340. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  341. data/app/views/avo/dashboards/show.html.erb +0 -38
  342. data/app/views/avo/partials/_global_search.html.erb +0 -19
  343. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  344. data/lib/avo/app.rb +0 -237
  345. data/lib/avo/base_card.rb +0 -161
  346. data/lib/avo/concerns/fetches_things.rb +0 -150
  347. data/lib/avo/concerns/handles_field_args.rb +0 -47
  348. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  349. data/lib/avo/concerns/has_fields.rb +0 -334
  350. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  351. data/lib/avo/concerns/policy_helpers.rb +0 -31
  352. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  353. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  354. data/lib/avo/dashboards/base_divider.rb +0 -35
  355. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  356. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  357. data/lib/avo/dashboards/metric_card.rb +0 -9
  358. data/lib/avo/dashboards/partial_card.rb +0 -7
  359. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  360. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  361. data/lib/avo/fields/tags_field.rb +0 -102
  362. data/lib/avo/grid_collector.rb +0 -42
  363. data/lib/avo/hosts/association_scope_host.rb +0 -8
  364. data/lib/avo/hosts/base_host.rb +0 -25
  365. data/lib/avo/hosts/card_visibility.rb +0 -20
  366. data/lib/avo/hosts/dashboard_card.rb +0 -22
  367. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  368. data/lib/avo/hosts/ordering.rb +0 -22
  369. data/lib/avo/hosts/record_host.rb +0 -7
  370. data/lib/avo/hosts/resource_record_host.rb +0 -7
  371. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  372. data/lib/avo/hosts/search_scope_host.rb +0 -7
  373. data/lib/avo/hosts/view_record_host.rb +0 -7
  374. data/lib/avo/hosts/visibility_host.rb +0 -12
  375. data/lib/avo/items_holder.rb +0 -96
  376. data/lib/avo/main_panel.rb +0 -3
  377. data/lib/avo/menu/base_item.rb +0 -25
  378. data/lib/avo/menu/builder.rb +0 -82
  379. data/lib/avo/menu/dashboard.rb +0 -22
  380. data/lib/avo/menu/group.rb +0 -2
  381. data/lib/avo/menu/link.rb +0 -6
  382. data/lib/avo/menu/menu.rb +0 -2
  383. data/lib/avo/menu/resource.rb +0 -22
  384. data/lib/avo/menu/section.rb +0 -2
  385. data/lib/avo/panel.rb +0 -24
  386. data/lib/avo/panel_builder.rb +0 -25
  387. data/lib/avo/resources/controls/action.rb +0 -38
  388. data/lib/avo/resources/controls/execution_context.rb +0 -58
  389. data/lib/avo/resources/controls/items_holder.rb +0 -19
  390. data/lib/avo/resources/controls/link_to.rb +0 -27
  391. data/lib/avo/row.rb +0 -26
  392. data/lib/avo/row_builder.rb +0 -24
  393. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  394. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  395. data/lib/avo/sidebar.rb +0 -30
  396. data/lib/avo/sidebar_builder.rb +0 -24
  397. data/lib/avo/tab.rb +0 -72
  398. data/lib/avo/tab_builder.rb +0 -25
  399. data/lib/avo/tab_group.rb +0 -42
  400. data/lib/avo/tab_group_builder.rb +0 -43
  401. data/lib/avo/tools_manager.rb +0 -11
  402. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  403. data/lib/generators/avo/card/metric_generator.rb +0 -18
  404. data/lib/generators/avo/card/partial_generator.rb +0 -19
  405. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  406. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  407. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -1,150 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module FetchesThings
4
- extend ActiveSupport::Concern
5
-
6
- class_methods do
7
- # Returns the Avo dashboard by id
8
- #
9
- # get_dashboard_by_id(:dashy) -> Dashy
10
- def get_dashboard_by_id(id)
11
- dashboards.find do |dashboard|
12
- dashboard.id == id
13
- end
14
- end
15
-
16
- # Returns the Avo dashboard by name
17
- #
18
- # get_dashboard_by_name(:dashy) -> instance of Dashy
19
- def get_dashboard_by_name(name)
20
- dashboards.find do |dashboard|
21
- dashboard.name == name
22
- end
23
- end
24
-
25
- # Filters out the resources that are missing the model_class
26
- def valid_resources
27
- resources.select { |resource| resource.model_class.present? }.sort_by(&:name)
28
- end
29
-
30
- # Returns the Avo resource by camelized name
31
- #
32
- # get_resource_by_name('User') => instance of UserResource
33
- def get_resource(resource)
34
- possible_resource = "#{resource}Resource".gsub "ResourceResource", "Resource"
35
-
36
- resources.find do |available_resource|
37
- possible_resource.to_s == available_resource.class.to_s
38
- end
39
- end
40
-
41
- # Returns the Avo resource by singular snake_cased name
42
- #
43
- # get_resource_by_name('user') => instance of UserResource
44
- def get_resource_by_name(name)
45
- get_resource name.singularize.camelize
46
- end
47
-
48
- # Returns the Avo resource by singular snake_cased name
49
- # From all the resources that use the same model_class, it will fetch the first one in alphabetical order
50
- #
51
- # get_resource_by_name('User') => instance of UserResource
52
- # get_resource_by_name(User) => instance of UserResource
53
-
54
- def get_resource_by_model_name(klass)
55
- # Fetch the mappings imposed by the user.
56
- # If they are present, use those ones.
57
- mapping = get_mapping_for_model klass
58
- return get_resource(mapping) if mapping.present?
59
-
60
- valid_resources
61
- .find do |resource|
62
- resource.model_class.model_name.name == klass.to_s
63
- end
64
- end
65
-
66
- # Returns the Avo resource by singular snake_cased name
67
- #
68
- # get_resource_by_controller_name('delayed_backend_active_record_jobs') => instance of DelayedJobResource
69
- # get_resource_by_controller_name('users') => instance of UserResource
70
- def get_resource_by_controller_name(name)
71
- valid_resources
72
- .find do |resource|
73
- resource.model_class.to_s.pluralize.underscore.tr("/", "_") == name.to_s
74
- end
75
- end
76
-
77
- # Returns the Avo resource by some name
78
- def guess_resource(name)
79
- get_resource_by_name(name.to_s) || get_resource_by_model_name(name)
80
- end
81
-
82
- # Returns the Rails model class by singular snake_cased name
83
- #
84
- # get_model_class_by_name('user') => User
85
- def get_model_class_by_name(name)
86
- name.to_s.camelize.singularize
87
- end
88
-
89
- def get_available_resources(user = nil)
90
- valid_resources
91
- .select do |resource|
92
- resource.authorization.class.authorize(
93
- user,
94
- resource.model_class,
95
- Avo.configuration.authorization_methods.stringify_keys["index"],
96
- raise_exception: false
97
- )
98
- end
99
- .sort_by { |r| r.name }
100
- end
101
-
102
- def get_available_dashboards(user = nil)
103
- dashboards.sort_by { |r| r.name }
104
- end
105
-
106
- def resources_for_navigation(user = nil)
107
- get_available_resources(current_user)
108
- .select do |resource|
109
- resource.visible_on_sidebar
110
- end
111
- end
112
-
113
- def dashboards_for_navigation(user = nil)
114
- return [] if App.license.lacks_with_trial(:resource_ordering)
115
-
116
- get_available_dashboards(user).select do |dashboard|
117
- dashboard.is_visible?
118
- end
119
- end
120
-
121
- # Insert any partials that we find in app/views/avo/sidebar/items.
122
- def get_sidebar_partials
123
- Dir.glob(Rails.root.join("app", "views", "avo", "sidebar", "items", "*.html.erb"))
124
- .map do |path|
125
- File.basename path
126
- end
127
- .map do |filename|
128
- # remove the leading underscore (_)
129
- filename[0] = ""
130
- # remove the extension
131
- filename.gsub!(".html.erb", "")
132
- filename
133
- end
134
- end
135
-
136
- def tools_for_navigation
137
- return [] if Avo::App.license.lacks_with_trial(:custom_tools)
138
-
139
- get_sidebar_partials
140
- end
141
-
142
- private
143
-
144
- def get_mapping_for_model(klass)
145
- (Avo.configuration.model_resource_mapping || {}).stringify_keys.transform_values(&:to_s)[klass.to_s]
146
- end
147
- end
148
- end
149
- end
150
- end
@@ -1,47 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module HandlesFieldArgs
4
- extend ActiveSupport::Concern
5
-
6
- private
7
-
8
- # Add an instance variable from args
9
- # That may be a string, boolean, or array
10
- # Each args should also have a default value
11
- def add_prop_from_args(args = {}, name: nil, type: :string, default: nil)
12
- value = default
13
-
14
- if type == :boolean
15
- case args[name.to_sym]
16
- when nil
17
- value = default
18
- when false
19
- value = false
20
- when true
21
- value = true
22
- end
23
- else
24
- value = args[name.to_sym] unless args.dig(name.to_sym).nil?
25
- end
26
-
27
- instance_variable_set(:"@#{name}", value)
28
- end
29
-
30
- def add_boolean_prop(args, name, default = false)
31
- add_prop_from_args args, name: name, default: default, type: :boolean
32
- end
33
-
34
- def add_array_prop(args, name, default = [])
35
- add_prop_from_args args, name: name, default: default, type: :array
36
- end
37
-
38
- def add_object_prop(args, name, default = {})
39
- add_prop_from_args args, name: name, default: default, type: :object
40
- end
41
-
42
- def add_string_prop(args, name, default = nil)
43
- add_prop_from_args args, name: name, default: default, type: :string
44
- end
45
- end
46
- end
47
- end
@@ -1,34 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module HasEditableControls
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_attribute :show_controls
8
- class_attribute :show_controls_holder
9
- class_attribute :show_controls_holder_called, default: false
10
- end
11
-
12
- def has_show_controls?
13
- return false if ::Avo::App.license.lacks_with_trial(:resource_show_controls)
14
-
15
- self.class.show_controls.present?
16
- end
17
-
18
- def render_show_controls
19
- return [] if ::Avo::App.license.lacks_with_trial(:resource_show_controls)
20
-
21
- if show_controls.present?
22
- Avo::Resources::Controls::ExecutionContext.new(
23
- block: show_controls,
24
- resource: self,
25
- record: model,
26
- view: view
27
- ).handle&.items || []
28
- else
29
- []
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,334 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module HasFields
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_attribute :items_holder
8
- class_attribute :items_index, default: 0
9
- class_attribute :tabs_holder
10
- class_attribute :tabs_tabs_holder
11
- class_attribute :raw_tabs
12
- class_attribute :tools_holder
13
- end
14
-
15
- class_methods do
16
- # DSL methods
17
- def field(name, **args, &block)
18
- ensure_items_holder_initialized
19
-
20
- items_holder.field name, **args, &block
21
- end
22
-
23
- def panel(name = nil, **args, &block)
24
- ensure_items_holder_initialized
25
-
26
- items_holder.panel name, **args, &block
27
- end
28
-
29
- def row(**args, &block)
30
- ensure_items_holder_initialized
31
-
32
- items_holder.row(**args, &block)
33
- end
34
-
35
- def tabs(**args, &block)
36
- ensure_items_holder_initialized
37
-
38
- items_holder.tabs Avo::TabGroupBuilder.parse_block(**args, &block)
39
- end
40
-
41
- def tool(klass, **args)
42
- ensure_items_holder_initialized
43
-
44
- items_holder.tool klass, **args
45
- end
46
-
47
- def heading(body, **args)
48
- ensure_items_holder_initialized
49
-
50
- items_holder.heading body, **args
51
- end
52
-
53
- def sidebar(**args, &block)
54
- ensure_items_holder_initialized
55
-
56
- items_holder.sidebar Avo::SidebarBuilder.parse_block(**args, &block)
57
- end
58
- # END DSL methods
59
-
60
- def items
61
- if items_holder.present?
62
- items_holder.items
63
- else
64
- []
65
- end
66
- end
67
-
68
- def tools
69
- tools_holder
70
- end
71
-
72
- # Dives deep into panels and tabs to fetch all the fields for a resource.
73
- def fields(only_root: false)
74
- fields = []
75
-
76
- items.each do |item|
77
- next if item.nil?
78
-
79
- unless only_root
80
- # Dive into panels to fetch their fields
81
- if item.is_panel?
82
- fields << extract_fields_from_items(item)
83
- end
84
-
85
- # Dive into tabs to fetch their fields
86
- if item.is_tab_group?
87
- item.items.map do |tab|
88
- fields << extract_fields_from_items(tab)
89
- end
90
- end
91
-
92
- # Dive into sidebar to fetch their fields
93
- if item.is_sidebar?
94
- fields << extract_fields_from_items(item)
95
- end
96
- end
97
-
98
- if item.is_field?
99
- fields << item
100
- end
101
-
102
- if item.is_row?
103
- fields << extract_fields_from_items(tab)
104
- end
105
- end
106
-
107
- fields.flatten
108
- end
109
-
110
- def tab_groups
111
- items.select do |item|
112
- item.instance_of? Avo::TabGroup
113
- end
114
- end
115
-
116
- private
117
-
118
- def extract_fields_from_items(thing)
119
- fields = []
120
-
121
- thing.items.each do |item|
122
- if item.is_field?
123
- fields << item
124
- elsif item.is_panel? || item.is_row?
125
- fields << extract_fields_from_items(item)
126
- end
127
- end
128
-
129
- fields
130
- end
131
-
132
- def ensure_items_holder_initialized
133
- self.items_holder ||= Avo::ItemsHolder.new
134
- end
135
-
136
- def add_to_fields(instance)
137
- self.items ||= []
138
- self.items << instance
139
- increment_order_index
140
- end
141
-
142
- def increment_order_index
143
- self.items_index += 1
144
- end
145
- end
146
-
147
- delegate :invalid_fields, to: :items_holder
148
- delegate :items, to: :items_holder
149
-
150
- def hydrate_fields(model: nil, view: nil)
151
- fields.map do |field|
152
- field.hydrate(model: @model, view: @view, resource: self)
153
- end
154
-
155
- self
156
- end
157
-
158
- def get_tabs
159
- tabs_holder
160
- end
161
-
162
- def fields(**args)
163
- self.class.fields(**args)
164
- end
165
-
166
- def tab_groups
167
- self.class.tab_groups
168
- end
169
-
170
- def get_field_definitions(only_root: false)
171
- fields = self.fields(only_root: only_root)
172
-
173
- return [] if fields.blank?
174
-
175
- fields.map do |field|
176
- field.hydrate(resource: self, user: user, view: view)
177
- end
178
- end
179
-
180
- def get_fields(panel: nil, reflection: nil, only_root: false)
181
- fields = get_field_definitions(only_root: only_root)
182
- .select do |field|
183
- field.visible_on?(view)
184
- end
185
- .select do |field|
186
- field.visible?
187
- end
188
- .select do |field|
189
- is_valid = true
190
-
191
- # Strip out the reflection field in index queries with a parent association.
192
- if reflection.present?
193
- # regular non-polymorphic association
194
- # we're matching the reflection inverse_of foriegn key with the field's foreign_key
195
- if field.is_a?(Avo::Fields::BelongsToField)
196
- if field.respond_to?(:foreign_key) &&
197
- reflection.inverse_of.present? &&
198
- reflection.inverse_of.respond_to?(:foreign_key) &&
199
- reflection.inverse_of.foreign_key == field.foreign_key
200
- is_valid = false
201
- end
202
-
203
- # polymorphic association
204
- if field.respond_to?(:foreign_key) &&
205
- field.is_polymorphic? &&
206
- reflection.respond_to?(:polymorphic?) &&
207
- reflection.inverse_of.respond_to?(:foreign_key) &&
208
- reflection.inverse_of.foreign_key == field.reflection.foreign_key
209
- is_valid = false
210
- end
211
- end
212
- end
213
-
214
- is_valid
215
- end
216
-
217
- if panel.present?
218
- fields = fields.select do |field|
219
- field.panel_name == panel
220
- end
221
- end
222
-
223
- hydrate_fields(model: @model, view: @view)
224
-
225
- fields
226
- end
227
-
228
- def get_field(id)
229
- get_field_definitions.find do |f|
230
- f.id == id.to_sym
231
- end
232
- end
233
-
234
- def tools
235
- check_license
236
-
237
- return [] if App.license.lacks_with_trial :resource_tools
238
- return [] if self.class.tools.blank?
239
-
240
- self.items
241
- .select do |item|
242
- next if item.nil?
243
-
244
- item.is_tool?
245
- end
246
- .map do |tool|
247
- tool.hydrate view: view
248
- tool
249
- end
250
- .select do |item|
251
- item.visible_on?(view)
252
- end
253
- end
254
-
255
- # Separates the fields that are in a panel and those that are just hanging out.
256
- # Take the ones that aren't placed into a panel and add them to the "default" panel.
257
- # This is to keep compatibility with the versions before 2.10 when you didn't have the ability to add fields to panels.
258
- def get_items
259
- panelless_items = []
260
- panelfull_items = []
261
-
262
- items.each do |item|
263
- if item.respond_to? :hydrate
264
- item.hydrate(view: view)
265
- end
266
-
267
- # fields and tabs can be hidden on some views
268
- if item.respond_to? :visible_on?
269
- next unless item.visible_on?(view)
270
- end
271
- # each field has it's own visibility checker
272
- if item.respond_to? :visible?
273
- item.hydrate(view: view) if item.view.nil?
274
-
275
- next unless item.visible?
276
- end
277
- # check if the user is authorized to view it
278
- if item.respond_to? :authorized?
279
- next unless item.hydrate(model: @model).authorized?
280
- end
281
-
282
- if item.is_field?
283
- if item.has_own_panel?
284
- panelfull_items << item
285
- else
286
- panelless_items << item
287
- end
288
- else
289
- panelfull_items << item
290
- end
291
- end
292
-
293
- # Make sure all tabs panelfull_items are setted as inside tabs
294
- panelfull_items.grep(Avo::TabGroup).each do |tab_group|
295
- tab_group.items.grep(Avo::Tab).each do |tab|
296
- tab.items.grep(Avo::Panel).each do |panel|
297
- set_target_to_top panel.items.grep(Avo::Fields::BelongsToField)
298
-
299
- panel.items.grep(Avo::Row).each do |row|
300
- set_target_to_top row.items.grep(Avo::Fields::BelongsToField)
301
- end
302
- end
303
- end
304
- end
305
-
306
- # Add all the panelles fields to a new panel
307
- main_panel_holder = Avo::ItemsHolder.new
308
- main_panel_holder.items = panelless_items
309
-
310
- # Add that panel to the main panel
311
- main_panel = Avo::MainPanel.new
312
- main_panel.items_holder = main_panel_holder
313
-
314
- # Return all the items but this time with all the panelless ones inside the main panel
315
- [main_panel, *panelfull_items]
316
- end
317
-
318
- private
319
-
320
- def set_target_to_top(fields)
321
- fields.each do |field|
322
- field.target = :_top
323
- end
324
- end
325
-
326
- def check_license
327
- if !Rails.env.production? && App.license.present? && App.license.lacks(:resource_tools)
328
- # Add error message to let the developer know the resource tool will not be available in a production environment.
329
- Avo::App.error_messages.push "Warning: Your license is invalid or doesn't support resource tools. The resource tools will not be visible in a production environment."
330
- end
331
- end
332
- end
333
- end
334
- end
@@ -1,108 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module HasHTMLAttributes
4
- extend ActiveSupport::Concern
5
-
6
- attr_reader :html
7
-
8
- # Used to get attributes for elements and views
9
- #
10
- # examples:
11
- # get_html :data, view: :edit, element: :input
12
- # get_html :classes, view: :show, element: :wrapper
13
- # get_html :styles, view: :index, element: :wrapper
14
- def get_html(name = nil, element:, view:)
15
- if [view, element].any?(&:nil?) || Avo::App.license.lacks_with_trial(:stimulus_js_integration)
16
- default_attribute_value name
17
- end
18
-
19
- parsed = parse_html
20
-
21
- attributes = if parsed.is_a? Hash
22
- get_html_from_hash name, element: element, hash: parsed, view: view
23
- elsif parsed.is_a? Avo::HTML::Builder
24
- get_html_from_block name, element: element, html_builder: parsed, view: view
25
- elsif parsed.nil?
26
- # Handle empty parsed by returning an empty state
27
- default_attribute_value name
28
- end
29
-
30
- add_default_data_attributes attributes, name, element, view
31
- end
32
-
33
- private
34
-
35
- # Returns Hash, HTML::Builder, or nil.
36
- def parse_html
37
- return if @html.nil?
38
-
39
- if @html.is_a? Hash
40
- @html
41
- elsif @html.respond_to? :call
42
- Avo::HTML::Builder.parse_block(record: model, resource: resource, &@html)
43
- end
44
- end
45
-
46
- def default_attribute_value(name)
47
- name == :data ? {} : ""
48
- end
49
-
50
- def add_default_data_attributes(attributes, name, element, view)
51
- if !attributes.nil? && name == :data && element == :input && view.in?([:edit, :new]) && resource.present? && resource.respond_to?(:get_stimulus_controllers)
52
- extra_attributes = resource.get_stimulus_controllers
53
- .split(" ")
54
- .map do |controller|
55
- [:"#{controller}-target", "#{id.to_s.underscore}_#{type.to_s.underscore}_input".camelize(:lower)]
56
- end
57
- .to_h
58
-
59
- attributes.merge extra_attributes
60
- else
61
- attributes
62
- end
63
- end
64
-
65
- def get_html_from_block(name = nil, element:, html_builder:, view:)
66
- values = []
67
-
68
- # get view ancestor
69
- values << html_builder.dig_stack(view, element, name)
70
- # get element ancestor
71
- values << html_builder.dig_stack(element, name)
72
- # get direct ancestor
73
- values << html_builder.dig_stack(name)
74
-
75
- values_type = if name == :data
76
- :hash
77
- else
78
- :string
79
- end
80
-
81
- merge_values_as(as: values_type, values: values)
82
- end
83
-
84
- def get_html_from_hash(name = nil, element:, hash:, view:)
85
- # @todo: what if this is not a Hash but a string?
86
- hash.dig(view, element, name) || {}
87
- end
88
-
89
- # Merge the values from all possible locations.
90
- # If the result is "blank", return nil so the attributes are not outputted to the DOM.
91
- #
92
- # Ex: if the style attribute is empty return `nil` instead of an empty space `" "`
93
- def merge_values_as(as: :array, values: [])
94
- result = if as == :array
95
- values.flatten
96
- elsif as == :string
97
- values.select do |value|
98
- value.is_a? String
99
- end.join " "
100
- elsif as == :hash
101
- values.reduce({}, :merge)
102
- end
103
-
104
- result if result.present?
105
- end
106
- end
107
- end
108
- end
@@ -1,31 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module PolicyHelpers
4
- extend ActiveSupport::Concern
5
-
6
- class_methods do
7
- def inherit_association_from_policy(association_name, policy_class)
8
- [:create, :edit, :update, :destroy, :show, :reorder, :act_on].each do |method_action|
9
- define_policy_method(method_action, association_name, policy_class)
10
- end
11
-
12
- define_policy_method("view", association_name, policy_class, "index")
13
- end
14
-
15
- private
16
-
17
- # Define a method for the given action and association name.
18
- # Call the policy class with the given action passing the user and record.
19
- # Example:
20
- # def create_team_members?
21
- # TeamMemberPolicy.new(user, record).create?
22
- # end
23
- def define_policy_method(method_action, association_name, policy_class, policy_action = method_action)
24
- define_method "#{method_action}_#{association_name}?" do
25
- policy_class.new(user, record).send "#{policy_action}?"
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end