avo 2.45.0 → 3.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of avo might be problematic. Click here for more details.

Files changed (415) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +9 -9
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +11 -10
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -35
  167. data/lib/avo/base_resource.rb +107 -95
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/is_resource_item.rb +24 -36
  175. data/lib/avo/concerns/is_visible.rb +15 -0
  176. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  177. data/lib/avo/configuration/branding.rb +0 -12
  178. data/lib/avo/configuration.rb +8 -45
  179. data/lib/avo/current.rb +5 -0
  180. data/lib/avo/dsl/field_parser.rb +1 -1
  181. data/lib/avo/dynamic_router.rb +6 -2
  182. data/lib/avo/engine.rb +37 -30
  183. data/lib/avo/error_manager.rb +25 -0
  184. data/lib/avo/execution_context.rb +9 -15
  185. data/lib/avo/fields/badge_field.rb +1 -1
  186. data/lib/avo/fields/base_field.rb +72 -123
  187. data/lib/avo/fields/belongs_to_field.rb +14 -25
  188. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  189. data/lib/avo/fields/concerns/has_default.rb +1 -5
  190. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  191. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  192. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  193. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  194. data/lib/avo/fields/concerns/is_required.rb +5 -7
  195. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  196. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  197. data/lib/avo/fields/country_field.rb +4 -0
  198. data/lib/avo/fields/date_field.rb +3 -16
  199. data/lib/avo/fields/date_time_field.rb +1 -5
  200. data/lib/avo/fields/field_manager.rb +45 -0
  201. data/lib/avo/fields/file_field.rb +0 -2
  202. data/lib/avo/fields/files_field.rb +0 -6
  203. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  204. data/lib/avo/fields/has_base_field.rb +11 -14
  205. data/lib/avo/fields/has_many_field.rb +5 -2
  206. data/lib/avo/fields/has_one_field.rb +5 -10
  207. data/lib/avo/fields/heading_field.rb +4 -1
  208. data/lib/avo/fields/hidden_field.rb +1 -1
  209. data/lib/avo/fields/id_field.rb +2 -3
  210. data/lib/avo/fields/password_field.rb +1 -1
  211. data/lib/avo/fields/preview_field.rb +14 -0
  212. data/lib/avo/fields/select_field.rb +12 -8
  213. data/lib/avo/fields/status_field.rb +4 -0
  214. data/lib/avo/filters/base_filter.rb +3 -8
  215. data/lib/avo/grid_collector.rb +7 -9
  216. data/lib/avo/html/builder.rb +5 -8
  217. data/lib/avo/item_grapher.rb +78 -0
  218. data/lib/avo/licensing/h_q.rb +3 -67
  219. data/lib/avo/licensing/license.rb +2 -2
  220. data/lib/avo/licensing/license_manager.rb +1 -1
  221. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  222. data/lib/avo/licensing/pro_license.rb +1 -7
  223. data/lib/avo/plugin.rb +6 -0
  224. data/lib/avo/plugin_manager.rb +58 -0
  225. data/lib/avo/prefixed_test_helpers.rb +20 -0
  226. data/lib/avo/reloader.rb +3 -0
  227. data/lib/avo/resources/controls/actions_list.rb +6 -12
  228. data/lib/avo/resources/controls/attach_button.rb +15 -0
  229. data/lib/avo/resources/controls/back_button.rb +1 -1
  230. data/lib/avo/resources/controls/base_control.rb +15 -49
  231. data/lib/avo/resources/controls/create_button.rb +15 -0
  232. data/lib/avo/resources/controls/delete_button.rb +5 -1
  233. data/lib/avo/resources/controls/detach_button.rb +4 -1
  234. data/lib/avo/resources/controls/edit_button.rb +4 -1
  235. data/lib/avo/resources/controls/order_controls.rb +8 -0
  236. data/lib/avo/resources/controls/save_button.rb +13 -0
  237. data/lib/avo/resources/controls/show_button.rb +15 -0
  238. data/lib/avo/resources/items/holder.rb +76 -0
  239. data/lib/avo/resources/items/item_group.rb +48 -0
  240. data/lib/avo/resources/items/main_panel.rb +2 -0
  241. data/lib/avo/resources/items/panel.rb +2 -0
  242. data/lib/avo/resources/items/sidebar.rb +47 -0
  243. data/lib/avo/resources/items/tab.rb +60 -0
  244. data/lib/avo/resources/items/tab_group.rb +68 -0
  245. data/lib/avo/resources/resource_manager.rb +181 -0
  246. data/lib/avo/services/authorization_service.rb +11 -110
  247. data/lib/avo/services/debug_service.rb +92 -0
  248. data/lib/avo/services/telemetry_service.rb +84 -0
  249. data/lib/avo/test_helpers.rb +362 -0
  250. data/lib/avo/tools/tool_manager.rb +30 -0
  251. data/lib/avo/version.rb +1 -1
  252. data/lib/avo.rb +7 -0
  253. data/lib/generators/avo/eject_generator.rb +0 -1
  254. data/lib/generators/avo/install_generator.rb +1 -11
  255. data/lib/generators/avo/resource_generator.rb +5 -23
  256. data/lib/generators/avo/scope_generator.rb +15 -0
  257. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  258. data/lib/generators/avo/templates/action.tt +1 -1
  259. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  261. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  263. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  265. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  266. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  267. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  268. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  271. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  272. data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
  273. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  274. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  275. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  280. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  281. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  282. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  283. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  284. data/lib/generators/avo/templates/scope.tt +6 -0
  285. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  286. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  287. data/lib/generators/avo/templates/tool/view.tt +2 -2
  288. data/lib/tasks/avo_tasks.rake +22 -0
  289. metadata +81 -159
  290. data/app/assets/stylesheets/css/tags.css +0 -32
  291. data/app/assets/svgs/map-empty-state.svg +0 -35
  292. data/app/assets/svgs/map-view-type.svg +0 -3
  293. data/app/components/avo/card_component.html.erb +0 -46
  294. data/app/components/avo/card_component.rb +0 -25
  295. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  296. data/app/components/avo/dashboards/divider_component.rb +0 -19
  297. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  298. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  299. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  300. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  301. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  303. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  304. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  305. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  306. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  307. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  309. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  311. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  312. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  313. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  314. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  315. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  316. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  317. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  318. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  319. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  320. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  321. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  322. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  323. data/app/components/avo/index/ordering/base_component.rb +0 -9
  324. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  325. data/app/components/avo/index/ordering/button_component.rb +0 -23
  326. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  327. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  328. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  329. data/app/components/avo/index/resource_map_component.rb +0 -109
  330. data/app/components/avo/row_component.html.erb +0 -3
  331. data/app/components/avo/row_component.rb +0 -12
  332. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  333. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  334. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  335. data/app/controllers/avo/dashboards_controller.rb +0 -22
  336. data/app/controllers/avo/reorder_controller.rb +0 -25
  337. data/app/javascript/js/controllers/base_controller.js +0 -22
  338. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  339. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  340. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  341. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  342. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  343. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  344. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  345. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  346. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  347. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  348. data/app/views/avo/dashboards/show.html.erb +0 -38
  349. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  350. data/app/views/avo/partials/_global_search.html.erb +0 -19
  351. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  352. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  353. data/lib/avo/base_card.rb +0 -161
  354. data/lib/avo/concerns/fetches_things.rb +0 -150
  355. data/lib/avo/concerns/handles_field_args.rb +0 -47
  356. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  357. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  358. data/lib/avo/concerns/pagination.rb +0 -53
  359. data/lib/avo/concerns/policy_helpers.rb +0 -31
  360. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  361. data/lib/avo/concerns/visible_items.rb +0 -51
  362. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  363. data/lib/avo/dashboards/base_divider.rb +0 -35
  364. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  365. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  366. data/lib/avo/dashboards/metric_card.rb +0 -9
  367. data/lib/avo/dashboards/partial_card.rb +0 -7
  368. data/lib/avo/fields/area_field.rb +0 -39
  369. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  370. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  371. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  372. data/lib/avo/fields/location_field.rb +0 -86
  373. data/lib/avo/fields/tags_field.rb +0 -102
  374. data/lib/avo/hosts/association_scope_host.rb +0 -8
  375. data/lib/avo/hosts/base_host.rb +0 -25
  376. data/lib/avo/hosts/card_visibility.rb +0 -20
  377. data/lib/avo/hosts/dashboard_card.rb +0 -22
  378. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  379. data/lib/avo/hosts/ordering.rb +0 -22
  380. data/lib/avo/hosts/record_host.rb +0 -7
  381. data/lib/avo/hosts/resource_record_host.rb +0 -7
  382. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  383. data/lib/avo/hosts/search_scope_host.rb +0 -7
  384. data/lib/avo/hosts/view_record_host.rb +0 -7
  385. data/lib/avo/hosts/visibility_host.rb +0 -12
  386. data/lib/avo/items_holder.rb +0 -96
  387. data/lib/avo/main_panel.rb +0 -3
  388. data/lib/avo/menu/base_item.rb +0 -25
  389. data/lib/avo/menu/builder.rb +0 -82
  390. data/lib/avo/menu/dashboard.rb +0 -22
  391. data/lib/avo/menu/group.rb +0 -2
  392. data/lib/avo/menu/link.rb +0 -6
  393. data/lib/avo/menu/menu.rb +0 -2
  394. data/lib/avo/menu/resource.rb +0 -22
  395. data/lib/avo/menu/section.rb +0 -2
  396. data/lib/avo/panel.rb +0 -24
  397. data/lib/avo/panel_builder.rb +0 -25
  398. data/lib/avo/resources/controls/action.rb +0 -38
  399. data/lib/avo/resources/controls/execution_context.rb +0 -58
  400. data/lib/avo/resources/controls/items_holder.rb +0 -19
  401. data/lib/avo/resources/controls/link_to.rb +0 -27
  402. data/lib/avo/row.rb +0 -26
  403. data/lib/avo/row_builder.rb +0 -24
  404. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  405. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  406. data/lib/avo/sidebar.rb +0 -30
  407. data/lib/avo/sidebar_builder.rb +0 -24
  408. data/lib/avo/tab.rb +0 -72
  409. data/lib/avo/tab_builder.rb +0 -25
  410. data/lib/avo/tab_group.rb +0 -42
  411. data/lib/avo/tab_group_builder.rb +0 -43
  412. data/lib/avo/tools_manager.rb +0 -11
  413. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  414. data/public/avo-assets/avo.base.js +0 -1037
  415. data/public/avo-assets/avo.base.js.map +0 -7
@@ -12,7 +12,7 @@ module Avo
12
12
 
13
13
  attr_reader :arguments
14
14
 
15
- delegate :params, to: Avo::App
15
+ delegate :params, to: Avo::Current
16
16
 
17
17
  class << self
18
18
  def decode_filters(filter_params)
@@ -21,10 +21,6 @@ module Avo
21
21
  {}
22
22
  end
23
23
 
24
- def encode_filters(filter_params)
25
- Base64.encode64(filter_params.to_json)
26
- end
27
-
28
24
  def get_empty_message
29
25
  empty_message || I18n.t("avo.no_options_available")
30
26
  end
@@ -68,14 +64,13 @@ module Avo
68
64
  return true if visible.blank?
69
65
 
70
66
  # Run the visible block if available
71
- Avo::Hosts::VisibilityHost.new(
72
- block: visible,
67
+ Avo::ExecutionContext.new(
68
+ target: visible,
73
69
  params: params,
74
70
  parent_resource: parent_resource,
75
71
  resource: resource,
76
72
  arguments: arguments
77
73
  ).handle
78
-
79
74
  end
80
75
  end
81
76
  end
@@ -1,7 +1,5 @@
1
1
  module Avo
2
2
  class GridCollector
3
- include Avo::Concerns::HasFields
4
-
5
3
  attr_accessor :cover_field
6
4
  attr_accessor :title_field
7
5
  attr_accessor :body_field
@@ -13,24 +11,24 @@ module Avo
13
11
  end
14
12
 
15
13
  def cover(field_name, as:, **args, &block)
16
- field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, order_index: items_index, **args, &block).parse
14
+ field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, **args, &block).parse
17
15
  self.cover_field = field_parser.instance if field_parser.valid?
18
16
  end
19
17
 
20
18
  def title(field_name, as:, **args, &block)
21
- field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, order_index: items_index, **args, &block).parse
19
+ field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, **args, &block).parse
22
20
  self.title_field = field_parser.instance if field_parser.valid?
23
21
  end
24
22
 
25
23
  def body(field_name, as:, **args, &block)
26
- field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, order_index: items_index, **args, &block).parse
24
+ field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, **args, &block).parse
27
25
  self.body_field = field_parser.instance if field_parser.valid?
28
26
  end
29
27
 
30
- def hydrate(model:, view:, resource:)
31
- cover_field.hydrate(model: model, view: view, resource: resource) if cover_field.present?
32
- title_field.hydrate(model: model, view: view, resource: resource) if title_field.present?
33
- body_field.hydrate(model: model, view: view, resource: resource) if body_field.present?
28
+ def hydrate(record:, view:, resource:)
29
+ cover_field.hydrate(record: record, view: view, resource: resource) if cover_field.present?
30
+ title_field.hydrate(record: record, view: view, resource: resource) if title_field.present?
31
+ body_field.hydrate(record: record, view: view, resource: resource) if body_field.present?
34
32
 
35
33
  self
36
34
  end
@@ -19,9 +19,10 @@ class Avo::HTML::Builder
19
19
  attr_accessor :record
20
20
  attr_accessor :resource
21
21
 
22
- delegate :root_path, to: Avo::App
23
- delegate :params, to: Avo::App
24
- delegate :current_user, to: Avo::App
22
+ delegate :app, to: Avo::Current
23
+ delegate :root_path, to: :app
24
+ delegate :params, to: Avo::Current
25
+ delegate :current_user, to: Avo::Current
25
26
 
26
27
  def initialize(record: nil, resource: nil)
27
28
  @wrapper_stack = {}
@@ -120,11 +121,7 @@ class Avo::HTML::Builder
120
121
 
121
122
  # Parse the properties and assign them to the blocks
122
123
  def assign_property(property = :data, payload = nil, &block)
123
- value = if block.present?
124
- Avo::Hosts::RecordHost.new(block: block, record: record).handle
125
- else
126
- payload
127
- end
124
+ value = Avo::ExecutionContext.new(target: block || payload, record: record).handle
128
125
 
129
126
  send("#{property}_stack=", value)
130
127
  end
@@ -0,0 +1,78 @@
1
+ # Use it like this:
2
+ # Avo::ItemGrapher.new(resource).render(view: :edit)
3
+ class Avo::ItemGrapher
4
+ attr_reader :item
5
+
6
+ def initialize(item)
7
+ @item = item
8
+ end
9
+
10
+ def decode_item(item)
11
+ result = ""
12
+ result << "──" * (item[:level])
13
+ result << "→"
14
+ result << item[:id]
15
+ if item[:items].present?
16
+ item[:items].each do |itm|
17
+ result << "<br />"
18
+ result << decode_item(itm)
19
+ end
20
+
21
+ end
22
+ result
23
+ end
24
+
25
+ def unwrap(i, level = 0, view: :show)
26
+ result = []
27
+
28
+ i.items.each do |item|
29
+ label = ""
30
+ label << item.class.name.demodulize
31
+ label << " "
32
+ if item.respond_to?(:name)
33
+ label << "{#{item.name}}"
34
+ label << " "
35
+ end
36
+ label << (item.hydrate(view: view).visible_in_view?(view: view) ? "visible" : "invisible")
37
+ if item.class.ancestors.include?(Avo::Concerns::HasItems)
38
+ if item.visible_items.present?
39
+ label << " | HAS_ITEMS #{item.visible_items.count} items"
40
+ # abort item.visible_items.inspect
41
+ label << item.visible_items.map(&:class).inspect
42
+ else
43
+ label << " | DOES_NOT_HAVE_ITEMS"
44
+ end
45
+ end
46
+ if item.respond_to?(:is_empty?)
47
+ label << " "
48
+ label << (item.is_empty? ? "[IS EMPTY!]" : "[#{item.visible_items.count}]")
49
+ end
50
+ payload = if item.respond_to?(:items) && item.items.present?
51
+ {
52
+ id: label,
53
+ items: unwrap(item, level + 1),
54
+ }
55
+ else
56
+ {
57
+ id: label
58
+ }
59
+ end
60
+
61
+ result << {
62
+ **payload,
63
+ level: level,
64
+ }
65
+ end
66
+
67
+ result
68
+ end
69
+
70
+ def render(**args)
71
+ result = unwrap(item, **args)
72
+ .map do |item|
73
+ decode_item(item)
74
+ end
75
+ .join("<br />")
76
+ "<pre>#{result}</pre>".html_safe
77
+ end
78
+ end
@@ -69,7 +69,7 @@ module Avo
69
69
  app_name: app_name
70
70
  }
71
71
 
72
- metadata = avo_metadata
72
+ metadata = Avo::Services::DebugService.avo_metadata
73
73
  if metadata[:resources_count] != 0
74
74
  result[:avo_metadata] = metadata
75
75
  end
@@ -77,44 +77,6 @@ module Avo
77
77
  result
78
78
  end
79
79
 
80
- def avo_metadata
81
- resources = App.resources
82
- dashboards = App.dashboards
83
- field_definitions = resources.map(&:get_field_definitions)
84
- fields_count = field_definitions.map(&:count).sum
85
- fields_per_resource = sprintf("%0.01f", fields_count / (resources.count + 0.0))
86
-
87
- field_types = {}
88
- custom_fields_count = 0
89
- field_definitions.each do |fields|
90
- fields.each do |field|
91
- field_types[field.type] ||= 0
92
- field_types[field.type] += 1
93
-
94
- custom_fields_count += 1 if field.custom?
95
- end
96
- end
97
-
98
- {
99
- resources_count: resources.count,
100
- dashboards_count: dashboards.count,
101
- fields_count: fields_count,
102
- fields_per_resource: fields_per_resource,
103
- custom_fields_count: custom_fields_count,
104
- field_types: field_types,
105
- **other_metadata(:actions),
106
- **other_metadata(:filters),
107
- main_menu_present: Avo.configuration.main_menu.present?,
108
- profile_menu_present: Avo.configuration.profile_menu.present?,
109
- cache_store: Avo::App.cache_store&.class&.to_s,
110
- **config_metadata
111
- }
112
- rescue => e
113
- {
114
- error: e.message
115
- }
116
- end
117
-
118
80
  def cached_response
119
81
  cache_store.read self.class.cache_key
120
82
  end
@@ -185,13 +147,9 @@ module Avo
185
147
  end
186
148
 
187
149
  def perform_request
188
- ::Rails.logger.debug "[Avo] Performing request to avohq.io API to check license availability." if Rails.env.development?
150
+ Avo.logger.debug "Performing request to avohq.io API to check license availability." if Rails.env.development?
189
151
 
190
- if Rails.env.test?
191
- OpenStruct.new({code: 200, parsed_response: {id: "pro", valid: true}})
192
- else
193
- HTTParty.post ENDPOINT, body: payload.to_json, headers: {"Content-type": "application/json"}, timeout: REQUEST_TIMEOUT
194
- end
152
+ HTTParty.post ENDPOINT, body: payload.to_json, headers: {"Content-type": "application/json"}, timeout: REQUEST_TIMEOUT
195
153
  end
196
154
 
197
155
  def app_name
@@ -200,28 +158,6 @@ module Avo
200
158
  nil
201
159
  end
202
160
 
203
- def other_metadata(type = :actions)
204
- resources = App.resources
205
-
206
- types = resources.map(&:"get_#{type}")
207
- type_count = types.flatten.uniq.count
208
- type_per_resource = sprintf("%0.01f", types.map(&:count).sum / (resources.count + 0.0))
209
-
210
- {
211
- "#{type}_count": type_count,
212
- "#{type}_per_resource": type_per_resource
213
- }
214
- end
215
-
216
- def config_metadata
217
- {
218
- config: {
219
- root_path: Avo.configuration.root_path,
220
- app_name: Avo.configuration.app_name
221
- }
222
- }
223
- end
224
-
225
161
  def cache_and_return_error(error, exception_message = "")
226
162
  cache_response response: {
227
163
  id: Avo.configuration.license,
@@ -6,7 +6,7 @@ module Avo
6
6
  attr_accessor :valid
7
7
  attr_accessor :payload
8
8
 
9
- def initialize(response = {})
9
+ def initialize(response)
10
10
  @response = response
11
11
  @id = response["id"]
12
12
  @valid = response["valid"]
@@ -64,7 +64,7 @@ module Avo
64
64
  if id.present?
65
65
  id.humanize
66
66
  else
67
- self.class.to_s.split('::').last.underscore.humanize.gsub ' license', ''
67
+ self.class.to_s.split("::").last.underscore.humanize.gsub " license", ""
68
68
  end
69
69
  end
70
70
  end
@@ -12,7 +12,7 @@ module Avo
12
12
  when "pro"
13
13
  ProLicense.new @hq_response
14
14
  else
15
- NilLicense.new @hq_response
15
+ NullLicense.new @hq_response
16
16
  end
17
17
  end
18
18
 
@@ -1,6 +1,6 @@
1
1
  module Avo
2
2
  module Licensing
3
- class NilLicense < License
3
+ class NullLicense < License
4
4
  def initialize(response = nil)
5
5
  response ||= {
6
6
  id: "community",
@@ -4,19 +4,13 @@ module Avo
4
4
  def abilities
5
5
  [
6
6
  :authorization,
7
- :localization,
8
- :custom_tools,
9
- :custom_fields,
10
- :resource_tools,
11
7
  :global_search,
12
8
  :enhanced_search_results,
13
9
  :searchable_associations,
14
10
  :resource_ordering,
15
11
  :dashboards,
16
12
  :menu_editor,
17
- :stimulus_js_integration,
18
- :resource_show_controls,
19
- :branding,
13
+ :customizable_controls,
20
14
  :resource_sidebar,
21
15
  :advanced_fields
22
16
  ]
data/lib/avo/plugin.rb ADDED
@@ -0,0 +1,6 @@
1
+ module Avo
2
+ class Plugin
3
+ def initialize(*, **, &block)
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,58 @@
1
+ module Avo
2
+ class PluginManager
3
+ attr_reader :plugins
4
+
5
+ alias_method :all, :plugins
6
+
7
+ def initialize
8
+ @plugins = []
9
+ end
10
+
11
+ def register(plugin_klass, priority: 10)
12
+ @plugins << OpenStruct.new(klass: plugin_klass, priority: priority)
13
+ end
14
+
15
+ def boot_plugins
16
+ Avo.plugin_manager.all.sort_by(&:priority).each do |plugin|
17
+ plugin.klass.boot
18
+ end
19
+ end
20
+
21
+ def init_plugins
22
+ Avo.plugin_manager.all.sort_by(&:priority).each do |plugin|
23
+ plugin.klass.init
24
+ end
25
+ end
26
+
27
+ def register_field(method_name, klass)
28
+ Avo::App.fields.load_field method_name, klass
29
+ end
30
+
31
+ def register_resource_tool
32
+ # puts ["register_resource_tool->"].inspect
33
+ end
34
+
35
+ def register_tool
36
+ # puts ["register_tool->"].inspect
37
+ end
38
+
39
+ def as_json(*arg)
40
+ plugins.map do |plugin|
41
+ {
42
+ klass: plugin.klass.to_s,
43
+ priority: plugin.priority,
44
+ }
45
+ end
46
+ end
47
+
48
+ def installed?(name)
49
+ plugins.any? do |plugin|
50
+ plugin.klass.to_s.split("::").first.underscore == name.to_s || plugin.klass.to_s.split("::").first == name.to_s
51
+ end
52
+ end
53
+ end
54
+
55
+ def self.plugin_manager
56
+ @plugin_manager ||= PluginManager.new
57
+ end
58
+ end
@@ -0,0 +1,20 @@
1
+ # This module is used to namespace all of the methods from Avo::TestHelpers.
2
+ #
3
+ # It loops through all of the public instance methods from Avo::TestHelpers and defines new methods in the current
4
+ # module with the same name but prefixed with "avo_".
5
+ #
6
+ # For example, if Avo::TestHelpers has a public instance method called example_method, this code will define a new
7
+ # method called avo_example_method in Avo::PrefixedTestHelpers module which when called will call example_method
8
+ # with the same arguments.
9
+
10
+ module Avo
11
+ module PrefixedTestHelpers
12
+ include Avo::TestHelpers
13
+
14
+ Avo::TestHelpers.public_instance_methods.each do |method|
15
+ define_method("avo_#{method}") do |**args|
16
+ send(method, **args)
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/avo/reloader.rb CHANGED
@@ -45,6 +45,9 @@ class Avo::Reloader
45
45
  # watch the lib directory in Avo development
46
46
  if reload_lib?
47
47
  dirs[Avo::Engine.root.join("lib", "avo").to_s] = ["rb"]
48
+ if Avo.avo_filters_installed?
49
+ dirs[AvoFilters::Engine.root.join("lib", "avo_filters").to_s] = ["rb"]
50
+ end
48
51
  end
49
52
 
50
53
  dirs
@@ -2,20 +2,14 @@ module Avo
2
2
  module Resources
3
3
  module Controls
4
4
  class ActionsList < BaseControl
5
- def exclude
6
- Array.wrap(@args[:exclude]) || []
7
- end
8
-
9
- def include
10
- Array.wrap(@args[:include]) || []
11
- end
5
+ attr_reader :color, :exclude, :style
12
6
 
13
- def color
14
- @args[:color] || :primary
15
- end
7
+ def initialize(**args)
8
+ super(**args)
16
9
 
17
- def style
18
- @args[:style] || :outline
10
+ @color = args[:color] || :primary
11
+ @exclude = args[:exclude] || []
12
+ @style = args[:style] || :outline
19
13
  end
20
14
  end
21
15
  end
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class AttachButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ if args[:item].present?
9
+ @label = I18n.t("avo.attach_item", item: args[:item]) if label.nil?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,7 +5,7 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.go_back")
8
+ @label = args[:label] || I18n.t("avo.go_back")
9
9
  end
10
10
  end
11
11
  end
@@ -2,56 +2,22 @@ module Avo
2
2
  module Resources
3
3
  module Controls
4
4
  class BaseControl
5
- def initialize(**args)
6
- @args = args
7
- end
8
-
9
- def label
10
- @args[:label] || @label
11
- end
5
+ attr_reader :label, :title, :color, :style, :icon, :icon_class, :confirmation_message, :size, :as_index_control
12
6
 
13
- def title
14
- @args[:title]
15
- end
16
-
17
- def color
18
- @args[:color] || :gray
19
- end
20
-
21
- def style
22
- @args[:style] || :text
23
- end
24
-
25
- def icon
26
- @args[:icon] || nil
27
- end
28
-
29
- def back_button?
30
- is_a? Avo::Resources::Controls::BackButton
31
- end
32
-
33
- def edit_button?
34
- is_a? Avo::Resources::Controls::EditButton
35
- end
36
-
37
- def delete_button?
38
- is_a? Avo::Resources::Controls::DeleteButton
39
- end
40
-
41
- def actions_list?
42
- is_a? Avo::Resources::Controls::ActionsList
43
- end
44
-
45
- def link_to?
46
- is_a? Avo::Resources::Controls::LinkTo
47
- end
48
-
49
- def detach_button?
50
- is_a? Avo::Resources::Controls::DetachButton
51
- end
52
-
53
- def action?
54
- is_a? Avo::Resources::Controls::Action
7
+ def initialize(**args)
8
+ @label = args[:label]
9
+ @title = args[:title]
10
+ @color = args[:color] || :gray
11
+ @style = args[:style] || :text
12
+ @icon = args[:icon]
13
+ @icon_class = @style == :icon ? " text-gray-600 h-6 hover:text-gray-600" : ""
14
+ @confirmation_message = args[:confirmation_message]
15
+ @size = args[:size] || :md
16
+ @as_index_control = args[:as_index_control]
17
+ end
18
+
19
+ def type
20
+ self.class.name.demodulize.underscore.to_sym
55
21
  end
56
22
  end
57
23
  end
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class CreateButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ if args[:item].present?
9
+ @label = I18n.t("avo.create_new_item", item: args[:item]) if label.nil?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,7 +5,11 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.delete").capitalize
8
+ @label = args[:label] || I18n.t("avo.delete").capitalize
9
+ if args[:item].present?
10
+ @title = I18n.t("avo.delete_item", item: args[:item]).capitalize if title.nil?
11
+ @confirmation_message = I18n.t("avo.are_you_sure") if confirmation_message.nil?
12
+ end
9
13
  end
10
14
  end
11
15
  end
@@ -5,7 +5,10 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.detach_item", item: title).humanize
8
+ if args[:item].present?
9
+ @title = I18n.t("avo.detach_item", item: args[:item]).capitalize if title.nil?
10
+ @confirmation_message = I18n.t("avo.are_you_sure_detach_item", item: args[:item]) if confirmation_message.nil?
11
+ end
9
12
  end
10
13
  end
11
14
  end
@@ -5,7 +5,10 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.edit").capitalize
8
+ @label = args[:label] || I18n.t("avo.edit").capitalize
9
+ if args[:item].present?
10
+ @title = I18n.t("avo.edit_item", item: args[:item]).capitalize if title.nil?
11
+ end
9
12
  end
10
13
  end
11
14
  end
@@ -0,0 +1,8 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class OrderControls < BaseControl
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class SaveButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ @label = args[:label] || I18n.t("avo.save").capitalize
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class ShowButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ if args[:item].present?
9
+ @title = I18n.t("avo.view_item", item: args[:item]).capitalize if title.nil?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end