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,127 +0,0 @@
1
- import { first, isObject, merge } from 'lodash'
2
- import Tagify from '@yaireo/tagify'
3
- import URI from 'urijs'
4
-
5
- import { suggestionItemTemplate, tagTemplate } from './tags_field_helpers'
6
- import BaseController from '../base_controller'
7
- import debouncePromise from '../../helpers/debounce_promise'
8
-
9
- export default class extends BaseController {
10
- static targets = ['input', 'fakeInput'];
11
-
12
- static values = {
13
- whitelistItems: { type: Array, default: [] },
14
- disallowedItems: { type: Array, default: [] },
15
- enforceSuggestions: { type: Boolean, default: false },
16
- closeOnSelect: { type: Boolean, default: false },
17
- delimiters: { type: Array, default: [] },
18
- suggestionsMaxItems: { type: Number, default: 20 },
19
- mode: String,
20
- fetchValuesFrom: String,
21
- }
22
-
23
- tagify = null;
24
-
25
- searchDebounce = 500
26
-
27
- debouncedFetch = debouncePromise(fetch, this.searchDebounce);
28
-
29
- get suggestionsAreObjects() {
30
- return isObject(first(this.whitelistItemsValue)) || this.fetchValuesFromValue
31
- }
32
-
33
- get tagifyOptions() {
34
- let options = {
35
- whitelist: this.whitelistItemsValue,
36
- blacklist: this.disallowedItemsValue,
37
- enforceWhitelist: this.enforceSuggestionsValue || this.fetchValuesFromValue,
38
- delimiters: this.delimitersValue.join('|'),
39
- dropdown: {
40
- maxItems: this.suggestionsMaxItemsValue,
41
- enabled: 0,
42
- searchKeys: [this.labelAttributeValue],
43
- closeOnSelect: this.closeOnSelectValue,
44
- },
45
- }
46
-
47
- if (this.modeValue) {
48
- options.mode = this.modeValue // null or "select"
49
- }
50
-
51
- if (this.suggestionsAreObjects) {
52
- options = merge(options, {
53
- tagTextProp: 'label',
54
- dropdown: {
55
- searchKeys: ['label'],
56
- mapValueTo: 'value',
57
- },
58
- templates: {
59
- tag: tagTemplate,
60
- dropdownItem: suggestionItemTemplate,
61
- },
62
- originalInputValueFormat: (valuesArr) => valuesArr.map((item) => item.value),
63
- })
64
- } else {
65
- options = merge(options, {
66
- originalInputValueFormat: (valuesArr) => valuesArr.map((item) => item.value).join(','),
67
- })
68
- }
69
-
70
- return options
71
- }
72
-
73
- connect() {
74
- if (this.hasInputTarget) {
75
- this.hideFakeInput()
76
- this.showRealInput()
77
- this.initTagify()
78
- }
79
- }
80
-
81
- initTagify() {
82
- this.tagify = new Tagify(this.inputTarget, this.tagifyOptions)
83
- const that = this
84
-
85
- function onInput(e) {
86
- // Create the URL from which to fetch the values
87
- const query = e.detail.value
88
- const uri = new URI(that.fetchValuesFromValue)
89
- uri.addSearch({
90
- q: query,
91
- })
92
-
93
- // reset current whitelist
94
- that.tagify.whitelist = null
95
- // show the loader animation
96
- that.tagify.loading(true)
97
-
98
- // get new whitelist from a request
99
- that.fetchResults(uri.toString())
100
- .then((result) => {
101
- that.tagify.settings.whitelist = result // add already-existing tags to the new whitelist array
102
-
103
- that.tagify
104
- .loading(false)
105
- .dropdown.show(e.detail.value) // render the suggestions dropdown.
106
- })
107
- .catch(() => that.tagify.dropdown.hide())
108
- }
109
-
110
- if (this.fetchValuesFromValue) {
111
- this.tagify.on('input', onInput)
112
- }
113
- }
114
-
115
- fetchResults(endpoint) {
116
- return this.debouncedFetch(endpoint)
117
- .then((response) => response.json())
118
- }
119
-
120
- hideFakeInput() {
121
- this.fakeInputTarget.classList.add('hidden')
122
- }
123
-
124
- showRealInput() {
125
- this.inputTarget.classList.remove('hidden')
126
- }
127
- }
@@ -1,18 +0,0 @@
1
- import { Controller } from '@hotwired/stimulus'
2
- import { useClickOutside } from 'stimulus-use'
3
-
4
- export default class extends Controller {
5
- static targets = ['panel']
6
-
7
- connect() {
8
- useClickOutside(this)
9
- }
10
-
11
- clickOutside() {
12
- this.panelTarget.classList.add('hidden')
13
- }
14
-
15
- togglePanel() {
16
- this.panelTarget.classList.toggle('hidden')
17
- }
18
- }
@@ -1,3 +0,0 @@
1
- <div class="relative flex flex-col <%= @card.chartkick_classes %>">
2
- <%= send(@card.chart_type, @card.result_data, **@card.chartkick_options) %>
3
- </div>
@@ -1,5 +0,0 @@
1
- <div class="flex mt-4 items-end">
2
- <span class="text-3xl"><%= @card.prefix %></span>
3
- <span class="text-5xl"><%= @card.result_data %></span>
4
- <span class="text-3xl"><%= @card.suffix %></span>
5
- </div>
@@ -1,14 +0,0 @@
1
- <%= render Avo::TurboFrameWrapperComponent.new(params[:turbo_frame]) do %>
2
- <div class="w-full h-full flex items-center text-center">
3
- <div class="flex-1">
4
- Chartkick is missing.
5
- <a
6
- href="https://docs.avohq.io/2.0/upgrade.html#upgrade-from-2-17-to-2-18"
7
- target="_blank"
8
- >
9
- Manually require it in your
10
- <code class="inline">Gemfile</code>
11
- </a>.
12
- </div>
13
- </div>
14
- <% end %>
@@ -1,3 +0,0 @@
1
- <%= render Avo::TurboFrameWrapperComponent.new(params[:turbo_frame]) do %>
2
- <%= render Avo::CardComponent.new card: @card %>
3
- <% end %>
@@ -1,38 +0,0 @@
1
- <%= render Avo::PanelComponent.new(name: @dashboard.name, description: @dashboard.description) do |c| %>
2
- <% c.with_bare_content do %>
3
- <% if @dashboard.items.present? %>
4
- <div class="min-h-24">
5
- <%= content_tag(:div, class: "grid gap-4 grid-cols-1 #{@dashboard.classes}") do %>
6
- <% @dashboard.items.each do |item| %>
7
- <% if item.is_divider? %>
8
- <%= render Avo::Dashboards::DividerComponent.new(divider: item) %>
9
- <% elsif item.is_card? %>
10
- <%= content_tag(:div, class: "relative bg-white rounded shadow-panel space-y-2 #{item.card_classes} overflow-hidden") do %>
11
- <turbo-frame id="<%= item.turbo_frame %>"
12
- src="<%= item.frame_url(enforced_range: @range, params: params) %>"
13
- data-card-index="<%= item.index %>"
14
- >
15
- <%= render(Avo::LoadingComponent.new(title: item.label)) %>
16
- </turbo-frame>
17
- <% end %>
18
- <% end %>
19
- <% end %>
20
- <% end %>
21
- </div>
22
- <% else %>
23
- <div class="w-full h-full">
24
- <% if Rails.env.development? %>
25
- <%= render Avo::PanelComponent.new do |c| %>
26
- <% c.with_body do %>
27
- <div class="p-6">
28
- <%= t 'avo.empty_dashboard_message' %>. <%= link_to 'Docs', 'https://docs.avohq.io/2.0/dashboards.html', target: '_blank' %>
29
- </div>
30
- <% end %>
31
- <% end %>
32
- <% end %>
33
-
34
- <%= empty_state message: t('avo.no_cards_present') %>
35
- </div>
36
- <% end %>
37
- <% end %>
38
- <% end %>
@@ -1,19 +0,0 @@
1
- <div data-controller="search" class="relative flex global-search rounded border border-gray-200 sm:min-w-[16rem]">
2
- <div class="flex-1 text-gray-500"
3
- data-search-target="autocomplete"
4
- data-search-resource="global"
5
- data-translation-keys='{"no_item_found": "<%= I18n.translate 'avo.no_item_found' %>", "placeholder": "<%= I18n.translate 'avo.search.placeholder' %>", "cancel_button": "<%= I18n.translate 'avo.search.cancel_button' %>"}'
6
- >
7
- </div>
8
- <div class="absolute top-1/2 hidden sm:inline-flex text-gray-400 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md cursor-pointer -translate-y-1/2 left-auto right-0 mr-4"
9
- data-search-target="button"
10
- >
11
- <span class="sr-only">Press </span>
12
- <kbd class="font-sans">
13
- <abbr title="Command" class="no-underline pc:hidden">⌘</abbr>
14
- <abbr title="CTRL" class="no-underline mac:hidden">CTRL +&nbsp; </abbr>
15
- </kbd>
16
- <span class="sr-only"> and </span>
17
- <kbd class="font-sans">K</kbd><span class="sr-only"> to search</span>
18
- </div>
19
- </div>
@@ -1,6 +0,0 @@
1
- <% if license[:id] == 'pro' and license[:valid] == false %>
2
- <%= render_license_warning title: 'Trial Mode', message: 'You are experiencing paid features that need to be licensed before deploying this site. Enjoy!' %>
3
- <% end %>
4
- <% if license[:error].present? && !(Avo.configuration.display_license_request_timeout_error === false && license[:error] === "Request timeout.") %>
5
- <%= render_license_warning title: 'Avo HQ Error', message: "#{license[:error]} Checking back every 5 minutes." %>
6
- <% end %>
@@ -1,20 +0,0 @@
1
- module Avo
2
- class ActionModel
3
- include ActiveModel::Model
4
-
5
- # This class augments a model the action form declaration.
6
- def initialize(attributes = {})
7
- set_attr_accessors attributes
8
-
9
- super(attributes)
10
- end
11
-
12
- private
13
-
14
- def set_attr_accessors(attributes)
15
- attributes.each do |k, v|
16
- self.class.class_eval { attr_accessor k }
17
- end
18
- end
19
- end
20
- end
data/lib/avo/app.rb DELETED
@@ -1,237 +0,0 @@
1
- module Avo
2
- class App
3
- include Avo::Concerns::FetchesThings
4
-
5
- class_attribute :resources, default: []
6
- class_attribute :dashboards, default: []
7
- class_attribute :cache_store, default: nil
8
- class_attribute :fields, default: []
9
- class_attribute :request, default: nil
10
- class_attribute :context, default: nil
11
- class_attribute :license, default: nil
12
- class_attribute :current_user, default: nil
13
- class_attribute :root_path, default: nil
14
- class_attribute :view_context, default: nil
15
- class_attribute :params, default: {}
16
- class_attribute :translation_enabled, default: false
17
- class_attribute :error_messages
18
-
19
- class << self
20
- def eager_load(entity)
21
- paths = Avo::ENTITIES.fetch entity
22
-
23
- return unless paths.present?
24
-
25
- pathname = Rails.root.join(*paths)
26
- if pathname.directory?
27
- Rails.autoloaders.main.eager_load_dir(pathname.to_s)
28
- end
29
- end
30
-
31
- def boot
32
- init_fields
33
-
34
- self.cache_store = Avo.configuration.cache_store
35
- end
36
-
37
- # Generate a dynamic root path using the URIService
38
- def root_path(paths: [], query: {}, **args)
39
- Avo::Services::URIService.parse(view_context.avo.root_url.to_s)
40
- .append_paths(paths)
41
- .append_query(query)
42
- .to_s
43
- end
44
-
45
- def init(request:, context:, current_user:, view_context:, params:)
46
- self.error_messages = []
47
- self.context = context
48
- self.current_user = current_user
49
- self.params = params
50
- self.request = request
51
- self.view_context = view_context
52
-
53
- self.license = Licensing::LicenseManager.new(Licensing::HQ.new(request).response).license
54
- self.translation_enabled = license.has(:localization)
55
-
56
- # Set the current host for ActiveStorage
57
- begin
58
- if defined?(ActiveStorage::Current)
59
- if Rails::VERSION::MAJOR === 6
60
- ActiveStorage::Current.host = request.base_url
61
- elsif Rails::VERSION::MAJOR === 7
62
- ActiveStorage::Current.url_options = {protocol: request.protocol, host: request.host, port: request.port}
63
- end
64
- end
65
- rescue => exception
66
- Rails.logger.debug "[Avo] Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
67
- end
68
-
69
- check_bad_resources
70
- init_resources
71
- init_dashboards if license.has_with_trial(:dashboards)
72
- end
73
-
74
- # This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
75
- # so later we can instantiate them on our resources.
76
- #
77
- # If the field has their `def_method` set up it will follow that convention, if not it will snake_case the name:
78
- #
79
- # Avo::Fields::TextField -> text
80
- # Avo::Fields::DateTimeField -> date_time
81
- def init_fields
82
- Avo::Fields::BaseField.descendants.each do |class_name|
83
- next if class_name.to_s == "BaseField"
84
-
85
- if class_name.to_s.end_with? "Field"
86
- load_field class_name.get_field_name, class_name
87
- end
88
- end
89
- end
90
-
91
- def load_field(method_name, klass)
92
- fields.push(
93
- name: method_name,
94
- class: klass
95
- )
96
- end
97
-
98
- def check_bad_resources
99
- resources.each do |resource|
100
- has_model = resource.model_class.present?
101
-
102
- unless has_model
103
- possible_model = resource.class.to_s.gsub "Resource", ""
104
-
105
- Avo::App.error_messages.push({
106
- url: "https://docs.avohq.io/2.0/resources.html#custom-model-class",
107
- target: "_blank",
108
- message: "#{resource.class.to_s} does not have a valid model assigned. It failed to find the #{possible_model} model. \n\r Please create that model or assign one using self.model_class = YOUR_MODEL"
109
- })
110
- end
111
- end
112
- end
113
-
114
- # Fetches the resources available to the application.
115
- # We have two ways of doing that.
116
- #
117
- # 1. Through eager loading.
118
- # We automatically eager load the resources directory and fetch the descendants from the scanned files.
119
- # This is the simple way to get started.
120
- #
121
- # 2. Manually, declared by the user.
122
- # We have this option to load the resources because when they are loaded automatically through eager loading,
123
- # those Resource classes and their methods may trigger loading other classes. And that may disrupt Rails booting process.
124
- # Ex: AdminResource may use self.model_class = User. That will trigger Ruby to load the User class and itself load
125
- # other classes in a chain reaction.
126
- # The scenario that comes up most often is when Rails boots, the routes are being computed which eager loads the resource files.
127
- # At that boot time some migration might have not been run yet, but Rails tries to access them through model associations,
128
- # and they are not available.
129
- #
130
- # To enable this feature add a `resources` array config in your Avo initializer.
131
- # config.resources = [
132
- # "UserResource",
133
- # "FishResource",
134
- # ]
135
- def fetch_resources
136
- resources = if Avo.configuration.resources.nil?
137
- BaseResource.descendants
138
- else
139
- Avo.configuration.resources
140
- end
141
-
142
- resources.map do |resource|
143
- if resource.is_a?(Class)
144
- resource
145
- else
146
- resource.to_s.safe_constantize
147
- end
148
- end
149
- end
150
-
151
- def init_resources
152
- self.resources = fetch_resources
153
- .select do |resource|
154
- # Remove the BaseResource. We only need the descendants
155
- resource != BaseResource
156
- end
157
- .uniq do |klass|
158
- # On invalid resource configuration the resource classes get duplicated in `ObjectSpace`
159
- # We need to de-duplicate them
160
- klass.name
161
- end
162
- .map do |resource|
163
- resource.new if resource.is_a? Class
164
- end
165
- end
166
-
167
- def init_dashboards
168
- eager_load :dashboards unless Rails.application.config.eager_load
169
-
170
- self.dashboards = Dashboards::BaseDashboard.descendants
171
- .select do |dashboard|
172
- dashboard != Dashboards::BaseDashboard
173
- end
174
- .uniq do |dashboard|
175
- dashboard.id
176
- end
177
- end
178
-
179
- def has_main_menu?
180
- return false if Avo::App.license.lacks_with_trial(:menu_editor)
181
- return false if Avo.configuration.main_menu.nil?
182
-
183
- true
184
- end
185
-
186
- def has_profile_menu?
187
- return false if Avo::App.license.lacks_with_trial(:menu_editor)
188
- return false if Avo.configuration.profile_menu.nil?
189
-
190
- true
191
- end
192
-
193
- def main_menu
194
- # Return empty menu if the app doesn't have the profile menu configured
195
- return Avo::Menu::Builder.new.build unless has_main_menu?
196
-
197
- Avo::Menu::Builder.parse_menu(&Avo.configuration.main_menu)
198
- end
199
-
200
- def profile_menu
201
- # Return empty menu if the app doesn't have the profile menu configured
202
- return Avo::Menu::Builder.new.build unless has_profile_menu?
203
-
204
- Avo::Menu::Builder.parse_menu(&Avo.configuration.profile_menu)
205
- end
206
-
207
- def debug_report(request = nil)
208
- payload = {}
209
-
210
- hq = Avo::Licensing::HQ.new(request)
211
-
212
- payload[:license_id] = Avo::App&.license&.id
213
- payload[:license_valid] = Avo::App&.license&.valid?
214
- payload[:license_payload] = Avo::App&.license&.payload
215
- payload[:license_response] = Avo::App&.license&.response
216
- payload[:hq_payload] = hq&.payload
217
- payload[:thread_count] = get_thread_count
218
- payload[:license_abilities] = Avo::App&.license&.abilities
219
- payload[:cache_store] = self.cache_store&.class&.to_s
220
- payload[:avo_metadata] = hq&.avo_metadata
221
- payload[:app_timezone] = Time.current.zone
222
- payload[:cache_key] = Avo::Licensing::HQ.cache_key
223
- payload[:cache_key_contents] = hq&.cached_response
224
-
225
- payload
226
- rescue => e
227
- e
228
- end
229
-
230
- def get_thread_count
231
- Thread.list.select {|thread| thread.status == "run"}.count
232
- rescue => e
233
- e
234
- end
235
- end
236
- end
237
- end
data/lib/avo/base_card.rb DELETED
@@ -1,161 +0,0 @@
1
- module Avo
2
- class BaseCard
3
- include Avo::Concerns::VisibleInDashboard
4
-
5
- class_attribute :id
6
- class_attribute :label
7
- class_attribute :description
8
- class_attribute :cols, default: 1
9
- class_attribute :rows, default: 1
10
- class_attribute :initial_range
11
- class_attribute :ranges, default: []
12
- class_attribute :refresh_every
13
- class_attribute :display_header, default: true
14
- # private
15
- class_attribute :result_data
16
- class_attribute :query_block
17
-
18
- attr_accessor :dashboard
19
- attr_accessor :options
20
- attr_accessor :arguments
21
- attr_accessor :index
22
- attr_accessor :params
23
-
24
- delegate :context, to: ::Avo::App
25
- delegate :current_user, to: ::Avo::App
26
- delegate :view_context, to: ::Avo::App
27
- delegate :params, to: ::Avo::App
28
- delegate :request, to: ::Avo::App
29
-
30
- class << self
31
- def query(&block)
32
- self.query_block = block
33
- end
34
- end
35
-
36
- def initialize(dashboard:, options: {}, arguments: {}, index: 0, cols: nil, rows: nil, label: nil, description: nil, refresh_every: nil, visible: nil)
37
- @dashboard = dashboard
38
- @options = options
39
- @arguments = arguments
40
- @index = index
41
- @cols = cols
42
- @rows = rows
43
- @label = label
44
- @refresh_every = refresh_every
45
- @description = description
46
- @visible = visible
47
- end
48
-
49
- def label
50
- return @label.to_s if @label.present?
51
- return self.class.label.to_s if self.class.label.present?
52
-
53
- self.class.id.to_s.humanize
54
- end
55
-
56
- def description
57
- @description || self.class.description
58
- end
59
-
60
- def refresh_every
61
- @refresh_every || self.class.refresh_every
62
- end
63
-
64
- def turbo_frame
65
- "#{dashboard.id}_#{id}"
66
- end
67
-
68
- def frame_url(enforced_range: nil, params: {})
69
- enforced_range ||= initial_range || ranges.first
70
-
71
- Avo::App.view_context.avo.dashboard_card_path(dashboard.id, id, turbo_frame: turbo_frame, index: index, range: enforced_range, **params.permit!)
72
- end
73
-
74
- def card_classes
75
- result = ""
76
-
77
- # Writing down the classes so TailwindCSS knows not to purge them
78
- classes_for_cols = {
79
- 1 => " sm:col-span-1",
80
- 2 => " sm:col-span-2",
81
- 3 => " sm:col-span-3",
82
- 4 => " sm:col-span-4",
83
- 5 => " sm:col-span-5",
84
- 6 => " sm:col-span-6"
85
- }
86
-
87
- classes_for_rows = {
88
- 1 => " h-36",
89
- 2 => " h-72",
90
- 3 => " h-[27rem]",
91
- 4 => " h-[36rem]",
92
- 5 => " h-[45rem]",
93
- 6 => " h-[54rem]"
94
- }
95
-
96
- result += classes_for_cols[cols.to_i] if classes_for_cols[cols.to_i].present?
97
- result += classes_for_rows[rows.to_i] if classes_for_rows[rows.to_i].present?
98
-
99
- result
100
- end
101
-
102
- def type
103
- return :metric if is_a?(::Avo::Dashboards::MetricCard)
104
- return :chartkick if is_a?(::Avo::Dashboards::ChartkickCard)
105
- return :partial if is_a?(::Avo::Dashboards::PartialCard)
106
- end
107
-
108
- def compute_result
109
- Avo::Hosts::DashboardCard.new(card: self, dashboard: dashboard, params: params, context: context, range: range, options: options)
110
- .compute_result
111
-
112
- self
113
- end
114
-
115
- def hydrate(dashboard: nil)
116
- @dashboard = dashboard if dashboard.present?
117
-
118
- self
119
- end
120
-
121
- def range
122
- return params[:range] if params.dig(:range).present?
123
-
124
- return initial_range if initial_range.present?
125
-
126
- ranges.first
127
- end
128
-
129
- def result(data)
130
- self.result_data = data
131
-
132
- self
133
- end
134
-
135
- def is_card?
136
- true
137
- end
138
-
139
- def is_divider?
140
- false
141
- end
142
-
143
- def visible
144
- @visible || self.class.visible
145
- end
146
-
147
- def call_block
148
- ::Avo::Hosts::CardVisibility.new(block: visible, card: self, parent: dashboard).handle
149
- end
150
-
151
- private
152
-
153
- def cols
154
- @cols || self.class.cols
155
- end
156
-
157
- def rows
158
- @rows || self.class.rows
159
- end
160
- end
161
- end