avo 2.45.0 → 3.0.0.pre1

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 (415) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +9 -9
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +11 -10
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -35
  167. data/lib/avo/base_resource.rb +107 -95
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/is_resource_item.rb +24 -36
  175. data/lib/avo/concerns/is_visible.rb +15 -0
  176. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  177. data/lib/avo/configuration/branding.rb +0 -12
  178. data/lib/avo/configuration.rb +8 -45
  179. data/lib/avo/current.rb +5 -0
  180. data/lib/avo/dsl/field_parser.rb +1 -1
  181. data/lib/avo/dynamic_router.rb +6 -2
  182. data/lib/avo/engine.rb +37 -30
  183. data/lib/avo/error_manager.rb +25 -0
  184. data/lib/avo/execution_context.rb +9 -15
  185. data/lib/avo/fields/badge_field.rb +1 -1
  186. data/lib/avo/fields/base_field.rb +72 -123
  187. data/lib/avo/fields/belongs_to_field.rb +14 -25
  188. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  189. data/lib/avo/fields/concerns/has_default.rb +1 -5
  190. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  191. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  192. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  193. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  194. data/lib/avo/fields/concerns/is_required.rb +5 -7
  195. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  196. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  197. data/lib/avo/fields/country_field.rb +4 -0
  198. data/lib/avo/fields/date_field.rb +3 -16
  199. data/lib/avo/fields/date_time_field.rb +1 -5
  200. data/lib/avo/fields/field_manager.rb +45 -0
  201. data/lib/avo/fields/file_field.rb +0 -2
  202. data/lib/avo/fields/files_field.rb +0 -6
  203. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  204. data/lib/avo/fields/has_base_field.rb +11 -14
  205. data/lib/avo/fields/has_many_field.rb +5 -2
  206. data/lib/avo/fields/has_one_field.rb +5 -10
  207. data/lib/avo/fields/heading_field.rb +4 -1
  208. data/lib/avo/fields/hidden_field.rb +1 -1
  209. data/lib/avo/fields/id_field.rb +2 -3
  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 +4 -0
  214. data/lib/avo/filters/base_filter.rb +3 -8
  215. data/lib/avo/grid_collector.rb +7 -9
  216. data/lib/avo/html/builder.rb +5 -8
  217. data/lib/avo/item_grapher.rb +78 -0
  218. data/lib/avo/licensing/h_q.rb +3 -67
  219. data/lib/avo/licensing/license.rb +2 -2
  220. data/lib/avo/licensing/license_manager.rb +1 -1
  221. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  222. data/lib/avo/licensing/pro_license.rb +1 -7
  223. data/lib/avo/plugin.rb +6 -0
  224. data/lib/avo/plugin_manager.rb +58 -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 +6 -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 +76 -0
  239. data/lib/avo/resources/items/item_group.rb +48 -0
  240. data/lib/avo/resources/items/main_panel.rb +2 -0
  241. data/lib/avo/resources/items/panel.rb +2 -0
  242. data/lib/avo/resources/items/sidebar.rb +47 -0
  243. data/lib/avo/resources/items/tab.rb +60 -0
  244. data/lib/avo/resources/items/tab_group.rb +68 -0
  245. data/lib/avo/resources/resource_manager.rb +181 -0
  246. data/lib/avo/services/authorization_service.rb +11 -110
  247. data/lib/avo/services/debug_service.rb +92 -0
  248. data/lib/avo/services/telemetry_service.rb +84 -0
  249. data/lib/avo/test_helpers.rb +362 -0
  250. data/lib/avo/tools/tool_manager.rb +30 -0
  251. data/lib/avo/version.rb +1 -1
  252. data/lib/avo.rb +7 -0
  253. data/lib/generators/avo/eject_generator.rb +0 -1
  254. data/lib/generators/avo/install_generator.rb +1 -11
  255. data/lib/generators/avo/resource_generator.rb +5 -23
  256. data/lib/generators/avo/scope_generator.rb +15 -0
  257. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  258. data/lib/generators/avo/templates/action.tt +1 -1
  259. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  261. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  263. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  265. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  266. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  267. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  268. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  271. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  272. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  273. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  274. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  275. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  280. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  281. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  282. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  283. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  284. data/lib/generators/avo/templates/scope.tt +6 -0
  285. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  286. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  287. data/lib/generators/avo/templates/tool/view.tt +2 -2
  288. data/lib/tasks/avo_tasks.rake +22 -0
  289. metadata +81 -159
  290. data/app/assets/stylesheets/css/tags.css +0 -32
  291. data/app/assets/svgs/map-empty-state.svg +0 -35
  292. data/app/assets/svgs/map-view-type.svg +0 -3
  293. data/app/components/avo/card_component.html.erb +0 -46
  294. data/app/components/avo/card_component.rb +0 -25
  295. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  296. data/app/components/avo/dashboards/divider_component.rb +0 -19
  297. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  298. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  299. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  300. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  301. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  303. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  304. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  305. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  306. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  307. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  309. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  311. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  312. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  313. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  314. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  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/index/resource_map_component.html.erb +0 -16
  329. data/app/components/avo/index/resource_map_component.rb +0 -109
  330. data/app/components/avo/row_component.html.erb +0 -3
  331. data/app/components/avo/row_component.rb +0 -12
  332. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  333. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  334. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  335. data/app/controllers/avo/dashboards_controller.rb +0 -22
  336. data/app/controllers/avo/reorder_controller.rb +0 -25
  337. data/app/javascript/js/controllers/base_controller.js +0 -22
  338. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  339. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  340. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  341. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  342. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  343. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  344. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  345. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  346. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  347. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  348. data/app/views/avo/dashboards/show.html.erb +0 -38
  349. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  350. data/app/views/avo/partials/_global_search.html.erb +0 -19
  351. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  352. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  353. data/lib/avo/base_card.rb +0 -161
  354. data/lib/avo/concerns/fetches_things.rb +0 -150
  355. data/lib/avo/concerns/handles_field_args.rb +0 -47
  356. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  357. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  358. data/lib/avo/concerns/pagination.rb +0 -53
  359. data/lib/avo/concerns/policy_helpers.rb +0 -31
  360. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  361. data/lib/avo/concerns/visible_items.rb +0 -51
  362. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  363. data/lib/avo/dashboards/base_divider.rb +0 -35
  364. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  365. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  366. data/lib/avo/dashboards/metric_card.rb +0 -9
  367. data/lib/avo/dashboards/partial_card.rb +0 -7
  368. data/lib/avo/fields/area_field.rb +0 -39
  369. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  370. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  371. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  372. data/lib/avo/fields/location_field.rb +0 -86
  373. data/lib/avo/fields/tags_field.rb +0 -102
  374. data/lib/avo/hosts/association_scope_host.rb +0 -8
  375. data/lib/avo/hosts/base_host.rb +0 -25
  376. data/lib/avo/hosts/card_visibility.rb +0 -20
  377. data/lib/avo/hosts/dashboard_card.rb +0 -22
  378. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  379. data/lib/avo/hosts/ordering.rb +0 -22
  380. data/lib/avo/hosts/record_host.rb +0 -7
  381. data/lib/avo/hosts/resource_record_host.rb +0 -7
  382. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  383. data/lib/avo/hosts/search_scope_host.rb +0 -7
  384. data/lib/avo/hosts/view_record_host.rb +0 -7
  385. data/lib/avo/hosts/visibility_host.rb +0 -12
  386. data/lib/avo/items_holder.rb +0 -96
  387. data/lib/avo/main_panel.rb +0 -3
  388. data/lib/avo/menu/base_item.rb +0 -25
  389. data/lib/avo/menu/builder.rb +0 -82
  390. data/lib/avo/menu/dashboard.rb +0 -22
  391. data/lib/avo/menu/group.rb +0 -2
  392. data/lib/avo/menu/link.rb +0 -6
  393. data/lib/avo/menu/menu.rb +0 -2
  394. data/lib/avo/menu/resource.rb +0 -22
  395. data/lib/avo/menu/section.rb +0 -2
  396. data/lib/avo/panel.rb +0 -24
  397. data/lib/avo/panel_builder.rb +0 -25
  398. data/lib/avo/resources/controls/action.rb +0 -38
  399. data/lib/avo/resources/controls/execution_context.rb +0 -58
  400. data/lib/avo/resources/controls/items_holder.rb +0 -19
  401. data/lib/avo/resources/controls/link_to.rb +0 -27
  402. data/lib/avo/row.rb +0 -26
  403. data/lib/avo/row_builder.rb +0 -24
  404. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  405. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  406. data/lib/avo/sidebar.rb +0 -30
  407. data/lib/avo/sidebar_builder.rb +0 -24
  408. data/lib/avo/tab.rb +0 -72
  409. data/lib/avo/tab_builder.rb +0 -25
  410. data/lib/avo/tab_group.rb +0 -42
  411. data/lib/avo/tab_group_builder.rb +0 -43
  412. data/lib/avo/tools_manager.rb +0 -11
  413. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  414. data/public/avo-assets/avo.base.js +0 -1037
  415. data/public/avo-assets/avo.base.js.map +0 -7
@@ -1,8 +0,0 @@
1
- <%= turbo_stream.remove("new_via_belongs_to") %>
2
-
3
- <turbo-stream action="update-belongs-to"
4
- data-relation-name="<%= params[:via_relation] %>"
5
- data-target-resource-id="<%= @model.id %>"
6
- data-target-resource-label="<%= @resource.label %>"
7
- data-target-resource-class="<%= @model.class.name %>">
8
- </turbo-stream>
@@ -1,13 +0,0 @@
1
- <%= turbo_stream.replace(frame_id(@resource), template: "avo/base/new") %>
2
-
3
- <%= turbo_stream.append "alerts" do %>
4
- <%= render Avo::FlashAlertsComponent.new flashes: flash %>
5
- <% end %>
6
-
7
- <% if @model.errors.any? %>
8
- <%= turbo_stream.append("alerts") do %>
9
- <% @model.errors.full_messages.each do |message| %>
10
- <%= render Avo::AlertComponent.new :error, message %>
11
- <% end %>
12
- <% end %>
13
- <% end %>
@@ -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,3 +0,0 @@
1
- <%= turbo_stream.append "alerts" do %>
2
- <%= render Avo::FlashAlertsComponent.new flashes: flash.discard %>
3
- <% 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,2 +0,0 @@
1
- <%# Example link below %>
2
- <%#= render Avo::ProfileItemComponent.new label: 'Profile', path: '/profile', icon: 'user-circle' %>
@@ -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 %>
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
@@ -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,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,53 +0,0 @@
1
- module Avo
2
- module Concerns
3
- module Pagination
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- include Pagy::Backend
8
-
9
- class_attribute :pagination, default: {}
10
-
11
- PAGINATION_METHOD = {
12
- default: :pagy,
13
- countless: :pagy_countless,
14
- } unless defined? PAGINATION_METHOD
15
-
16
- PAGINATION_DEFAULTS = {
17
- type: :default,
18
- size: [1, 2, 2, 1],
19
- } unless defined? PAGINATION_DEFAULTS
20
- end
21
-
22
- def pagination_type
23
- @pagination_type ||= ActiveSupport::StringInquirer.new(pagination_hash[:type].to_s)
24
- end
25
-
26
- def apply_pagination(index_params:, query:)
27
- extra_pagy_params = {}
28
-
29
- # Reset open filters when a user navigates to a new page
30
- extra_pagy_params[:keep_filters_panel_open] = if params[:keep_filters_panel_open] == "1"
31
- "0"
32
- end
33
-
34
- send PAGINATION_METHOD[pagination_type.to_sym],
35
- query,
36
- items: index_params[:per_page],
37
- link_extra: "data-turbo-frame=\"#{params[:turbo_frame]}\"",
38
- params: extra_pagy_params,
39
- size: pagination_hash[:size]
40
- end
41
-
42
- private
43
-
44
- def pagination_hash
45
- @pagination ||= PAGINATION_DEFAULTS.merge Avo::ExecutionContext.new(
46
- target: pagination,
47
- resource: self,
48
- view: @view
49
- ).handle
50
- end
51
- end
52
- end
53
- end