avo 2.45.0 → 3.0.0.beta1

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 (371) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -25
  3. data/Gemfile.lock +179 -147
  4. data/README.md +1 -1
  5. data/app/assets/stylesheets/avo.base.css +0 -1
  6. data/app/assets/svgs/font.svg +1 -0
  7. data/app/assets/svgs/triangle-up.svg +1 -0
  8. data/app/components/avo/actions_component.html.erb +19 -5
  9. data/app/components/avo/actions_component.rb +37 -17
  10. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  11. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  12. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  14. data/app/components/avo/base_component.rb +15 -12
  15. data/app/components/avo/button_component.rb +20 -3
  16. data/app/components/avo/empty_state_component.rb +1 -1
  17. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  18. data/app/components/avo/field_wrapper_component.rb +8 -8
  19. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  20. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  21. data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
  22. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  23. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  24. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  25. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  26. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  27. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  28. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  29. data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
  30. data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
  31. data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
  32. data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
  33. data/app/components/avo/fields/edit_component.rb +1 -1
  34. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  35. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  39. data/app/components/avo/fields/index_component.rb +5 -5
  40. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  41. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  42. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  43. data/app/components/avo/fields/show_component.rb +4 -1
  44. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  45. data/app/components/avo/filters_component.html.erb +9 -3
  46. data/app/components/avo/filters_component.rb +4 -4
  47. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  48. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  49. data/app/components/avo/index/grid_item_component.rb +43 -16
  50. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  51. data/app/components/avo/index/resource_controls_component.rb +124 -17
  52. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  53. data/app/components/avo/index/resource_grid_component.rb +5 -2
  54. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  55. data/app/components/avo/index/resource_map_component.rb +3 -3
  56. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  57. data/app/components/avo/index/resource_table_component.rb +14 -20
  58. data/app/components/avo/index/table_row_component.html.erb +8 -4
  59. data/app/components/avo/index/table_row_component.rb +3 -2
  60. data/app/components/avo/item_switcher_component.rb +2 -2
  61. data/app/components/avo/modal_component.html.erb +7 -12
  62. data/app/components/avo/modal_component.rb +0 -21
  63. data/app/components/avo/paginator_component.html.erb +40 -29
  64. data/app/components/avo/paginator_component.rb +5 -23
  65. data/app/components/avo/panel_component.html.erb +8 -6
  66. data/app/components/avo/referrer_params_component.html.erb +1 -2
  67. data/app/components/avo/resource_component.rb +189 -14
  68. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  69. data/app/components/avo/resource_sidebar_component.rb +1 -1
  70. data/app/components/avo/sidebar/link_component.rb +1 -1
  71. data/app/components/avo/sidebar_component.html.erb +10 -3
  72. data/app/components/avo/sidebar_component.rb +5 -3
  73. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  74. data/app/components/avo/tab_group_component.html.erb +13 -7
  75. data/app/components/avo/tab_group_component.rb +1 -6
  76. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  77. data/app/components/avo/tab_switcher_component.rb +4 -39
  78. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  79. data/app/components/avo/views/resource_edit_component.rb +7 -18
  80. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  81. data/app/components/avo/views/resource_index_component.rb +62 -12
  82. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  83. data/app/components/avo/views/resource_show_component.rb +6 -11
  84. data/app/controllers/avo/actions_controller.rb +27 -24
  85. data/app/controllers/avo/application_controller.rb +105 -151
  86. data/app/controllers/avo/associations_controller.rb +34 -43
  87. data/app/controllers/avo/attachments_controller.rb +4 -4
  88. data/app/controllers/avo/base_controller.rb +102 -102
  89. data/app/controllers/avo/debug_controller.rb +17 -5
  90. data/app/controllers/avo/home_controller.rb +1 -1
  91. data/app/controllers/avo/search_controller.rb +30 -51
  92. data/app/controllers/avo/team_users_controller.rb +4 -0
  93. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  94. data/app/helpers/avo/application_helper.rb +15 -9
  95. data/app/helpers/avo/resources_helper.rb +1 -1
  96. data/app/helpers/avo/url_helpers.rb +27 -11
  97. data/app/javascript/avo.base.js +1 -0
  98. data/app/javascript/js/application.js +0 -3
  99. data/app/javascript/js/controllers/action_controller.js +5 -3
  100. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  101. data/app/javascript/js/controllers/filter_controller.js +1 -1
  102. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  103. data/app/javascript/js/controllers/preview_controller.js +24 -0
  104. data/app/javascript/js/controllers/search_controller.js +2 -2
  105. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  106. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  107. data/app/javascript/js/controllers.js +10 -6
  108. data/app/javascript/js/custom-stream-actions.js +15 -0
  109. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  110. data/app/views/avo/actions/show.html.erb +9 -6
  111. data/app/views/avo/associations/new.html.erb +2 -2
  112. data/app/views/avo/base/index.html.erb +3 -2
  113. data/app/views/avo/base/new.html.erb +2 -1
  114. data/app/views/avo/base/preview.html.erb +19 -0
  115. data/app/views/avo/base/show.html.erb +1 -1
  116. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  117. data/app/views/avo/debug/report.html.erb +32 -17
  118. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  119. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  120. data/app/views/avo/partials/_footer.html.erb +1 -1
  121. data/app/views/avo/partials/_javascript.html.erb +5 -0
  122. data/app/views/avo/partials/_logo.html.erb +1 -1
  123. data/app/views/avo/partials/_navbar.html.erb +3 -5
  124. data/app/views/avo/partials/_table_header.html.erb +5 -11
  125. data/app/views/layouts/avo/application.html.erb +4 -2
  126. data/avo.gemspec +7 -7
  127. data/bin/dev +1 -1
  128. data/bin/prod +0 -0
  129. data/config/i18n-tasks.yml +1 -1
  130. data/config/initializers/pagy.rb +0 -2
  131. data/config/master.key +1 -0
  132. data/config/routes.rb +6 -10
  133. data/db/factories.rb +7 -1
  134. data/lib/avo/action_model.rb +20 -0
  135. data/lib/avo/asset_manager.rb +30 -0
  136. data/lib/avo/base_action.rb +57 -41
  137. data/lib/avo/base_resource.rb +263 -226
  138. data/lib/avo/base_resource_tool.rb +9 -16
  139. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  140. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  141. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  142. data/lib/avo/concerns/has_controls.rb +37 -0
  143. data/lib/avo/concerns/has_description.rb +23 -0
  144. data/lib/avo/concerns/has_item_type.rb +42 -0
  145. data/lib/avo/concerns/has_items.rb +325 -0
  146. data/lib/avo/concerns/is_resource_item.rb +24 -36
  147. data/lib/avo/concerns/is_visible.rb +15 -0
  148. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  149. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  150. data/lib/avo/configuration/branding.rb +0 -12
  151. data/lib/avo/configuration.rb +1 -37
  152. data/lib/avo/current.rb +39 -0
  153. data/lib/avo/dsl/field_parser.rb +1 -1
  154. data/lib/avo/dynamic_router.rb +18 -3
  155. data/lib/avo/engine.rb +35 -30
  156. data/lib/avo/error_manager.rb +25 -0
  157. data/lib/avo/execution_context.rb +10 -14
  158. data/lib/avo/fields/badge_field.rb +1 -1
  159. data/lib/avo/fields/base_field.rb +91 -105
  160. data/lib/avo/fields/belongs_to_field.rb +18 -22
  161. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  162. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  163. data/lib/avo/fields/concerns/has_default.rb +1 -5
  164. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  165. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  166. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  167. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  168. data/lib/avo/fields/concerns/is_required.rb +5 -7
  169. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  170. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  171. data/lib/avo/fields/country_field.rb +4 -0
  172. data/lib/avo/fields/date_time_field.rb +1 -5
  173. data/lib/avo/fields/field_manager.rb +55 -0
  174. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  175. data/lib/avo/fields/has_base_field.rb +12 -15
  176. data/lib/avo/fields/has_many_field.rb +5 -2
  177. data/lib/avo/fields/has_one_field.rb +6 -10
  178. data/lib/avo/fields/heading_field.rb +4 -1
  179. data/lib/avo/fields/hidden_field.rb +1 -1
  180. data/lib/avo/fields/id_field.rb +1 -1
  181. data/lib/avo/fields/location_field.rb +8 -8
  182. data/lib/avo/fields/password_field.rb +1 -1
  183. data/lib/avo/fields/preview_field.rb +14 -0
  184. data/lib/avo/fields/select_field.rb +12 -8
  185. data/lib/avo/fields/status_field.rb +4 -0
  186. data/lib/avo/filters/base_filter.rb +8 -4
  187. data/lib/avo/html/builder.rb +7 -8
  188. data/lib/avo/item_grapher.rb +78 -0
  189. data/lib/avo/licensing/h_q.rb +7 -66
  190. data/lib/avo/licensing/license.rb +1 -1
  191. data/lib/avo/licensing/pro_license.rb +1 -7
  192. data/lib/avo/loaders/fields_loader.rb +7 -1
  193. data/lib/avo/plugin.rb +16 -0
  194. data/lib/avo/plugin_manager.rb +56 -0
  195. data/lib/avo/prefixed_test_helpers.rb +20 -0
  196. data/lib/avo/reloader.rb +3 -0
  197. data/lib/avo/resources/controls/actions_list.rb +7 -12
  198. data/lib/avo/resources/controls/attach_button.rb +15 -0
  199. data/lib/avo/resources/controls/back_button.rb +1 -1
  200. data/lib/avo/resources/controls/base_control.rb +15 -49
  201. data/lib/avo/resources/controls/create_button.rb +15 -0
  202. data/lib/avo/resources/controls/delete_button.rb +5 -1
  203. data/lib/avo/resources/controls/detach_button.rb +4 -1
  204. data/lib/avo/resources/controls/edit_button.rb +4 -1
  205. data/lib/avo/resources/controls/order_controls.rb +8 -0
  206. data/lib/avo/resources/controls/save_button.rb +13 -0
  207. data/lib/avo/resources/controls/show_button.rb +15 -0
  208. data/lib/avo/resources/items/holder.rb +84 -0
  209. data/lib/avo/resources/items/item_group.rb +49 -0
  210. data/lib/avo/resources/items/main_panel.rb +2 -0
  211. data/lib/avo/resources/items/panel.rb +2 -0
  212. data/lib/avo/resources/items/row.rb +54 -0
  213. data/lib/avo/resources/items/sidebar.rb +47 -0
  214. data/lib/avo/resources/items/tab.rb +60 -0
  215. data/lib/avo/resources/items/tab_group.rb +68 -0
  216. data/lib/avo/resources/resource_manager.rb +174 -0
  217. data/lib/avo/services/authorization_service.rb +11 -110
  218. data/lib/avo/services/debug_service.rb +93 -0
  219. data/lib/avo/services/telemetry_service.rb +85 -0
  220. data/lib/avo/test_helpers.rb +362 -0
  221. data/lib/avo/tools/tool_manager.rb +30 -0
  222. data/lib/avo/version.rb +1 -1
  223. data/lib/avo.rb +115 -24
  224. data/lib/generators/avo/action_generator.rb +8 -8
  225. data/lib/generators/avo/card_generator.rb +27 -0
  226. data/lib/generators/avo/filter_generator.rb +8 -8
  227. data/lib/generators/avo/resource_generator.rb +4 -4
  228. data/lib/generators/avo/scope_generator.rb +15 -0
  229. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  230. data/lib/generators/avo/templates/action.tt +8 -6
  231. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  232. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  233. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  234. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  235. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  236. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  237. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  238. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  239. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  240. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  241. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  242. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  243. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  244. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  245. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  246. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  247. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  248. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  249. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  250. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  251. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  252. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  253. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  254. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  255. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  256. data/lib/generators/avo/templates/scope.tt +6 -0
  257. data/lib/generators/avo/templates/tool/view.tt +2 -2
  258. data/lib/tasks/avo_tasks.rake +27 -0
  259. data/public/avo-assets/avo.base.css +1810 -1189
  260. data/public/avo-assets/avo.base.js +217 -305
  261. data/public/avo-assets/avo.base.js.map +3 -3
  262. data/public/avo-assets/avo.css +9744 -0
  263. data/public/avo-assets/avo.js +513 -0
  264. data/public/avo-assets/avo.js.map +7 -0
  265. metadata +96 -137
  266. data/app/assets/stylesheets/css/tags.css +0 -32
  267. data/app/components/avo/card_component.html.erb +0 -46
  268. data/app/components/avo/card_component.rb +0 -25
  269. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  270. data/app/components/avo/dashboards/divider_component.rb +0 -19
  271. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  272. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  273. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  274. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  275. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  276. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  277. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  278. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  279. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  280. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  281. data/app/components/avo/index/ordering/base_component.rb +0 -9
  282. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  283. data/app/components/avo/index/ordering/button_component.rb +0 -23
  284. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  285. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  286. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  287. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  288. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  289. data/app/controllers/avo/dashboards_controller.rb +0 -22
  290. data/app/controllers/avo/reorder_controller.rb +0 -25
  291. data/app/javascript/js/controllers/base_controller.js +0 -22
  292. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  293. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  294. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  295. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  296. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  297. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  298. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  299. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  300. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  301. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  302. data/app/views/avo/dashboards/show.html.erb +0 -38
  303. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  304. data/app/views/avo/partials/_global_search.html.erb +0 -19
  305. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  306. data/lib/avo/app.rb +0 -237
  307. data/lib/avo/base_card.rb +0 -161
  308. data/lib/avo/concerns/fetches_things.rb +0 -150
  309. data/lib/avo/concerns/handles_field_args.rb +0 -47
  310. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  311. data/lib/avo/concerns/has_fields.rb +0 -334
  312. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  313. data/lib/avo/concerns/pagination.rb +0 -53
  314. data/lib/avo/concerns/policy_helpers.rb +0 -31
  315. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  316. data/lib/avo/concerns/visible_items.rb +0 -51
  317. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  318. data/lib/avo/dashboards/base_divider.rb +0 -35
  319. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  320. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  321. data/lib/avo/dashboards/metric_card.rb +0 -9
  322. data/lib/avo/dashboards/partial_card.rb +0 -7
  323. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  324. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  325. data/lib/avo/fields/tags_field.rb +0 -102
  326. data/lib/avo/grid_collector.rb +0 -42
  327. data/lib/avo/hosts/association_scope_host.rb +0 -8
  328. data/lib/avo/hosts/base_host.rb +0 -25
  329. data/lib/avo/hosts/card_visibility.rb +0 -20
  330. data/lib/avo/hosts/dashboard_card.rb +0 -22
  331. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  332. data/lib/avo/hosts/ordering.rb +0 -22
  333. data/lib/avo/hosts/record_host.rb +0 -7
  334. data/lib/avo/hosts/resource_record_host.rb +0 -7
  335. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  336. data/lib/avo/hosts/search_scope_host.rb +0 -7
  337. data/lib/avo/hosts/view_record_host.rb +0 -7
  338. data/lib/avo/hosts/visibility_host.rb +0 -12
  339. data/lib/avo/items_holder.rb +0 -96
  340. data/lib/avo/main_panel.rb +0 -3
  341. data/lib/avo/menu/base_item.rb +0 -25
  342. data/lib/avo/menu/builder.rb +0 -82
  343. data/lib/avo/menu/dashboard.rb +0 -22
  344. data/lib/avo/menu/group.rb +0 -2
  345. data/lib/avo/menu/link.rb +0 -6
  346. data/lib/avo/menu/menu.rb +0 -2
  347. data/lib/avo/menu/resource.rb +0 -22
  348. data/lib/avo/menu/section.rb +0 -2
  349. data/lib/avo/panel.rb +0 -24
  350. data/lib/avo/panel_builder.rb +0 -25
  351. data/lib/avo/resources/controls/action.rb +0 -38
  352. data/lib/avo/resources/controls/execution_context.rb +0 -58
  353. data/lib/avo/resources/controls/items_holder.rb +0 -19
  354. data/lib/avo/resources/controls/link_to.rb +0 -27
  355. data/lib/avo/row.rb +0 -26
  356. data/lib/avo/row_builder.rb +0 -24
  357. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  358. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  359. data/lib/avo/sidebar.rb +0 -30
  360. data/lib/avo/sidebar_builder.rb +0 -24
  361. data/lib/avo/tab.rb +0 -72
  362. data/lib/avo/tab_builder.rb +0 -25
  363. data/lib/avo/tab_group.rb +0 -42
  364. data/lib/avo/tab_group_builder.rb +0 -43
  365. data/lib/avo/tools_manager.rb +0 -11
  366. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  367. data/lib/generators/avo/card/metric_generator.rb +0 -18
  368. data/lib/generators/avo/card/partial_generator.rb +0 -19
  369. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  370. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  371. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -1,8 +1,8 @@
1
1
  <%= field_wrapper **field_wrapper_args do %>
2
2
  <div class="flex items-center">
3
3
  <div class="space-y-2">
4
- <% model_param_key = model_name_from_record_or_class(@resource.model).param_key %>
5
- <%= check_box_tag "#{model_name_from_record_or_class(@resource.model).param_key}[#{@field.id}][]", '', true, { class: "hidden" } %>
4
+ <% model_param_key = model_name_from_record_or_class(@resource.record).param_key %>
5
+ <%= check_box_tag "#{model_param_key}[#{@field.id}][]", '', true, { class: "hidden" } %>
6
6
  <% @field.options.each do |id, label| %>
7
7
  <%
8
8
  checked = false
@@ -18,7 +18,7 @@
18
18
  %>
19
19
  <label class="block">
20
20
  <%= check_box_tag "#{model_param_key}[#{@field.id}][]", id, checked, {
21
- class: "w-4 h-4 #{@field.get_html(:classes, view: view, element: :input)}",
21
+ class: "w-4 h-4 rounded checked:bg-primary-400 focus:checked:!bg-primary-400 #{@field.get_html(:classes, view: view, element: :input)}",
22
22
  data: @field.get_html(:data, view: view, element: :input),
23
23
  disabled: disabled?,
24
24
  id: "#{model_param_key}_#{@field.id}_#{id}",
@@ -1 +1,24 @@
1
- <span class="<%= classes %>" style="max-width: 120px;"><%= @value %></span>
1
+ <%
2
+ backgrounds = {
3
+ info: 'bg-blue-500',
4
+ success: 'bg-green-500',
5
+ danger: 'bg-red-500',
6
+ warning: 'bg-yellow-500',
7
+ }
8
+
9
+ label = @value
10
+ background = :info
11
+
12
+ @options.invert.each do |values, type|
13
+ if [values].flatten.map { |value| value }.include? @value
14
+ label = @value
15
+ background = type.to_sym
16
+ next
17
+ end
18
+ end
19
+
20
+ classes = 'whitespace-nowrap rounded-md uppercase px-2 py-1 text-xs font-bold block text-center truncate '
21
+
22
+ classes += "#{backgrounds[background]} text-white" if backgrounds[background].present?
23
+ %>
24
+ <span class="<%= classes %>" style="max-width: 120px;"><%= label %></span>
@@ -4,29 +4,5 @@ class Avo::Fields::Common::BadgeViewerComponent < ViewComponent::Base
4
4
  def initialize(value:, options:)
5
5
  @value = value
6
6
  @options = options
7
- @backgrounds = {
8
- info: "bg-blue-500",
9
- success: "bg-green-500",
10
- danger: "bg-red-500",
11
- warning: "bg-yellow-500",
12
- neutral: "bg-gray-500"
13
- }
14
- end
15
-
16
- def classes
17
- background = :info
18
-
19
- @options.invert.each do |values, type|
20
- if [values].flatten.map { |value| value }.include? @value
21
- background = type.to_sym
22
- next
23
- end
24
- end
25
-
26
- classes = "whitespace-nowrap rounded-md uppercase px-2 py-1 text-xs font-bold block text-center truncate "
27
-
28
- classes += "#{@backgrounds[background]} text-white" if @backgrounds[background].present?
29
-
30
- classes
31
7
  end
32
8
  end
@@ -6,8 +6,8 @@
6
6
  @options.each do |id, label|
7
7
  checked = @value.present? && @value[id.to_s].present?
8
8
  %>
9
- <div class="flex flex-nowrap">
10
- <%= render Avo::Fields::Common::BooleanCheckComponent.new checked: checked %>
9
+ <div class="flex flex-nowrap">
10
+ <%= render Avo::Fields::Common::BooleanCheckComponent.new checked: checked %>
11
11
  <div class="ml-px text-left py-px"><%= label %></div>
12
12
  </div>
13
13
  <% end %>
@@ -31,11 +31,11 @@ class Avo::Fields::Common::Files::ListViewerComponent < ViewComponent::Base
31
31
  end
32
32
 
33
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")
34
+ component = "Avo::Fields::Common::Files::ViewType::#{view_type.to_s.capitalize}Component".constantize
35
+ component.new(field: field, resource: resource, file: file)
36
36
  end
37
37
 
38
38
  def view_type
39
- @view_type ||= (resource.params.dig(:view_type) || field.view_type).to_sym
39
+ (resource.params.dig(:view_type) || field.view_type).to_sym
40
40
  end
41
41
  end
@@ -1,8 +1,8 @@
1
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
2
  <% if file.present? %>
3
- <div class="flex h-full">
3
+ <div class="flex flex-col justify-between h-full">
4
4
  <% if file.representable? && is_image? %>
5
- <%= image_tag helpers.main_app.url_for(file), class: "rounded-lg max-w-full #{@extra_classes}" %>
5
+ <%= image_tag helpers.main_app.url_for(file), class: 'rounded-lg object-cover w-full aspect-video' %>
6
6
  <% elsif is_audio? %>
7
7
  <%= audio_tag(helpers.main_app.url_for(file), controls: true, preload: false, class: 'w-full') %>
8
8
  <% elsif is_video? %>
@@ -1,13 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Avo::Fields::Common::Files::ViewType::GridItemComponent < ViewComponent::Base
3
+ class Avo::Fields::Common::Files::ViewType::GridComponent < ViewComponent::Base
4
4
  attr_reader :field, :resource
5
5
 
6
- def initialize(field:, resource:, file: nil, extra_classes: nil)
6
+ def initialize(field:, resource:, file: nil)
7
7
  @file = file
8
8
  @field = field
9
9
  @resource = resource
10
- @extra_classes = extra_classes
11
10
  end
12
11
 
13
12
  def id
@@ -42,9 +41,9 @@ class Avo::Fields::Common::Files::ViewType::GridItemComponent < ViewComponent::B
42
41
  record_persisted?
43
42
  end
44
43
 
45
- # If model is not persistent blob is automatically destroyed otherwise it can be "lost" on storage
44
+ # If record is not persistent blob is automatically destroyed otherwise it can be "lost" on storage
46
45
  def record_persisted?
47
- return true if @resource.model.persisted?
46
+ return true if @resource.record.persisted?
48
47
 
49
48
  ActiveStorage::Blob.destroy(file.blob_id) if file.blob_id.present?
50
49
  false
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Avo::Fields::Common::Files::ViewType::ListItemComponent < Avo::Fields::Common::Files::ViewType::GridItemComponent
3
+ class Avo::Fields::Common::Files::ViewType::ListComponent < Avo::Fields::Common::Files::ViewType::GridComponent
4
4
  def icon_for_file
5
5
  if is_image?
6
6
  "photo"
@@ -24,7 +24,7 @@ class Avo::Fields::EditComponent < ViewComponent::Base
24
24
  end
25
25
 
26
26
  def classes(extra_classes = "")
27
- helpers.input_classes("#{@field.get_html(:classes, view: view, element: :input)} #{extra_classes}", has_error: @field.model_errors.include?(@field.id))
27
+ helpers.input_classes("#{@field.get_html(:classes, view: view, element: :input)} #{extra_classes}", has_error: @field.record_errors.include?(@field.id))
28
28
  end
29
29
 
30
30
  def render?
@@ -1,7 +1,7 @@
1
1
  <%= field_wrapper **field_wrapper_args do %>
2
2
  <% if @field.value.present? %>
3
3
  <div class="mb-2">
4
- <%= render Avo::Fields::Common::Files::ViewType::GridItemComponent.new resource: @resource, field: @field %>
4
+ <%= render Avo::Fields::Common::Files::ViewType::GridComponent.new resource: @resource, field: @field %>
5
5
  </div>
6
6
  <% end %>
7
7
 
@@ -1,3 +1,3 @@
1
1
  <%= field_wrapper **field_wrapper_args do %>
2
- <%= render Avo::Fields::Common::Files::ViewType::GridItemComponent.new resource: @resource, field: @field %>
2
+ <%= render Avo::Fields::Common::Files::ViewType::GridComponent.new resource: @resource, field: @field %>
3
3
  <% end %>
@@ -1,3 +1,3 @@
1
1
  <%= index_field_wrapper **field_wrapper_args do %>
2
- <%= link_to @field.label, helpers.resource_path(model: @field.value, resource: @field.target_resource) %>
2
+ <%= link_to @field.label, helpers.resource_path(record: @field.value, resource: @field.target_resource) %>
3
3
  <% end %>
@@ -9,8 +9,9 @@
9
9
  <%= a_link attach_path,
10
10
  icon: 'heroicons/outline/link',
11
11
  color: :primary,
12
+ style: :text,
12
13
  'data-turbo-frame': 'attach_modal' do %>
13
- <%= t('avo.attach_item', item: @field.name.downcase) %>
14
+ <%= t('avo.attach_item', item: @field.name.humanize(capitalize: false)) %>
14
15
  <% end %>
15
16
  <% end %>
16
17
  <% if !@field.is_readonly? && !@field.is_disabled? && can_see_the_create_button? %>
@@ -20,7 +21,7 @@
20
21
  'data-turbo-frame': '_top',
21
22
  style: :primary,
22
23
  color: :primary do %>
23
- <%= t('avo.create_new_item', item: @field.name.downcase ) %>
24
+ <%= t('avo.create_new_item', item: @field.name.humanize(capitalize: false) ) %>
24
25
  <% end %>
25
26
  <% end %>
26
27
  <% end %>
@@ -21,7 +21,7 @@ class Avo::Fields::HasOneField::ShowComponent < Avo::Fields::ShowComponent
21
21
  end
22
22
 
23
23
  def attach_path
24
- helpers.avo.resources_associations_new_path(@resource.singular_model_key, @resource.model.to_param, @field.id)
24
+ helpers.avo.resources_associations_new_path(@resource.singular_model_key, @resource.record.to_param, @field.id)
25
25
  end
26
26
 
27
27
  def can_see_the_create_button?
@@ -41,7 +41,7 @@ class Avo::Fields::HasOneField::ShowComponent < Avo::Fields::ShowComponent
41
41
  args = {
42
42
  via_relation: association_id,
43
43
  via_relation_class: @resource.model_class.to_s,
44
- via_resource_id: @resource.model.to_param,
44
+ via_record_id: @resource.record.to_param,
45
45
  via_association_type: :has_one
46
46
  }
47
47
 
@@ -7,11 +7,11 @@ class Avo::Fields::IndexComponent < Avo::BaseComponent
7
7
  attr_reader :parent_resource
8
8
  attr_reader :view
9
9
 
10
- def initialize(field: nil, resource: nil, reflection: nil, index: 0, parent_model: nil, parent_resource: nil)
10
+ def initialize(field: nil, resource: nil, reflection: nil, index: 0, parent_record: nil, parent_resource: nil)
11
11
  @field = field
12
12
  @resource = resource
13
13
  @index = index
14
- @parent_model = parent_model
14
+ @parent_record = parent_record
15
15
  @parent_resource = parent_resource
16
16
  @view = :index
17
17
  @reflection = reflection
@@ -20,14 +20,14 @@ class Avo::Fields::IndexComponent < Avo::BaseComponent
20
20
  def resource_view_path
21
21
  args = {}
22
22
 
23
- if @parent_model.present?
23
+ if @parent_record.present?
24
24
  args = {
25
25
  via_resource_class: @parent_resource.class,
26
- via_resource_id: @parent_model.to_param
26
+ via_record_id: @parent_record.to_param
27
27
  }
28
28
  end
29
29
 
30
- helpers.resource_view_path(model: @resource.model, resource: parent_or_child_resource, **args)
30
+ helpers.resource_view_path(record: @resource.record, resource: parent_or_child_resource, **args)
31
31
  end
32
32
 
33
33
  def field_wrapper_args
@@ -0,0 +1,10 @@
1
+ <%= index_field_wrapper **field_wrapper_args, dash_if_blank: false, class: 'whitespace-no-wrap w-[1%]', flush: true, center_content: true do %>
2
+ <%= link_to resource_view_path,
3
+ title: t('avo.view_item', item: @resource.name).humanize,
4
+ data: {
5
+ controller: "preview",
6
+ preview_url_value: helpers.preview_resource_path(record: @record, resource: @resource, resource_id: @resource.record_id, turbo_frame: :preview_modal),
7
+ } do %>
8
+ <%= helpers.svg("magnifying-glass-circle", class: "block h-6 text-gray-600") %>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Avo::Fields::PreviewField::IndexComponent < Avo::Fields::IndexComponent
4
+ end
@@ -9,7 +9,7 @@
9
9
  data: @field.get_html(:data, view: view, element: :input),
10
10
  disabled: disabled?,
11
11
  style: @field.get_html(:style, view: view, element: :input),
12
- value: @field.model.present? ? @field.model[@field.id] : @field.value,
12
+ value: @field.record.present? ? @field.record[@field.id] : @field.value,
13
13
  placeholder: @field.include_blank.present? ? nil : @field.placeholder,
14
14
  autocomplete: @field.autocomplete
15
15
  %>
@@ -8,14 +8,16 @@ class Avo::Fields::ShowComponent < ViewComponent::Base
8
8
  attr_reader :index
9
9
  attr_reader :resource
10
10
  attr_reader :stacked
11
+ attr_reader :short
11
12
  attr_reader :view
12
13
 
13
- def initialize(field: nil, resource: nil, index: 0, form: nil, compact: false, stacked: nil)
14
+ def initialize(field: nil, resource: nil, index: 0, form: nil, compact: false, short: false, stacked: nil)
14
15
  @compact = compact
15
16
  @field = field
16
17
  @index = index
17
18
  @resource = resource
18
19
  @stacked = stacked
20
+ @short = short
19
21
  @view = :show
20
22
  end
21
23
 
@@ -48,6 +50,7 @@ class Avo::Fields::ShowComponent < ViewComponent::Base
48
50
  field: field,
49
51
  index: index,
50
52
  resource: resource,
53
+ short: short,
51
54
  stacked: stacked,
52
55
  view: view
53
56
  }
@@ -16,7 +16,7 @@ class Avo::Fields::TrixField::EditComponent < Avo::Fields::EditComponent
16
16
  end
17
17
 
18
18
  def resource_id
19
- @resource_id || resource&.model&.id
19
+ @resource_id || resource&.record&.id
20
20
  end
21
21
 
22
22
  def trix_id
@@ -1,4 +1,4 @@
1
- <div data-controller="toggle-panel">
1
+ <div data-controller="toggle" data-component-name="<%= self.class.to_s.underscore %>">
2
2
  <div class="relative w-full flex justify-between">
3
3
  <%= a_button class: 'focus:outline-none',
4
4
  color: :primary,
@@ -6,7 +6,7 @@
6
6
  icon: 'filter',
7
7
  title: t('avo.click_to_reveal_filters'),
8
8
  'data-button': 'resource-filters',
9
- 'data-action': 'click->toggle-panel#togglePanel',
9
+ 'data-action': 'click->toggle#togglePanel',
10
10
  'data-tippy': 'tooltip' do %>
11
11
  <%= t 'avo.filters' %>
12
12
  <% if @applied_filters.present? %>
@@ -15,7 +15,13 @@
15
15
  <% end %>
16
16
  <div
17
17
  class="absolute block inset-auto sm:right-0 top-full bg-white min-w-[300px] mt-2 z-40 shadow-modal rounded divide-y divide-gray-300 <%= 'hidden' unless params[:keep_filters_panel_open] == '1' %>"
18
- data-toggle-panel-target="panel"
18
+ data-toggle-target="panel"
19
+ data-transition-enter="transition ease-out duration-100"
20
+ data-transition-enter-start="transform opacity-0 -translate-y-1"
21
+ data-transition-enter-end="transform opacity-100 translate-y-0"
22
+ data-transition-leave="transition ease-in duration-75"
23
+ data-transition-leave-start="transform opacity-100 translate-y-0"
24
+ data-transition-leave-end="transform opacity-0 -translate-y-1"
19
25
  >
20
26
  <% @filters.each do |filter| %>
21
27
  <%= render partial: filter.class.template, locals: {filter: filter} %>
@@ -3,11 +3,11 @@
3
3
  class Avo::FiltersComponent < ViewComponent::Base
4
4
  include Avo::ApplicationHelper
5
5
 
6
- def initialize(filters: [], resource: nil, applied_filters: [], parent_model: nil)
6
+ def initialize(filters: [], resource: nil, applied_filters: [], parent_record: nil)
7
7
  @filters = filters
8
8
  @resource = resource
9
9
  @applied_filters = applied_filters
10
- @parent_model = parent_model
10
+ @parent_record = parent_record
11
11
  end
12
12
 
13
13
  def render?
@@ -16,8 +16,8 @@ class Avo::FiltersComponent < ViewComponent::Base
16
16
 
17
17
  def reset_path
18
18
  # If come from a association page
19
- if @parent_model.present?
20
- helpers.related_resources_path(@parent_model, @parent_model, filters: nil, reset_filter: true, keep_query_params: true)
19
+ if @parent_record.present?
20
+ helpers.related_resources_path(@parent_record, @parent_record, filters: nil, reset_filter: true, keep_query_params: true)
21
21
  else
22
22
  helpers.resources_path(resource: @resource, filters: nil, reset_filter: true, keep_query_params: true)
23
23
  end
@@ -21,7 +21,6 @@ class Avo::Index::FieldWrapperComponent < ViewComponent::Base
21
21
  result += " py-3"
22
22
  end
23
23
 
24
- result += " #{text_align_classes}"
25
24
  result += " #{@field.get_html(:classes, view: view, element: :wrapper)}"
26
25
 
27
26
  result
@@ -45,15 +44,4 @@ class Avo::Index::FieldWrapperComponent < ViewComponent::Base
45
44
 
46
45
  attributes
47
46
  end
48
-
49
- private
50
-
51
- def text_align_classes
52
- case @field.index_text_align.to_sym
53
- when :right
54
- "text-right"
55
- when :center
56
- "text-center"
57
- end
58
- end
59
47
  end
@@ -1,46 +1,23 @@
1
1
  <div
2
2
  class="relative bg-white rounded shadow-modal flex flex-col group"
3
+ data-component-name="<%= self.class.to_s.underscore %>"
3
4
  <%== item_selector_init @resource %>
5
+ data-resource-name="<%= @resource.class.to_s %>"
6
+ data-record-id="<%= @resource.record.id %>"
4
7
  >
5
- <%= content_tag :div, class: "relative w-full pb-3/4 rounded-t overflow-hidden #{cover.present? ? cover.get_html(:classes, view: :index, element: :wrapper) : ""}", style: cover.present? ? cover.get_html(:style, view: :index, element: :wrapper) : "" do %>
6
- <% if @resource.record_selector %>
7
- <%== item_selector_input floating: true, size: :lg %>
8
- <% end %>
9
- <% if cover.blank? %>
10
- <%= link_to resource_view_path do %>
11
- <%= render Avo::Index::GridCoverEmptyStateComponent.new %>
12
- <% end %>
13
- <% elsif cover.respond_to?(:to_image) && cover.to_image.present? %>
14
- <%= link_to_if cover.link_to_resource, image_tag(cover.to_image, class: 'absolute h-full w-full object-cover'), resource_view_path, class: 'absolute h-full w-full object-cover', title: title.value %>
15
- <% elsif cover.type == 'file' %>
16
- <% if cover.value&.attached? && cover.value.representable? %>
17
- <%= link_to_if cover.link_to_resource, image_tag(helpers.main_app.url_for(cover.value.variant(resize_to_limit: [480, 480])), class: 'absolute h-full w-full object-cover'), resource_view_path, class: 'absolute h-full w-full object-cover', title: title.value %>
18
- <% else %>
19
- <%= link_to resource_view_path do %>
20
- <%= render Avo::Index::GridCoverEmptyStateComponent.new %>
21
- <% end %>
22
- <% end %>
23
- <% elsif cover.value.present? %>
24
- <%= link_to_if cover.link_to_resource, image_tag(cover.value, class: 'absolute h-full w-full object-cover'), resource_view_path, class: 'absolute h-full w-full object-cover', title: title.value %>
25
- <% else %>
26
- <%= render Avo::Index::GridCoverEmptyStateComponent.new %>
27
- <% end %>
8
+ <%= content_tag :div,
9
+ class: "relative w-full pb-3/4 rounded-t overflow-hidden #{html(:cover, :classes)}",
10
+ style: html(:cover, :style) do %>
11
+ <%== item_selector_input(floating: true, size: :lg) if @resource.record_selector%>
12
+ <%= render_cover %>
28
13
  <% end %>
29
- <%= content_tag :div, class: "grid grid-cols-1 place-content-between p-4 h-full" do %>
14
+ <div class="grid grid-cols-1 place-content-between p-4 h-full">
30
15
  <div class="mb-4 h-full flex flex-col space-between">
31
- <% if title.present? %>
32
- <%= content_tag :div, class: "grid font-semibold leading-tight text-lg mb-2 #{title.get_html(:classes, view: :index, element: :wrapper)}", style: title.get_html(:style, view: :index, element: :wrapper) do %>
33
- <%= link_to_if title.link_to_resource, title.value, resource_view_path %>
34
- <% end %>
35
- <% end %>
36
- <% if body.present? %>
37
- <%= content_tag :div, class: "text-sm break-words text-gray-500 #{body.get_html(:classes, view: :index, element: :wrapper)}", style: body.get_html(:style, view: :index, element: :wrapper) do %>
38
- <%= body.value %>
39
- <% end %>
40
- <% end %>
16
+ <%= render_title %>
17
+ <%= render_body %>
41
18
  </div>
42
19
  <div class="w-full place-self-end">
43
- <%= render(Avo::Index::ResourceControlsComponent.new(resource: @resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource, view_type: :grid)) %>
20
+ <%= render(Avo::Index::ResourceControlsComponent.new(resource: @resource, reflection: @reflection, parent_record: @parent_record, parent_resource: @parent_resource, view_type: :grid, actions: actions)) %>
44
21
  </div>
45
- <% end %>
22
+ </div>
46
23
  </div>
@@ -2,41 +2,68 @@
2
2
 
3
3
  class Avo::Index::GridItemComponent < Avo::BaseComponent
4
4
  include Avo::ResourcesHelper
5
+ include Avo::Fields::Concerns::HasHTMLAttributes
5
6
 
6
- attr_reader :parent_resource
7
+ attr_reader :parent_resource, :actions
7
8
 
8
- def initialize(resource: nil, reflection: nil, parent_model: nil, parent_resource: nil)
9
+ def initialize(resource: nil, reflection: nil, parent_record: nil, parent_resource: nil, actions: nil)
9
10
  @resource = resource
10
11
  @reflection = reflection
11
- @grid_fields = resource.get_grid_fields
12
- @parent_model = parent_model
12
+ @parent_record = parent_record
13
13
  @parent_resource = parent_resource
14
+ @actions = actions
15
+ @card = Avo::ExecutionContext.new(target: resource.grid_view[:card], resource: resource, record: resource.record).handle
16
+ @whole_html = Avo::ExecutionContext.new(target: resource.grid_view[:html], resource: resource, record: resource.record).handle
14
17
  end
15
18
 
16
19
  private
17
20
 
18
- def cover
19
- @grid_fields.cover_field
20
- end
21
-
22
- def title
23
- @grid_fields.title_field
24
- end
21
+ def html(element, type)
22
+ return "" if @whole_html.nil? || (@html = @whole_html[element]).nil?
25
23
 
26
- def body
27
- @grid_fields.body_field
24
+ get_html(type, view: :index, element: :wrapper)
28
25
  end
29
26
 
30
27
  def resource_view_path
31
28
  args = {}
32
29
 
33
- if @parent_model.present?
30
+ if @parent_record.present?
34
31
  args = {
35
32
  via_resource_class: parent_resource.class.to_s,
36
- via_resource_id: @parent_model.to_param
33
+ via_record_id: @parent_record.to_param
37
34
  }
38
35
  end
39
36
 
40
- helpers.resource_view_path(model: @resource.model, resource: parent_or_child_resource, **args)
37
+ helpers.resource_view_path(record: @resource.record, resource: parent_or_child_resource, **args)
38
+ end
39
+
40
+ def render_cover
41
+ return link_to_cover if @card[:cover_url].present?
42
+
43
+ link_to resource_view_path do
44
+ render Avo::Index::GridCoverEmptyStateComponent.new
45
+ end
46
+ end
47
+
48
+ def link_to_cover
49
+ classes = "absolute h-full w-full object-cover"
50
+
51
+ link_to image_tag(@card[:cover_url], class: classes), resource_view_path, class: classes, title: @card[:title]
52
+ end
53
+
54
+ def render_title
55
+ return if @card[:title].blank?
56
+
57
+ content_tag :div, class: "grid font-semibold leading-tight text-lg mb-2 #{html(:title, :classes)}", style: html(:title, :style) do
58
+ link_to @card[:title], resource_view_path
59
+ end
60
+ end
61
+
62
+ def render_body
63
+ return if @card[:body].blank?
64
+
65
+ content_tag :div, class: "text-sm break-words text-gray-500 #{html(:body, :classes)}", style: html(:body, :style) do
66
+ @card[:body]
67
+ end
41
68
  end
42
69
  end
@@ -1,83 +1,5 @@
1
- <div class="space-x-2 flex flex-row justify-around w-full">
2
- <% button_classes = "text-gray-600 h-6 hover:text-gray-600" %>
3
-
4
- <% if can_reorder? %>
5
- <%= render Avo::Index::Ordering::ButtonsComponent.new resource: @resource, reflection: @reflection, view_type: @view_type %>
6
- <% end %>
7
-
8
- <% if can_view? %>
9
- <%= link_to helpers.svg('eye', class: button_classes),
10
- show_path,
11
- class: 'flex items-center',
12
- title: t('avo.view_item', item: singular_resource_name).humanize,
13
- data: {
14
- target: 'control:view',
15
- control: :show,
16
- 'tippy': 'tooltip',
17
- }
18
- %>
19
- <% end %>
20
-
21
- <% if can_edit? %>
22
- <%= link_to helpers.svg('edit', class: button_classes),
23
- edit_path,
24
- class: 'flex items-center',
25
- title: t('avo.edit_item', item: singular_resource_name).humanize,
26
- data: {
27
- target: 'control:edit',
28
- control: :edit,
29
- 'resource-id': @resource.model.id,
30
- 'tippy': 'tooltip',
31
- }
32
- %>
33
- <% end %>
34
-
35
- <% if can_detach? %>
36
- <%= form_with url: helpers.resource_detach_path(params[:resource_name], params[:id], params[:related_name], @resource.model.id),
37
- method: :delete,
38
- local: true,
39
- class: 'flex items-center',
40
- html: {
41
- 'data-turbo-frame': params[:turbo_frame]
42
- } do |form| %>
43
- <%= form.button helpers.svg('detach', class: button_classes),
44
- title: t('avo.detach_item', item: singular_resource_name).humanize,
45
- type: :submit,
46
- data: {
47
- target: 'control:detach',
48
- turbo_confirm: t('avo.are_you_sure_detach_item', item: singular_resource_name),
49
- control: :detach,
50
- 'resource-id': @resource.model.id,
51
- 'tippy': 'tooltip',
52
- }
53
- %>
54
- <%= hidden_field_tag :turbo_frame, params[:turbo_frame], id: "turbo_frame_detach_#{@resource.model.id}" if params[:turbo_frame] %>
55
- <%= hidden_field_tag :referrer, referrer_path, id: "referrer_detach_#{@resource.model.id}" if params[:turbo_frame] %>
56
- <% end %>
57
- <% end %>
58
-
59
- <% if can_delete? %>
60
- <%= form_with url: helpers.resource_path(model: @resource.model, resource: @resource),
61
- method: :delete,
62
- class: 'flex items-center',
63
- local: true,
64
- html: {
65
- 'data-turbo-frame': params[:turbo_frame]
66
- } do |form| %>
67
- <%= form.button helpers.svg('trash', class: button_classes),
68
- title: t('avo.delete_item', item: singular_resource_name).humanize,
69
- type: :submit,
70
- data: {
71
- target: 'control:destroy',
72
- turbo_confirm: t('avo.are_you_sure', item: singular_resource_name),
73
- control: :destroy,
74
- 'resource-id': @resource.model.id,
75
- 'tippy': 'tooltip',
76
- }
77
- %>
78
- <%= form.hidden_field :view_type, value: params[:view_type], id: "turbo_view_type_#{@resource.model.id}" if params[:view_type] %>
79
- <%= form.hidden_field :turbo_frame, value: params[:turbo_frame], id: "turbo_frame_destroy_#{@resource.model.id}" if params[:turbo_frame] %>
80
- <%= form.hidden_field :referrer, value: referrer_path, id: "referrer_destroy_#{@resource.model.id}" if params[:turbo_frame] %>
81
- <% end %>
1
+ <div class="space-x-2 flex flex-row justify-end w-full">
2
+ <% @resource.render_row_controls(item: singular_resource_name).each do |control| %>
3
+ <%= render_control control %>
82
4
  <% end %>
83
5
  </div>