avo 2.46.0 → 3.0.0.pre2

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 (417) 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 +12 -23
  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 +12 -11
  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 -36
  167. data/lib/avo/base_resource.rb +108 -96
  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/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  175. data/lib/avo/concerns/is_resource_item.rb +24 -36
  176. data/lib/avo/concerns/is_visible.rb +15 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +8 -45
  180. data/lib/avo/current.rb +5 -0
  181. data/lib/avo/dsl/field_parser.rb +1 -1
  182. data/lib/avo/dynamic_router.rb +6 -2
  183. data/lib/avo/engine.rb +37 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +9 -15
  186. data/lib/avo/fields/badge_field.rb +1 -1
  187. data/lib/avo/fields/base_field.rb +72 -124
  188. data/lib/avo/fields/belongs_to_field.rb +14 -25
  189. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  190. data/lib/avo/fields/concerns/has_default.rb +1 -5
  191. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  192. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  193. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  194. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  195. data/lib/avo/fields/concerns/is_required.rb +5 -7
  196. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/country_field.rb +4 -0
  199. data/lib/avo/fields/date_field.rb +3 -16
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/field_manager.rb +45 -0
  202. data/lib/avo/fields/file_field.rb +0 -2
  203. data/lib/avo/fields/files_field.rb +0 -6
  204. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  205. data/lib/avo/fields/has_base_field.rb +11 -14
  206. data/lib/avo/fields/has_many_field.rb +5 -2
  207. data/lib/avo/fields/has_one_field.rb +5 -10
  208. data/lib/avo/fields/heading_field.rb +4 -1
  209. data/lib/avo/fields/hidden_field.rb +1 -1
  210. data/lib/avo/fields/id_field.rb +2 -3
  211. data/lib/avo/fields/password_field.rb +1 -1
  212. data/lib/avo/fields/preview_field.rb +14 -0
  213. data/lib/avo/fields/select_field.rb +12 -8
  214. data/lib/avo/fields/status_field.rb +4 -0
  215. data/lib/avo/filters/base_filter.rb +3 -8
  216. data/lib/avo/grid_collector.rb +7 -9
  217. data/lib/avo/html/builder.rb +5 -8
  218. data/lib/avo/item_grapher.rb +78 -0
  219. data/lib/avo/licensing/h_q.rb +4 -68
  220. data/lib/avo/licensing/license.rb +2 -2
  221. data/lib/avo/licensing/license_manager.rb +1 -1
  222. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  223. data/lib/avo/licensing/pro_license.rb +1 -7
  224. data/lib/avo/plugin.rb +6 -0
  225. data/lib/avo/plugin_manager.rb +58 -0
  226. data/lib/avo/prefixed_test_helpers.rb +20 -0
  227. data/lib/avo/reloader.rb +3 -0
  228. data/lib/avo/resources/controls/actions_list.rb +6 -12
  229. data/lib/avo/resources/controls/attach_button.rb +15 -0
  230. data/lib/avo/resources/controls/back_button.rb +1 -1
  231. data/lib/avo/resources/controls/base_control.rb +15 -49
  232. data/lib/avo/resources/controls/create_button.rb +15 -0
  233. data/lib/avo/resources/controls/delete_button.rb +5 -1
  234. data/lib/avo/resources/controls/detach_button.rb +4 -1
  235. data/lib/avo/resources/controls/edit_button.rb +4 -1
  236. data/lib/avo/resources/controls/order_controls.rb +8 -0
  237. data/lib/avo/resources/controls/save_button.rb +13 -0
  238. data/lib/avo/resources/controls/show_button.rb +15 -0
  239. data/lib/avo/resources/items/holder.rb +76 -0
  240. data/lib/avo/resources/items/item_group.rb +48 -0
  241. data/lib/avo/resources/items/main_panel.rb +2 -0
  242. data/lib/avo/resources/items/panel.rb +2 -0
  243. data/lib/avo/resources/items/sidebar.rb +47 -0
  244. data/lib/avo/resources/items/tab.rb +60 -0
  245. data/lib/avo/resources/items/tab_group.rb +68 -0
  246. data/lib/avo/resources/resource_manager.rb +181 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +92 -0
  249. data/lib/avo/services/telemetry_service.rb +84 -0
  250. data/lib/avo/test_helpers.rb +362 -0
  251. data/lib/avo/tools/tool_manager.rb +30 -0
  252. data/lib/avo/version.rb +1 -1
  253. data/lib/avo.rb +7 -0
  254. data/lib/generators/avo/eject_generator.rb +0 -1
  255. data/lib/generators/avo/install_generator.rb +1 -11
  256. data/lib/generators/avo/resource_generator.rb +5 -23
  257. data/lib/generators/avo/scope_generator.rb +15 -0
  258. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  259. data/lib/generators/avo/templates/action.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  261. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  263. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  265. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  266. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  267. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  268. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  271. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  272. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  273. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  274. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  275. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  280. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  281. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  282. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  283. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  284. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  285. data/lib/generators/avo/templates/scope.tt +6 -0
  286. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  287. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  288. data/lib/generators/avo/templates/tool/view.tt +2 -2
  289. data/lib/tasks/avo_tasks.rake +22 -0
  290. metadata +82 -161
  291. data/app/assets/stylesheets/css/tags.css +0 -32
  292. data/app/assets/svgs/map-empty-state.svg +0 -35
  293. data/app/assets/svgs/map-view-type.svg +0 -3
  294. data/app/components/avo/card_component.html.erb +0 -46
  295. data/app/components/avo/card_component.rb +0 -25
  296. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  297. data/app/components/avo/dashboards/divider_component.rb +0 -19
  298. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  299. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  300. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  301. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  303. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  304. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  305. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  306. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  307. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  309. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  311. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  312. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  313. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  314. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  315. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  317. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  318. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  319. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  320. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  321. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  322. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  323. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  324. data/app/components/avo/index/ordering/base_component.rb +0 -9
  325. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  326. data/app/components/avo/index/ordering/button_component.rb +0 -23
  327. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  328. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  329. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  330. data/app/components/avo/index/resource_map_component.rb +0 -109
  331. data/app/components/avo/row_component.html.erb +0 -3
  332. data/app/components/avo/row_component.rb +0 -12
  333. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  334. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  335. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  336. data/app/controllers/avo/dashboards_controller.rb +0 -22
  337. data/app/controllers/avo/reorder_controller.rb +0 -25
  338. data/app/javascript/js/controllers/base_controller.js +0 -22
  339. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  340. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  341. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  342. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  343. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  344. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  345. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  346. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  347. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  348. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  349. data/app/views/avo/dashboards/show.html.erb +0 -38
  350. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  351. data/app/views/avo/partials/_global_search.html.erb +0 -19
  352. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  353. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  354. data/lib/avo/base_card.rb +0 -161
  355. data/lib/avo/concerns/fetches_things.rb +0 -150
  356. data/lib/avo/concerns/handles_field_args.rb +0 -47
  357. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  358. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  359. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  360. data/lib/avo/concerns/pagination.rb +0 -53
  361. data/lib/avo/concerns/policy_helpers.rb +0 -31
  362. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  363. data/lib/avo/concerns/visible_items.rb +0 -51
  364. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  365. data/lib/avo/dashboards/base_divider.rb +0 -35
  366. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  367. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  368. data/lib/avo/dashboards/metric_card.rb +0 -9
  369. data/lib/avo/dashboards/partial_card.rb +0 -7
  370. data/lib/avo/fields/area_field.rb +0 -39
  371. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  372. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  373. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  374. data/lib/avo/fields/location_field.rb +0 -86
  375. data/lib/avo/fields/tags_field.rb +0 -102
  376. data/lib/avo/hosts/association_scope_host.rb +0 -8
  377. data/lib/avo/hosts/base_host.rb +0 -25
  378. data/lib/avo/hosts/card_visibility.rb +0 -20
  379. data/lib/avo/hosts/dashboard_card.rb +0 -22
  380. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  381. data/lib/avo/hosts/ordering.rb +0 -22
  382. data/lib/avo/hosts/record_host.rb +0 -7
  383. data/lib/avo/hosts/resource_record_host.rb +0 -7
  384. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  385. data/lib/avo/hosts/search_scope_host.rb +0 -7
  386. data/lib/avo/hosts/view_record_host.rb +0 -7
  387. data/lib/avo/hosts/visibility_host.rb +0 -12
  388. data/lib/avo/items_holder.rb +0 -96
  389. data/lib/avo/main_panel.rb +0 -3
  390. data/lib/avo/menu/base_item.rb +0 -25
  391. data/lib/avo/menu/builder.rb +0 -82
  392. data/lib/avo/menu/dashboard.rb +0 -22
  393. data/lib/avo/menu/group.rb +0 -2
  394. data/lib/avo/menu/link.rb +0 -6
  395. data/lib/avo/menu/menu.rb +0 -2
  396. data/lib/avo/menu/resource.rb +0 -22
  397. data/lib/avo/menu/section.rb +0 -2
  398. data/lib/avo/panel.rb +0 -24
  399. data/lib/avo/panel_builder.rb +0 -25
  400. data/lib/avo/resources/controls/action.rb +0 -38
  401. data/lib/avo/resources/controls/execution_context.rb +0 -58
  402. data/lib/avo/resources/controls/items_holder.rb +0 -19
  403. data/lib/avo/resources/controls/link_to.rb +0 -27
  404. data/lib/avo/row.rb +0 -26
  405. data/lib/avo/row_builder.rb +0 -24
  406. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  407. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  408. data/lib/avo/sidebar.rb +0 -30
  409. data/lib/avo/sidebar_builder.rb +0 -24
  410. data/lib/avo/tab.rb +0 -72
  411. data/lib/avo/tab_builder.rb +0 -25
  412. data/lib/avo/tab_group.rb +0 -42
  413. data/lib/avo/tab_group_builder.rb +0 -43
  414. data/lib/avo/tools_manager.rb +0 -11
  415. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  416. data/public/avo-assets/avo.base.js +0 -1037
  417. data/public/avo-assets/avo.base.js.map +0 -7
@@ -1,35 +0,0 @@
1
- <svg width="248" height="287" viewBox="0 0 248 287" fill="none" xmlns="http://www.w3.org/2000/svg" data-target="grid-empty-state-svg">
2
- <path d="M124 270.227C192.483 270.227 248 214.71 248 146.227C248 77.7433 192.483 22.2266 124 22.2266C55.5167 22.2266 0 77.7433 0 146.227C0 214.71 55.5167 270.227 124 270.227Z" fill="rgb(var(--color-primary-100))"/>
3
- <g filter="rgb(var(--color-primary-100))">
4
- <path d="M195.093 93.3198H52.9068C48.3412 93.3198 44.6401 97.0209 44.6401 101.586V275.186C44.6401 279.752 48.3412 283.453 52.9068 283.453H195.093C199.659 283.453 203.36 279.752 203.36 275.186V101.586C203.36 97.0209 199.659 93.3198 195.093 93.3198Z" fill="white"/>
5
- </g>
6
- <path d="M107.467 118.12H64.48C61.7407 118.12 59.52 120.34 59.52 123.08C59.52 125.819 61.7407 128.04 64.48 128.04H107.467C110.206 128.04 112.427 125.819 112.427 123.08C112.427 120.34 110.206 118.12 107.467 118.12Z" fill="rgb(var(--color-primary-100))"/>
7
- <path d="M137.227 139.613H64.48C61.7407 139.613 59.52 141.834 59.52 144.573C59.52 147.312 61.7407 149.533 64.48 149.533H137.227C139.966 149.533 142.187 147.312 142.187 144.573C142.187 141.834 139.966 139.613 137.227 139.613Z" fill="rgb(var(--color-primary-100))" opacity="0.6"/>
8
- <path d="M107.467 162.76H64.48C61.7407 162.76 59.52 164.981 59.52 167.72C59.52 170.459 61.7407 172.68 64.48 172.68H107.467C110.206 172.68 112.427 170.459 112.427 167.72C112.427 164.981 110.206 162.76 107.467 162.76Z" fill="rgb(var(--color-primary-100))"/>
9
- <path d="M137.227 184.253H64.48C61.7407 184.253 59.52 186.474 59.52 189.213C59.52 191.953 61.7407 194.173 64.48 194.173H137.227C139.966 194.173 142.187 191.953 142.187 189.213C142.187 186.474 139.966 184.253 137.227 184.253Z" fill="rgb(var(--color-primary-100))" opacity="0.6"/>
10
- <path d="M107.467 207.4H64.48C61.7407 207.4 59.52 209.621 59.52 212.36C59.52 215.099 61.7407 217.32 64.48 217.32H107.467C110.206 217.32 112.427 215.099 112.427 212.36C112.427 209.621 110.206 207.4 107.467 207.4Z" fill="rgb(var(--color-primary-100))"/>
11
- <path d="M137.227 228.893H64.48C61.7407 228.893 59.52 231.114 59.52 233.853C59.52 236.592 61.7407 238.813 64.48 238.813H137.227C139.966 238.813 142.187 236.592 142.187 233.853C142.187 231.114 139.966 228.893 137.227 228.893Z" fill="rgb(var(--color-primary-100))" opacity="0.6"/>
12
- <g filter="url(#filter1_d_577_1090)">
13
- <path d="M195.093 9H52.9068C48.3412 9 44.6401 12.7011 44.6401 17.2667V66.8667C44.6401 71.4322 48.3412 75.1333 52.9068 75.1333H195.093C199.659 75.1333 203.36 71.4322 203.36 66.8667V17.2667C203.36 12.7011 199.659 9 195.093 9Z" fill="rgb(var(--color-primary-500))"/>
14
- </g>
15
- <path d="M107.467 27.1865H64.48C61.7407 27.1865 59.52 29.4072 59.52 32.1465C59.52 34.8859 61.7407 37.1065 64.48 37.1065H107.467C110.206 37.1065 112.427 34.8859 112.427 32.1465C112.427 29.4072 110.206 27.1865 107.467 27.1865Z" fill="rgb(var(--color-primary-100))"/>
16
- <path d="M137.227 48.6799H64.48C61.7407 48.6799 59.52 50.9006 59.52 53.6399C59.52 56.3793 61.7407 58.5999 64.48 58.5999H137.227C139.966 58.5999 142.187 56.3793 142.187 53.6399C142.187 50.9006 139.966 48.6799 137.227 48.6799Z" fill="white"/>
17
- <defs>
18
- <feFlood flood-opacity="0" result="BackgroundImageFix"/>
19
- <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
20
- <feOffset dy="-3"/>
21
- <feGaussianBlur stdDeviation="3"/>
22
- <feColorMatrix type="matrix" values="0 0 0 0 0.788235 0 0 0 0 0.803922 0 0 0 0 0.85098 0 0 0 0.349 0"/>
23
- <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_577_1090"/>
24
- <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_577_1090" result="shape"/>
25
- <filter id="filter1_d_577_1090" x="38.6401" y="0" width="170.72" height="78.1333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
26
- <feFlood flood-opacity="0" result="BackgroundImageFix"/>
27
- <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
28
- <feOffset dy="-3"/>
29
- <feGaussianBlur stdDeviation="3"/>
30
- <feColorMatrix type="matrix" values="0 0 0 0 0.788235 0 0 0 0 0.803922 0 0 0 0 0.85098 0 0 0 0.349 0"/>
31
- <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_577_1090"/>
32
- <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_577_1090" result="shape"/>
33
- </filter>
34
- </defs>
35
- </svg>
@@ -1,3 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
2
- <path stroke-linecap="round" stroke-linejoin="round" d="M9 6.75V15m6-6v8.25m.503 3.498l4.875-2.437c.381-.19.622-.58.622-1.006V4.82c0-.836-.88-1.38-1.628-1.006l-3.869 1.934c-.317.159-.69.159-1.006 0L9.503 3.252a1.125 1.125 0 00-1.006 0L3.622 5.689C3.24 5.88 3 6.27 3 6.695V19.18c0 .836.88 1.38 1.628 1.006l3.869-1.934c.317-.159.69-.159 1.006 0l4.994 2.497c.317.158.69.158 1.006 0z"/>
3
- </svg>
@@ -1,46 +0,0 @@
1
- <div class="relative flex-1 flex flex-col justify-between h-full"
2
- data-controller="dashboard-card"
3
- data-dashboard-card-target="card"
4
- data-refresh-every="<%= card.refresh_every %>"
5
- data-card-id="<%= card.id %>"
6
- data-card-index="<%= card.index %>">
7
- <% if card.class.display_header %>
8
- <div class="px-4 pt-4">
9
- <div class="flex justify-between items-center min-h-6">
10
- <div class="text-base font-bold text-gray-700 leading-none">
11
- <%= card.label %>
12
- </div>
13
- <div data-controller="select">
14
- <% if card.type.in?([:metric, :chartkick, :partial]) && card.ranges.present? %>
15
- <%= select_tag "#{card.id}_#{card.index}_range", options_for_select(card.ranges, card.range),
16
- class: 'appearance-none inline-flex bg-blue-gray-100 disabled:bg-blue-gray-300 disabled:cursor-not-allowed focus:bg-white text-sm text-blue-gray-700 disabled:text-blue-gray-700 leading-none rounded-md py-px px-2 leading-tight border outline-none outline w-24',
17
- data: {
18
- target: 'select',
19
- action: 'change->select#onChange'
20
- }
21
- %>
22
- <% end %>
23
- </div>
24
- </div>
25
- </div>
26
- <% end %>
27
- <% if card.type == :chartkick %>
28
- <%= render 'chartkick_card', card: card %>
29
- <% elsif card.type === :partial %>
30
- <%= render card.class.partial %>
31
- <% elsif card.type === :metric %>
32
- <div class="flex-1 flex px-4 pb-4">
33
- <%= render 'metric_card', card: card %>
34
- </div>
35
- <% end %>
36
- <% if card.description.present? %>
37
- <%= content_tag :div, class: "absolute inset-auto bottom-0 right-0 mb-4 mr-4",
38
- title: card.description,
39
- data: {
40
- target: 'card-description',
41
- tippy: 'tooltip',
42
- } do %>
43
- <%= helpers.svg 'heroicons/solid/information-circle', class: 'h-4 text-gray-500 cursor-pointer' %>
44
- <% end %>
45
- <% end %>
46
- </div>
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::CardComponent < ViewComponent::Base
4
- attr_reader :card
5
-
6
- def initialize(card: nil)
7
- @card = card
8
-
9
- init_card
10
- end
11
-
12
- def render?
13
- card.present?
14
- end
15
-
16
- # Initializing the card byt running the query method.
17
- # We'll still keep the query block around for compatibility reasons.
18
- def init_card
19
- if card.respond_to? :query
20
- card.query
21
- elsif card.query_block.present?
22
- card.compute_result
23
- end
24
- end
25
- end
@@ -1,9 +0,0 @@
1
- <% if invisible? %>
2
- <div class="relative col-span-full gap-0"></div>
3
- <% else %>
4
- <div class="relative col-span-full border-t border-gray-300 my-4">
5
- <% if label.present? %>
6
- <div class="absolute inset-auto -translate-y-1/2 -translate-x-1/2 ml-1/2 z-20 text-xs font-semibold uppercase leading-none text-gray-500 bg-application px-2"><%= label %></div>
7
- <% end %>
8
- </div>
9
- <% end %>
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Dashboards::DividerComponent < ViewComponent::Base
4
- attr_reader :divider
5
-
6
- delegate :label, to: :divider
7
-
8
- def initialize(divider: nil)
9
- @divider = divider
10
- end
11
-
12
- def render?
13
- @divider.present?
14
- end
15
-
16
- def invisible?
17
- @divider.invisible
18
- end
19
- end
@@ -1,7 +0,0 @@
1
- <%= field_wrapper **field_wrapper_args do %>
2
- <%= @form.text_field @field.id,
3
- value: field.value.to_s,
4
- class: classes("w-full"),
5
- placeholder: @field.placeholder,
6
- disabled: disabled? %>
7
- <% end %>
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::AreaField::EditComponent < Avo::Fields::EditComponent
4
- end
@@ -1,8 +0,0 @@
1
- <%= field_wrapper **field_wrapper_args do %>
2
- <% if field.value.present? %>
3
- <%= area_map field.map_data, **field.mapkick_options %>
4
- <% else %>
5
-
6
- <% end %>
7
- <% end %>
8
-
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::AreaField::ShowComponent < Avo::Fields::ShowComponent
4
- end
@@ -1,47 +0,0 @@
1
- <div data-controller="search" class="resource-search flex items-center h-full w-full" data-turbo-remove-before-cache>
2
- <div class="w-full hidden"
3
- data-search-target="autocomplete"
4
- data-search-resource="<%= @model_key %>"
5
- data-translation-keys='{"no_item_found": "<%= I18n.translate 'avo.no_item_found' %>"}'
6
- data-via-association="belongs_to"
7
- data-via-association-id="<%= @field.id %>"
8
- data-via-reflection-id="<%= @field.model.id %>"
9
- data-via-reflection-class="<%= @field.model.class.to_s %>"
10
- data-via-parent-resource-id="<%= params[:via_resource_id] %>"
11
- data-via-parent-resource-class="<%= params[:via_relation_class] %>"
12
- data-via-relation="<%= params[:via_relation] %>"
13
- ></div>
14
- <div class="relative w-full" autocomplete="off">
15
- <%= @form.text_field @foreign_key,
16
- class: classes,
17
- # This instructs the search_controller if it should enable/disabled this field when the user switches polymorphic associations
18
- # It should not enable the field if the record is being created through an association
19
- data: {
20
- 'search-target': 'button clearValue',
21
- 'should-be-disabled': @disabled,
22
- **@field.get_html(:data, view: view, element: :input)
23
- },
24
- disabled: true,
25
- placeholder: @field.placeholder,
26
- style: @field.get_html(:style, view: view, element: :input),
27
- type: :text,
28
- value: field_label %>
29
- <% unless @disabled %>
30
- <button class="absolute top-1/2 left-auto right-3 mr-px -mt-2 cursor-pointer hidden text-gray-500"
31
- type="button"
32
- data-tippy="tooltip"
33
- data-search-target="clearButton"
34
- title="<%= I18n.translate 'avo.clear_value' %>"
35
- data-action="click->search#clearValue"
36
- ><%= helpers.svg 'x', class: 'h-4' %>
37
- </button>
38
- <% end %>
39
- </div>
40
- <%= @form.hidden_field @foreign_key,
41
- value: field_value,
42
- data: {
43
- 'search-target': 'hiddenId clearValue',
44
- **@field.get_html(:data, view: view, element: :input)
45
- }
46
- %>
47
- </div>
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::BelongsToField::AutocompleteComponent < ViewComponent::Base
4
- attr_reader :classes
5
- attr_reader :view
6
-
7
- def initialize(form:, field:, model_key:, foreign_key:, disabled: false, type: nil, resource: nil, polymorphic_record: nil, view: nil, style: nil, classes: nil)
8
- @form = form
9
- @field = field
10
- @type = type
11
- @view = view
12
- @model_key = model_key
13
- @foreign_key = foreign_key
14
- @resource = resource
15
- @disabled = disabled
16
- @style = style
17
- @classes = classes
18
- @polymorphic_record = polymorphic_record
19
- end
20
-
21
- def field_label
22
- result = @field.field_label
23
-
24
- # New records won't have the value (instantiated model) present but the polymorphic_type and polymorphic_id prefilled
25
- if should_prefill?
26
- result = @field.value&.class == @type ? @field.field_label : nil
27
- end
28
-
29
- result
30
- end
31
-
32
- def field_value
33
- result = @field.field_value
34
-
35
- # New records won't have the value (instantiated model) present but the polymorphic_type and polymorphic_id prefilled
36
- if should_prefill?
37
- result = @field.value&.class == @type ? @field.field_value : nil
38
- end
39
-
40
- result
41
- end
42
-
43
- def reflection_class
44
- has_polymorphic_association? ? polymorphic_class : @resource.model_class._reflections[@field.id.to_s].klass
45
- end
46
-
47
- private
48
-
49
- def should_prefill?
50
- # default this conditional to true
51
- is_polymorphic = true
52
-
53
- # if this is a field that can be polymorphic (belongs_to)
54
- if @field.respond_to? :is_polymorphic?
55
- is_polymorphic = @field.is_polymorphic?
56
- end
57
-
58
- is_polymorphic && searchable? && !(new_record? && has_polymorphic_association?)
59
- end
60
-
61
- def searchable?
62
- @field.searchable
63
- end
64
-
65
- def new_record?
66
- @resource.model.new_record?
67
- end
68
-
69
- def has_polymorphic_association?
70
- polymorphic_class.present? && polymorphic_id.present?
71
- end
72
-
73
- # Get the polymorphic class
74
- def polymorphic_class
75
- @resource.model["#{@field.foreign_key}_type"]
76
- end
77
-
78
- # Get the polymorphic id
79
- def polymorphic_id
80
- @resource.model["#{@field.foreign_key}_id"]
81
- end
82
-
83
- # Get the resource for that polymorphic class
84
- def polymorphic_resource
85
- ::Avo::App.get_resource_by_model_name polymorphic_class
86
- end
87
-
88
- # Extract the needed fields to identify the record for polymorphic associations
89
- def polymorphic_fields
90
- {
91
- id: polymorphic_resource.id,
92
- label: polymorphic_resource.title
93
- }
94
- end
95
- end
@@ -1,29 +0,0 @@
1
- <div class="flex">
2
- <% if can_download_file? %>
3
- <%= a_link Rails.application.routes.url_helpers.rails_blob_path(file, only_path: true, disposition: :attachment),
4
- icon: 'heroicons/outline/download',
5
- color: :primary,
6
- download: true,
7
- class: 'text-center',
8
- title: t('avo.download_file'),
9
- data: { tippy: :tooltip },
10
- compact: true,
11
- size: :xs %>
12
- <% end %>
13
- </div>
14
- <div>
15
- <% if can_delete_file? %>
16
- <%= a_link destroy_path,
17
- icon: 'heroicons/outline/trash',
18
- color: :red,
19
- compact: true,
20
- size: :xs,
21
- class: 'text-center',
22
- title: t('avo.delete_file', item: file.filename),
23
- data: {
24
- turbo_method: :delete,
25
- turbo_confirm: t('avo.are_you_sure'),
26
- tippy: :tooltip
27
- } %>
28
- <% end %>
29
- </div>
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::Common::Files::ControlsComponent < ViewComponent::Base
4
- include Avo::ApplicationHelper
5
- include Avo::Fields::Concerns::FileAuthorization
6
-
7
- attr_reader :file, :field, :resource
8
- delegate :id, to: :field
9
-
10
- def initialize(field:, file:, resource:)
11
- @field = field
12
- @file = file
13
- @resource = resource
14
- end
15
-
16
- def destroy_path
17
- Avo::Services::URIService.parse(@resource.record_path).append_paths("active_storage_attachments", id, file.id).to_s
18
- end
19
- end
@@ -1,20 +0,0 @@
1
- <%= content_tag :div, class: wrapper_classes do %>
2
- <%= turbo_frame_tag @field.id do %>
3
- <% unless @field.hide_view_type_switcher %>
4
- <div class="justify-self-end flex justify-end items-center space-x-3">
5
- <%= render partial: 'avo/partials/view_toggle_button',
6
- locals: {
7
- available_view_types: available_view_types,
8
- view_type: view_type,
9
- turbo_frame: @field.id,
10
- }
11
- %>
12
- </div>
13
- <% end %>
14
- <div class="<%= classes %>">
15
- <% @field.value.attachments.each do |file| %>
16
- <%= render view_type_component(file) %>
17
- <% end %>
18
- </div>
19
- <% end %>
20
- <% end %>
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::Common::Files::ListViewerComponent < ViewComponent::Base
4
- include Turbo::FramesHelper
5
-
6
- attr_reader :field, :resource
7
-
8
- def initialize(field:, resource:)
9
- @field = field
10
- @resource = resource
11
- end
12
-
13
- def classes
14
- base_classes = "py-4 rounded-xl max-w-full"
15
-
16
- view_type_classes = if view_type == :list
17
- "flex flex-col space-y-2"
18
- else
19
- "relative grid xs:grid-cols-2 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-6 gap-6"
20
- end
21
-
22
- "#{base_classes} #{view_type_classes}"
23
- end
24
-
25
- def wrapper_classes
26
- (field.stacked && !field.hide_view_type_switcher) ? "-mt-9" : ""
27
- end
28
-
29
- def available_view_types
30
- [:list, :grid]
31
- end
32
-
33
- def view_type_component(file)
34
- component = "Avo::Fields::Common::Files::ViewType::#{view_type.to_s.capitalize}ItemComponent".constantize
35
- component.new(field: field, resource: resource, file: file, extra_classes: "aspect-video")
36
- end
37
-
38
- def view_type
39
- @view_type ||= (resource.params.dig(:view_type) || field.view_type).to_sym
40
- end
41
- end
@@ -1,27 +0,0 @@
1
- <div id="<%= dom_id file %>" class="relative min-h-full max-w-full flex-1 flex flex-col justify-between space-y-2">
2
- <% if file.present? %>
3
- <div class="flex h-full">
4
- <% if file.representable? && is_image? %>
5
- <%= image_tag helpers.main_app.url_for(file), class: "rounded-lg max-w-full #{@extra_classes}" %>
6
- <% elsif is_audio? %>
7
- <%= audio_tag(helpers.main_app.url_for(file), controls: true, preload: false, class: 'w-full') %>
8
- <% elsif is_video? %>
9
- <%= video_tag(helpers.main_app.url_for(file), controls: true, preload: false, class: 'w-full') %>
10
- <% else %>
11
- <div class="relative flex flex-col justify-evenly items-center px-2 rounded-lg border bg-white border-gray-500 min-h-24">
12
- <div class="flex flex-col justify-center items-center w-full">
13
- <%= helpers.svg 'document-text', class: 'h-10 text-gray-600 mb-2' %>
14
- </div>
15
- </div>
16
- <% end %>
17
- <% if field.display_filename %>
18
- <span class="text-gray-500 mt-1 text-sm truncate" title="<%= file.filename %>"><%= file.filename %></span>
19
- <% end %>
20
- </div>
21
- <div class="flex space-x-2">
22
- <%= render Avo::Fields::Common::Files::ControlsComponent.new(field: field, file: file, resource: resource) %>
23
- </div>
24
- <% else %>
25
-
26
- <% end %>
27
- </div>
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::Common::Files::ViewType::GridItemComponent < ViewComponent::Base
4
- attr_reader :field, :resource
5
-
6
- def initialize(field:, resource:, file: nil, extra_classes: nil)
7
- @file = file
8
- @field = field
9
- @resource = resource
10
- @extra_classes = extra_classes
11
- end
12
-
13
- def id
14
- field.id
15
- end
16
-
17
- def file
18
- @file || field.value.attachment
19
- rescue
20
- nil
21
- end
22
-
23
- def is_image?
24
- file.image? || field.is_image
25
- rescue
26
- false
27
- end
28
-
29
- def is_audio?
30
- file.audio? || field.is_audio
31
- rescue
32
- false
33
- end
34
-
35
- def is_video?
36
- file.video? || field.is_video
37
- rescue
38
- false
39
- end
40
-
41
- def render?
42
- record_persisted?
43
- end
44
-
45
- # If model is not persistent blob is automatically destroyed otherwise it can be "lost" on storage
46
- def record_persisted?
47
- return true if @resource.model.persisted?
48
-
49
- ActiveStorage::Blob.destroy(file.blob_id) if file.blob_id.present?
50
- false
51
- end
52
- end
@@ -1,22 +0,0 @@
1
- <div id="<%= dom_id file %>" class="relative min-h-full max-w-full flex-1 flex">
2
- <% if file.present? %>
3
- <div class="grid grid-cols-6 gap-2 items-center max-w-full w-full">
4
- <div class="col-span-4 flex-1 flex flex-row items-center text-gray-700 overflow-x-auto mac-styled-scrollbar ">
5
- <div class="rounded-full bg-slate-100 border border-gray-500 p-1.5 flex items-center justify-center">
6
- <%= helpers.svg icon_for_file, class: "h-5 text-gray-600" %>
7
- </div>
8
- <p class="items-center h-full p-2 flex-shrink-0">
9
- <%= file.filename %>
10
- </p>
11
- </div>
12
- <div class="text-gray-700 flex-shrink-0 text-sm">
13
- <%= helpers.number_to_human_size(file.byte_size) %>
14
- </div>
15
- <div class="flex space-x-2 justify-end col-span-1 flex-shrink-0">
16
- <%= render Avo::Fields::Common::Files::ControlsComponent.new(field: field, file: file, resource: resource) %>
17
- </div>
18
- </div>
19
- <% else %>
20
-
21
- <% end %>
22
- </div>
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::Common::Files::ViewType::ListItemComponent < Avo::Fields::Common::Files::ViewType::GridItemComponent
4
- def icon_for_file
5
- if is_image?
6
- "photo"
7
- elsif is_audio?
8
- "speaker-wave"
9
- elsif is_video?
10
- "video-camera"
11
- else
12
- "document"
13
- end
14
- end
15
- end
@@ -1,22 +0,0 @@
1
- <%= field_wrapper **field_wrapper_args do %>
2
- <% if field.value_as_array? %>
3
- <div class="flex gap-4">
4
- <%= @form.text_field @field.as_lat_long_field_id(:lat),
5
- value: @field.as_lat_long_value(:lat),
6
- class: classes("w-full"),
7
- placeholder: @field.as_lat_long_placeholder(:lat)
8
- %>
9
- <%= @form.text_field @field.as_lat_long_field_id(:long),
10
- value: @field.as_lat_long_value(:long),
11
- class: classes("w-full"),
12
- placeholder: @field.as_lat_long_placeholder(:long)
13
- %>
14
- </div>
15
- <% else %>
16
- <%= @form.text_field @field.id,
17
- value: @field.value,
18
- class: classes("w-full"),
19
- placeholder: @field.placeholder
20
- %>
21
- <% end %>
22
- <% end %>
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::LocationField::EditComponent < Avo::Fields::EditComponent
4
- end
@@ -1,7 +0,0 @@
1
- <%= field_wrapper **field_wrapper_args do %>
2
- <% if field.value_present? %>
3
- <%= js_map [{latitude: field.value[0], longitude: field.value[1]}], id: "location-map", zoom: field.zoom, controls: true %>
4
- <% else %>
5
-
6
- <% end %>
7
- <% end %>
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::LocationField::ShowComponent < Avo::Fields::ShowComponent
4
- end
@@ -1,35 +0,0 @@
1
- <%= field_wrapper **field_wrapper_args, data: {
2
- controller: "tags-field",
3
- tags_field_mode_value: @field.mode,
4
- tags_field_whitelist_items_value: @field.suggestions.to_json,
5
- tags_field_disallowed_items_value: @field.disallowed.to_json,
6
- tags_field_enforce_suggestions_value: @field.enforce_suggestions,
7
- tags_field_suggestions_max_items_value: @field.suggestions_max_items,
8
- tags_field_close_on_select_value: @field.close_on_select,
9
- tags_field_delimiters_value: @field.delimiters,
10
- tags_field_fetch_values_from_value: @field.fetch_values_from,
11
- } do %>
12
- <%# We use a dummy field so the back action from Turbo does not brake the field %>
13
- <%# dummy field %>
14
- <%= text_field_tag "#{@field.id}-dummy", '',
15
- class: classes("w-full"),
16
- data: {
17
- tags_field_target: :fakeInput,
18
- },
19
- disabled: disabled?,
20
- placeholder: @field.placeholder,
21
- style: @field.get_html(:style, view: view, element: :input),
22
- value: ''
23
- %>
24
- <%# real field %>
25
- <%= @form.text_field @field.id,
26
- class: classes("hidden w-full border-primary-500 focus-within:border-primary-500"),
27
- data: {
28
- tags_field_target: :input,
29
- },
30
- disabled: disabled?,
31
- placeholder: @field.placeholder,
32
- style: @field.get_html(:style, view: view, element: :input),
33
- value: @field.field_value.to_json
34
- %>
35
- <% end %>
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::TagsField::EditComponent < Avo::Fields::EditComponent
4
- end
@@ -1,10 +0,0 @@
1
- <%= index_field_wrapper **field_wrapper_args, flush: true do %>
2
- <div class="flex gap-1 items-center flex-nowrap">
3
- <% value.take(3).each do |item| %>
4
- <%= render Avo::Fields::TagsField::TagComponent.new(label: label_from_item(item)) %>
5
- <% end %>
6
- <% if value.count > 3 %>
7
- <%= render Avo::Fields::TagsField::TagComponent.new(label: '...', title: I18n.t('avo.x_items_more', count: value.count - 3)) %>
8
- <% end %>
9
- </div>
10
- <% end %>