avo 2.46.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 (409) 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 +12 -29
  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 +10 -6
  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 -67
  157. data/lib/avo/base_resource.rb +286 -226
  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/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  169. data/lib/avo/concerns/hydration.rb +17 -0
  170. data/lib/avo/concerns/is_resource_item.rb +16 -36
  171. data/lib/avo/concerns/is_visible.rb +15 -0
  172. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  173. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  174. data/lib/avo/concerns/visible_items.rb +7 -38
  175. data/lib/avo/configuration/branding.rb +0 -12
  176. data/lib/avo/configuration.rb +28 -11
  177. data/lib/avo/current.rb +39 -0
  178. data/lib/avo/dsl/field_parser.rb +3 -3
  179. data/lib/avo/dynamic_router.rb +18 -3
  180. data/lib/avo/engine.rb +35 -30
  181. data/lib/avo/error_manager.rb +25 -0
  182. data/lib/avo/execution_context.rb +14 -15
  183. data/lib/avo/fields/base_field.rb +84 -122
  184. data/lib/avo/fields/belongs_to_field.rb +19 -23
  185. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  186. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  187. data/lib/avo/fields/concerns/has_default.rb +1 -5
  188. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  189. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  190. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  191. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  192. data/lib/avo/fields/concerns/is_required.rb +5 -7
  193. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  194. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  195. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  196. data/lib/avo/fields/country_field.rb +4 -0
  197. data/lib/avo/fields/date_time_field.rb +1 -5
  198. data/lib/avo/fields/external_image_field.rb +2 -2
  199. data/lib/avo/fields/field_manager.rb +55 -0
  200. data/lib/avo/fields/file_field.rb +2 -2
  201. data/lib/avo/fields/gravatar_field.rb +2 -2
  202. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  203. data/lib/avo/fields/has_base_field.rb +21 -17
  204. data/lib/avo/fields/has_many_field.rb +5 -2
  205. data/lib/avo/fields/has_one_field.rb +8 -12
  206. data/lib/avo/fields/heading_field.rb +9 -14
  207. data/lib/avo/fields/hidden_field.rb +1 -1
  208. data/lib/avo/fields/id_field.rb +3 -3
  209. data/lib/avo/fields/location_field.rb +10 -10
  210. data/lib/avo/fields/password_field.rb +1 -1
  211. data/lib/avo/fields/preview_field.rb +14 -0
  212. data/lib/avo/fields/select_field.rb +12 -8
  213. data/lib/avo/fields/status_field.rb +7 -1
  214. data/lib/avo/fields/text_field.rb +2 -2
  215. data/lib/avo/filters/base_filter.rb +9 -4
  216. data/lib/avo/html/builder.rb +8 -8
  217. data/lib/avo/item_grapher.rb +78 -0
  218. data/lib/avo/licensing/h_q.rb +11 -73
  219. data/lib/avo/licensing/license.rb +5 -1
  220. data/lib/avo/licensing/license_manager.rb +1 -1
  221. data/lib/avo/licensing/pro_license.rb +1 -7
  222. data/lib/avo/loaders/fields_loader.rb +7 -1
  223. data/lib/avo/plugin.rb +36 -0
  224. data/lib/avo/plugin_manager.rb +56 -0
  225. data/lib/avo/prefixed_test_helpers.rb +20 -0
  226. data/lib/avo/reloader.rb +3 -0
  227. data/lib/avo/resources/controls/actions_list.rb +7 -12
  228. data/lib/avo/resources/controls/attach_button.rb +15 -0
  229. data/lib/avo/resources/controls/back_button.rb +1 -1
  230. data/lib/avo/resources/controls/base_control.rb +15 -49
  231. data/lib/avo/resources/controls/create_button.rb +15 -0
  232. data/lib/avo/resources/controls/delete_button.rb +5 -1
  233. data/lib/avo/resources/controls/detach_button.rb +4 -1
  234. data/lib/avo/resources/controls/edit_button.rb +4 -1
  235. data/lib/avo/resources/controls/order_controls.rb +8 -0
  236. data/lib/avo/resources/controls/save_button.rb +13 -0
  237. data/lib/avo/resources/controls/show_button.rb +15 -0
  238. data/lib/avo/resources/items/holder.rb +96 -0
  239. data/lib/avo/resources/items/item_group.rb +44 -0
  240. data/lib/avo/resources/items/main_panel.rb +12 -0
  241. data/lib/avo/resources/items/panel.rb +2 -0
  242. data/lib/avo/resources/items/row.rb +42 -0
  243. data/lib/avo/resources/items/sidebar.rb +46 -0
  244. data/lib/avo/resources/items/tab.rb +54 -0
  245. data/lib/avo/resources/items/tab_group.rb +62 -0
  246. data/lib/avo/resources/resource_manager.rb +179 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +93 -0
  249. data/lib/avo/services/encryption_service.rb +8 -12
  250. data/lib/avo/services/telemetry_service.rb +85 -0
  251. data/lib/avo/test_helpers.rb +362 -0
  252. data/lib/avo/tools/tool_manager.rb +30 -0
  253. data/lib/avo/version.rb +1 -1
  254. data/lib/avo/view_inquirer.rb +36 -0
  255. data/lib/avo.rb +109 -24
  256. data/lib/generators/avo/action_generator.rb +8 -8
  257. data/lib/generators/avo/card_generator.rb +27 -0
  258. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  259. data/lib/generators/avo/controller_generator.rb +3 -0
  260. data/lib/generators/avo/eject_generator.rb +180 -15
  261. data/lib/generators/avo/field_generator.rb +49 -2
  262. data/lib/generators/avo/filter_generator.rb +8 -8
  263. data/lib/generators/avo/js/install_generator.rb +2 -2
  264. data/lib/generators/avo/resource_generator.rb +12 -9
  265. data/lib/generators/avo/scope_generator.rb +15 -0
  266. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  267. data/lib/generators/avo/templates/action.tt +8 -6
  268. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  269. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  270. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  271. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  272. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  273. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  274. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  275. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  276. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  277. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  278. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  279. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  280. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  281. data/lib/generators/avo/templates/locales/avo.ar.yml +1 -0
  282. data/lib/generators/avo/templates/locales/avo.en.yml +4 -3
  283. data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
  284. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
  285. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
  286. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
  287. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
  288. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
  289. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -5
  290. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -0
  291. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  292. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  293. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  294. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  295. data/lib/generators/avo/templates/scope.tt +6 -0
  296. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  297. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  298. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  299. data/lib/tasks/avo_tasks.rake +72 -4
  300. data/public/avo-assets/avo.base.css +1893 -1187
  301. data/public/avo-assets/avo.base.js +217 -305
  302. data/public/avo-assets/avo.base.js.map +3 -3
  303. data/public/avo-assets/avo.css +9744 -0
  304. data/public/avo-assets/avo.js +513 -0
  305. data/public/avo-assets/avo.js.map +7 -0
  306. data/tailwind.custom.js +47 -0
  307. data/tailwind.preset.js +152 -0
  308. metadata +106 -116
  309. data/app/components/avo/card_component.html.erb +0 -46
  310. data/app/components/avo/card_component.rb +0 -25
  311. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  312. data/app/components/avo/dashboards/divider_component.rb +0 -19
  313. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  314. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  315. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  316. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  317. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  318. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  319. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  320. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  321. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  322. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  323. data/app/components/avo/index/ordering/base_component.rb +0 -9
  324. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  325. data/app/components/avo/index/ordering/button_component.rb +0 -23
  326. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  327. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  328. data/app/components/avo/item_switcher_component.html.erb +0 -27
  329. data/app/components/avo/item_switcher_component.rb +0 -48
  330. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  331. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  332. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  333. data/app/controllers/avo/dashboards_controller.rb +0 -22
  334. data/app/controllers/avo/reorder_controller.rb +0 -25
  335. data/app/javascript/js/controllers/base_controller.js +0 -22
  336. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  337. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  338. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  339. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  340. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  341. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  342. data/app/views/avo/dashboards/show.html.erb +0 -38
  343. data/app/views/avo/partials/_global_search.html.erb +0 -19
  344. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  345. data/lib/avo/app.rb +0 -237
  346. data/lib/avo/base_card.rb +0 -161
  347. data/lib/avo/concerns/fetches_things.rb +0 -150
  348. data/lib/avo/concerns/handles_field_args.rb +0 -47
  349. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  350. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  351. data/lib/avo/concerns/has_fields.rb +0 -334
  352. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  353. data/lib/avo/concerns/policy_helpers.rb +0 -31
  354. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  355. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  356. data/lib/avo/dashboards/base_divider.rb +0 -35
  357. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  358. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  359. data/lib/avo/dashboards/metric_card.rb +0 -9
  360. data/lib/avo/dashboards/partial_card.rb +0 -7
  361. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  362. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  363. data/lib/avo/fields/tags_field.rb +0 -102
  364. data/lib/avo/grid_collector.rb +0 -42
  365. data/lib/avo/hosts/association_scope_host.rb +0 -8
  366. data/lib/avo/hosts/base_host.rb +0 -25
  367. data/lib/avo/hosts/card_visibility.rb +0 -20
  368. data/lib/avo/hosts/dashboard_card.rb +0 -22
  369. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  370. data/lib/avo/hosts/ordering.rb +0 -22
  371. data/lib/avo/hosts/record_host.rb +0 -7
  372. data/lib/avo/hosts/resource_record_host.rb +0 -7
  373. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  374. data/lib/avo/hosts/search_scope_host.rb +0 -7
  375. data/lib/avo/hosts/view_record_host.rb +0 -7
  376. data/lib/avo/hosts/visibility_host.rb +0 -12
  377. data/lib/avo/items_holder.rb +0 -96
  378. data/lib/avo/main_panel.rb +0 -3
  379. data/lib/avo/menu/base_item.rb +0 -25
  380. data/lib/avo/menu/builder.rb +0 -82
  381. data/lib/avo/menu/dashboard.rb +0 -22
  382. data/lib/avo/menu/group.rb +0 -2
  383. data/lib/avo/menu/link.rb +0 -6
  384. data/lib/avo/menu/menu.rb +0 -2
  385. data/lib/avo/menu/resource.rb +0 -22
  386. data/lib/avo/menu/section.rb +0 -2
  387. data/lib/avo/panel.rb +0 -24
  388. data/lib/avo/panel_builder.rb +0 -25
  389. data/lib/avo/resources/controls/action.rb +0 -38
  390. data/lib/avo/resources/controls/execution_context.rb +0 -58
  391. data/lib/avo/resources/controls/items_holder.rb +0 -19
  392. data/lib/avo/resources/controls/link_to.rb +0 -27
  393. data/lib/avo/row.rb +0 -26
  394. data/lib/avo/row_builder.rb +0 -24
  395. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  396. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  397. data/lib/avo/sidebar.rb +0 -30
  398. data/lib/avo/sidebar_builder.rb +0 -24
  399. data/lib/avo/tab.rb +0 -72
  400. data/lib/avo/tab_builder.rb +0 -25
  401. data/lib/avo/tab_group.rb +0 -42
  402. data/lib/avo/tab_group_builder.rb +0 -43
  403. data/lib/avo/tools_manager.rb +0 -11
  404. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  405. data/lib/generators/avo/card/metric_generator.rb +0 -18
  406. data/lib/generators/avo/card/partial_generator.rb +0 -19
  407. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  408. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  409. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -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
@@ -1,31 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module VisibleInDashboard
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_attribute :visible, default: true
8
- end
9
-
10
- def is_visible?
11
- # Default is true
12
- return true if visible == true
13
-
14
- # Hide if false
15
- return false if visible == false
16
-
17
- if visible.respond_to? :call
18
- call_block
19
- end
20
- end
21
-
22
- def is_hidden?
23
- !is_visible?
24
- end
25
-
26
- def call_block
27
- ::Avo::Hosts::DashboardVisibility.new(block: visible, dashboard: self).handle
28
- end
29
- end
30
- end
31
- end
@@ -1,89 +0,0 @@
1
- module Avo
2
- module Dashboards
3
- class BaseDashboard
4
- # TODO: convert the dashboards from classes to instances.
5
- extend Avo::Concerns::VisibleInDashboard
6
- extend ActiveSupport::DescendantsTracker
7
-
8
- class_attribute :id
9
- class_attribute :name
10
- class_attribute :description
11
- class_attribute :items_holder
12
- class_attribute :grid_cols, default: 3
13
- # TODO: remove this when you make the conversion.
14
- class_attribute :visible, default: true
15
- class_attribute :index, default: 0
16
- class_attribute :authorize, default: -> { true }
17
-
18
- class << self
19
- def options_deprecation_message
20
- Rails.logger.warn "DEPRECATION WARNING: Card options parameter is deprecated in favor of arguments parameter and will be removed from Avo version 3.0.0"
21
- end
22
-
23
- def card(klass, label: nil, description: nil, cols: nil, rows: nil, refresh_every: nil, options: {}, arguments: {}, visible: nil)
24
- options_deprecation_message if options.present?
25
- self.items_holder ||= []
26
-
27
- self.items_holder << klass.new(
28
- dashboard: self,
29
- label: label,
30
- description: description,
31
- cols: cols,
32
- rows: rows,
33
- refresh_every: refresh_every,
34
- options: options,
35
- arguments: arguments,
36
- index: index,
37
- visible: visible
38
- )
39
- self.index += 1
40
- end
41
-
42
- def item_at_index(index)
43
- items.find do |item|
44
- next if item.index.blank?
45
-
46
- item.index == index
47
- end
48
- end
49
-
50
- def divider(**args)
51
- self.items_holder ||= []
52
-
53
- self.items_holder << BaseDivider.new(dashboard: self, **args)
54
- end
55
-
56
- def items
57
- items = self.items_holder || []
58
-
59
- items.filter do |item|
60
- item.is_visible?
61
- end
62
- end
63
-
64
- def classes
65
- case grid_cols
66
- when 3
67
- "sm:grid-cols-3"
68
- when 4
69
- "sm:grid-cols-4"
70
- when 5
71
- "sm:grid-cols-5"
72
- when 6
73
- "sm:grid-cols-6"
74
- else
75
- "sm:grid-cols-3"
76
- end
77
- end
78
-
79
- def navigation_label
80
- name
81
- end
82
-
83
- def navigation_path
84
- Avo::App.view_context.avo.dashboard_path id
85
- end
86
- end
87
- end
88
- end
89
- end
@@ -1,35 +0,0 @@
1
- module Avo
2
- module Dashboards
3
- class BaseDivider
4
- include Avo::Concerns::VisibleInDashboard
5
-
6
- attr_reader :dashboard
7
- attr_reader :label
8
- attr_reader :invisible
9
- attr_reader :index
10
- attr_reader :visible
11
-
12
- class_attribute :id
13
-
14
- def initialize(dashboard: nil, label: nil, invisible: false, index: nil, visible: true)
15
- @dashboard = dashboard
16
- @label = label
17
- @invisible = invisible
18
- @index = index
19
- @visible = visible
20
- end
21
-
22
- def is_divider?
23
- true
24
- end
25
-
26
- def is_card?
27
- false
28
- end
29
-
30
- def call_block
31
- ::Avo::Hosts::CardVisibility.new(block: visible, card: self, parent: dashboard).handle
32
- end
33
- end
34
- end
35
- end
@@ -1,77 +0,0 @@
1
- module Avo
2
- module Dashboards
3
- class ChartkickCard < BaseCard
4
- class_attribute :chart_type
5
- class_attribute :chart_options, default: {}
6
- class_attribute :flush, default: true
7
- class_attribute :legend, default: false
8
- class_attribute :scale, default: false
9
- class_attribute :legend_on_left, default: false
10
- class_attribute :legend_on_right, default: false
11
-
12
- def chartkick_classes
13
- case chart_type
14
- when :area_chart, :line_chart, :scatter_chart, :bar_chart, :column_chart
15
- if self.class.flush
16
- "-mx-1.5 top-auto -bottom-1.5"
17
- else
18
- "px-2"
19
- end
20
- else
21
- ""
22
- end
23
- end
24
-
25
- def chartkick_options
26
- card_height = 144
27
- card_heading = 40
28
-
29
- default = {
30
- # figure our the available height for the chart
31
- height: "#{(rows * card_height) - card_heading}px",
32
- colors: ::Avo.configuration.branding.chart_colors,
33
- library: {
34
- discrete: false,
35
- points: false,
36
- animation: true
37
- },
38
- id: "#{dashboard.id}-#{rand(10_000..99_999)}"
39
- }
40
-
41
- no_scale_options = {display: false}
42
- no_scale = {
43
- library: {
44
- scales: {
45
- x: no_scale_options,
46
- y: no_scale_options
47
- }
48
- }
49
- }
50
-
51
- no_legend = {library: {plugins: {legend: {display: false}}}}
52
- legend_on_left = {library: {plugins: {legend: {position: "left"}}}}
53
- legend_on_right = {library: {plugins: {legend: {position: "right"}}}}
54
-
55
- # Add chart.js configuration for the different states
56
- unless self.class.legend
57
- default = default.deep_merge(no_legend)
58
- end
59
-
60
- unless self.class.scale
61
- default = default.deep_merge(no_scale)
62
- end
63
-
64
- if self.class.legend_on_left
65
- default = default.deep_merge(legend_on_left)
66
- end
67
-
68
- if self.class.legend_on_right
69
- default = default.deep_merge(legend_on_right)
70
- end
71
-
72
- # Add the custom chart options at the end
73
- default.deep_merge(self.class.chart_options)
74
- end
75
- end
76
- end
77
- end
@@ -1,6 +0,0 @@
1
- module Avo
2
- module Dashboards
3
- class DashboardCard < Avo::BaseCard
4
- end
5
- end
6
- end
@@ -1,9 +0,0 @@
1
- module Avo
2
- module Dashboards
3
- class MetricCard < BaseCard
4
- class_attribute :prefix
5
- class_attribute :suffix
6
- # @todo: transform 1234 to 1.2K
7
- end
8
- end
9
- end
@@ -1,7 +0,0 @@
1
- module Avo
2
- module Dashboards
3
- class PartialCard < Avo::BaseCard
4
- class_attribute :partial
5
- end
6
- end
7
- end
@@ -1,19 +0,0 @@
1
- module Avo
2
- module Fields
3
- module FieldExtensions
4
- module HasFieldName
5
- # Set the field name
6
- def field_name(name)
7
- self.field_name_attribute = name
8
- end
9
-
10
- # Get the field name
11
- def get_field_name
12
- return field_name_attribute if field_name_attribute.present?
13
-
14
- to_s.demodulize.underscore.gsub "_field", ""
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,111 +0,0 @@
1
- module Avo
2
- module Fields
3
- module FieldExtensions
4
- module VisibleInDifferentViews
5
- attr_accessor :show_on_index
6
- attr_accessor :show_on_show
7
- attr_accessor :show_on_new
8
- attr_accessor :show_on_edit
9
-
10
- def initialize(id = nil, **args, &block)
11
- @show_on_index = @show_on_index.nil? ? true : @show_on_index
12
- @show_on_show = @show_on_show.nil? ? true : @show_on_show
13
- @show_on_new = @show_on_new.nil? ? true : @show_on_new
14
- @show_on_edit = @show_on_edit.nil? ? true : @show_on_edit
15
- end
16
-
17
- # Validates if the field is visible on certain view
18
- def visible_on?(view)
19
- raise "No view specified on visibility check." if view.blank?
20
-
21
- send :"show_on_#{view}"
22
- end
23
-
24
- def show_on(*where)
25
- return show_on_all if where.include? :all
26
-
27
- normalize_views(where).flatten.each do |view|
28
- show_on_view view
29
- end
30
- end
31
-
32
- def hide_on(*where)
33
- return hide_on_all if where.include? :all
34
-
35
- normalize_views(where).flatten.each do |view|
36
- hide_on_view view
37
- end
38
- end
39
-
40
- def only_on(*where)
41
- hide_on_all
42
- normalize_views(where).flatten.each do |view|
43
- show_on_view view
44
- end
45
- end
46
-
47
- def except_on(*where)
48
- show_on_all
49
- normalize_views(where).flatten.each do |view|
50
- hide_on_view view
51
- end
52
- end
53
-
54
- # When submitting the form on creation, the new page will be create but we don't have a visibility marker for create so we'll default to new
55
- def show_on_create
56
- show_on_new
57
- end
58
-
59
- # When submitting the form on update, the new page will be create but we don't have a visibility marker for update so we'll default to edit
60
- def show_on_update
61
- show_on_edit
62
- end
63
-
64
- private
65
-
66
- def show_on_view(view)
67
- send("show_on_#{view}=", true)
68
- end
69
-
70
- def hide_on_view(view)
71
- send("show_on_#{view}=", false)
72
- end
73
-
74
- def only_on_view(view)
75
- hide_on_all
76
- show_on_view view
77
- end
78
-
79
- def except_on_view(view)
80
- show_on_all
81
- hide_on_view view
82
- end
83
-
84
- def show_on_all
85
- @show_on_index = true
86
- @show_on_show = true
87
- @show_on_edit = true
88
- @show_on_new = true
89
- end
90
-
91
- def hide_on_all
92
- @show_on_index = false
93
- @show_on_show = false
94
- @show_on_edit = false
95
- @show_on_new = false
96
- end
97
-
98
- def normalize_views(*views_and_groups)
99
- forms = views_and_groups.flatten! & [:forms]
100
-
101
- if forms.present?
102
- views_and_groups -= forms
103
- views_and_groups += [:new, :edit]
104
- end
105
-
106
- views_and_groups.flatten.uniq
107
- end
108
- end
109
- end
110
- end
111
- end
@@ -1,102 +0,0 @@
1
- module Avo
2
- module Fields
3
- class TagsField < BaseField
4
- attr_reader :acts_as_taggable_on
5
- attr_reader :close_on_select
6
- attr_reader :delimiters
7
- attr_reader :enforce_suggestions
8
- attr_reader :suggestions_max_items
9
- attr_reader :mode
10
-
11
- def initialize(id, **args, &block)
12
- super(id, **args, &block)
13
-
14
- add_boolean_prop args, :close_on_select
15
- add_boolean_prop args, :enforce_suggestions
16
- add_string_prop args, :acts_as_taggable_on
17
- add_array_prop args, :disallowed
18
- add_array_prop args, :delimiters, [","]
19
- add_array_prop args, :suggestions
20
- add_string_prop args, :suggestions_max_items
21
- add_string_prop args, :mode, nil
22
- add_string_prop args, :fetch_values_from
23
- add_string_prop args, :fetch_labels
24
- end
25
-
26
- def field_value
27
- return fetched_labels if @fetch_labels.present?
28
-
29
- return json_value if acts_as_taggable_on.present?
30
-
31
- value || []
32
- end
33
-
34
- def json_value
35
- value.map do |item|
36
- {
37
- value: item.name
38
- }
39
- end.as_json
40
- end
41
-
42
- def fill_field(model, key, value, params)
43
- if acts_as_taggable_on.present?
44
- model.send(act_as_taggable_attribute(key), value)
45
- else
46
- val = if value.is_a?(String)
47
- value.split(",")
48
- elsif value.is_a?(Array)
49
- value
50
- else
51
- value
52
- end
53
- model.send("#{key}=", val)
54
- end
55
-
56
- model
57
- end
58
-
59
- def suggestions
60
- return @suggestions if @suggestions.is_a? Array
61
-
62
- if @suggestions.respond_to? :call
63
- return Avo::Hosts::RecordHost.new(block: @suggestions, record: model).handle
64
- end
65
-
66
- []
67
- end
68
-
69
- def disallowed
70
- return @disallowed if @disallowed.is_a? Array
71
-
72
- if @disallowed.respond_to? :call
73
- return Avo::Hosts::RecordHost.new(block: @disallowed, record: model).handle
74
- end
75
-
76
- []
77
- end
78
-
79
- def fetch_values_from
80
- if @fetch_values_from.respond_to?(:call)
81
- Avo::Hosts::ResourceRecordHost.new(block: @fetch_values_from, resource: resource, record: model).handle
82
- else
83
- @fetch_values_from
84
- end
85
- end
86
-
87
- private
88
-
89
- def fetched_labels
90
- if @fetch_labels.respond_to?(:call)
91
- Avo::Hosts::ResourceRecordHost.new(block: @fetch_labels, resource: resource, record: model).handle
92
- else
93
- @fetch_labels
94
- end
95
- end
96
-
97
- def act_as_taggable_attribute(key)
98
- "#{key.singularize}_list="
99
- end
100
- end
101
- end
102
- end
@@ -1,42 +0,0 @@
1
- module Avo
2
- class GridCollector
3
- include Avo::Concerns::HasFields
4
-
5
- attr_accessor :cover_field
6
- attr_accessor :title_field
7
- attr_accessor :body_field
8
-
9
- def initialize
10
- @cover_field = nil
11
- @title_field = nil
12
- @body_field = nil
13
- end
14
-
15
- def cover(field_name, as:, **args, &block)
16
- field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, order_index: items_index, **args, &block).parse
17
- self.cover_field = field_parser.instance if field_parser.valid?
18
- end
19
-
20
- def title(field_name, as:, **args, &block)
21
- field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, order_index: items_index, **args, &block).parse
22
- self.title_field = field_parser.instance if field_parser.valid?
23
- end
24
-
25
- def body(field_name, as:, **args, &block)
26
- field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, order_index: items_index, **args, &block).parse
27
- self.body_field = field_parser.instance if field_parser.valid?
28
- end
29
-
30
- def hydrate(model:, view:, resource:)
31
- cover_field.hydrate(model: model, view: view, resource: resource) if cover_field.present?
32
- title_field.hydrate(model: model, view: view, resource: resource) if title_field.present?
33
- body_field.hydrate(model: model, view: view, resource: resource) if body_field.present?
34
-
35
- self
36
- end
37
-
38
- def blank?
39
- title_field.blank?
40
- end
41
- end
42
- end
@@ -1,8 +0,0 @@
1
- module Avo
2
- module Hosts
3
- class AssociationScopeHost < BaseHost
4
- option :parent
5
- option :query
6
- end
7
- end
8
- end
@@ -1,25 +0,0 @@
1
- require "dry-initializer"
2
-
3
- # This object holds some data that is usually needed to compute blocks around the app.
4
- module Avo
5
- module Hosts
6
- class BaseHost
7
- extend Dry::Initializer
8
-
9
- option :context, default: proc { Avo::App.context }
10
- option :params, default: proc { Avo::App.params }
11
- option :view_context, default: proc { Avo::App.view_context }
12
- option :current_user, default: proc { Avo::App.current_user }
13
- option :main_app, default: proc { view_context.main_app }
14
- option :avo, default: proc { view_context.avo }
15
- # This is optional because we might instantiate the `Host` first and later hydrate it with a block.
16
- option :block, optional: true
17
-
18
- delegate :authorize, to: Avo::Services::AuthorizationService
19
-
20
- def handle
21
- instance_exec(&block)
22
- end
23
- end
24
- end
25
- end
@@ -1,20 +0,0 @@
1
- require "dry-initializer"
2
-
3
- module Avo
4
- module Hosts
5
- class CardVisibility
6
- extend Dry::Initializer
7
-
8
- option :block, default: proc { proc {} }
9
- option :current_user, default: proc { ::Avo::App.current_user }
10
- option :context, default: proc { ::Avo::App.context }
11
- option :parent
12
- option :card
13
- option :params, default: proc { ::Avo::App.params }
14
-
15
- def handle
16
- instance_exec(&block)
17
- end
18
- end
19
- end
20
- end
@@ -1,22 +0,0 @@
1
- require "dry-initializer"
2
-
3
- module Avo
4
- module Hosts
5
- class DashboardCard
6
- extend Dry::Initializer
7
-
8
- option :context
9
- option :range
10
- option :dashboard
11
- option :card
12
- option :params
13
- option :options
14
-
15
- delegate :result, to: :card
16
-
17
- def compute_result
18
- instance_exec(&card.query_block)
19
- end
20
- end
21
- end
22
- end
@@ -1,19 +0,0 @@
1
- require "dry-initializer"
2
-
3
- module Avo
4
- module Hosts
5
- class DashboardVisibility
6
- extend Dry::Initializer
7
-
8
- option :block, default: proc { proc {} }
9
- option :current_user, default: proc { ::Avo::App.current_user }
10
- option :context, default: proc { ::Avo::App.context }
11
- option :dashboard
12
- option :params, default: proc { ::Avo::App.params }
13
-
14
- def handle
15
- instance_exec(&block)
16
- end
17
- end
18
- end
19
- end
@@ -1,22 +0,0 @@
1
- require "dry-initializer"
2
-
3
- module Avo
4
- module Hosts
5
- class Ordering
6
- extend Dry::Initializer
7
-
8
- option :options, default: proc { {} }
9
- option :resource
10
- option :record, default: proc { resource.model }
11
- option :params, default: proc { resource.params }
12
-
13
- def order(direction)
14
- action = options.dig(:actions, direction.to_sym)
15
-
16
- if action.present?
17
- instance_exec(&action)
18
- end
19
- end
20
- end
21
- end
22
- end