avo 2.44.0 → 3.0.2

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

Potentially problematic release.


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

Files changed (411) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +28 -26
  3. data/Gemfile.lock +231 -161
  4. data/README.md +19 -27
  5. data/Rakefile +2 -0
  6. data/app/assets/stylesheets/avo.base.css +1 -1
  7. data/app/assets/svgs/font.svg +1 -0
  8. data/app/assets/svgs/triangle-up.svg +1 -0
  9. data/app/components/avo/actions_component.html.erb +19 -5
  10. data/app/components/avo/actions_component.rb +39 -19
  11. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  12. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  13. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  14. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  15. data/app/components/avo/base_component.rb +15 -12
  16. data/app/components/avo/button_component.rb +20 -3
  17. data/app/components/avo/empty_state_component.rb +1 -1
  18. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  19. data/app/components/avo/field_wrapper_component.rb +9 -15
  20. data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
  21. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +75 -79
  22. data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
  23. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  24. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  25. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  26. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  27. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  28. data/app/components/avo/fields/common/badge_viewer_component.rb +1 -1
  29. data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
  30. data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
  31. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  32. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
  33. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  34. data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
  35. data/app/components/avo/fields/common/heading_component.html.erb +3 -8
  36. data/app/components/avo/fields/common/heading_component.rb +1 -3
  37. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  38. data/app/components/avo/fields/common/key_value_component.rb +2 -2
  39. data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
  40. data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
  41. data/app/components/avo/fields/edit_component.rb +2 -2
  42. data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
  43. data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
  44. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  45. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  46. data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
  47. data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
  48. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  49. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
  51. data/app/components/avo/fields/index_component.rb +6 -6
  52. data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
  53. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  54. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  55. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  56. data/app/components/avo/fields/show_component.rb +5 -2
  57. data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
  58. data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
  59. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  60. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  61. data/app/components/avo/filters_component.html.erb +9 -3
  62. data/app/components/avo/filters_component.rb +4 -4
  63. data/app/components/avo/index/field_wrapper_component.rb +1 -13
  64. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  65. data/app/components/avo/index/grid_item_component.rb +43 -16
  66. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  67. data/app/components/avo/index/resource_controls_component.rb +125 -18
  68. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  69. data/app/components/avo/index/resource_grid_component.rb +5 -2
  70. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  71. data/app/components/avo/index/resource_map_component.rb +3 -3
  72. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  73. data/app/components/avo/index/resource_table_component.rb +24 -7
  74. data/app/components/avo/index/table_row_component.html.erb +9 -5
  75. data/app/components/avo/index/table_row_component.rb +3 -2
  76. data/app/components/avo/items/panel_component.html.erb +25 -0
  77. data/app/components/avo/items/panel_component.rb +43 -0
  78. data/app/components/avo/items/switcher_component.html.erb +17 -0
  79. data/app/components/avo/items/switcher_component.rb +79 -0
  80. data/app/components/avo/items/visible_items_component.html.erb +10 -0
  81. data/app/components/avo/items/visible_items_component.rb +11 -0
  82. data/app/components/avo/modal_component.html.erb +3 -4
  83. data/app/components/avo/paginator_component.html.erb +29 -40
  84. data/app/components/avo/paginator_component.rb +23 -5
  85. data/app/components/avo/panel_component.html.erb +7 -5
  86. data/app/components/avo/referrer_params_component.html.erb +1 -1
  87. data/app/components/avo/resource_component.rb +205 -26
  88. data/app/components/avo/resource_sidebar_component.html.erb +15 -18
  89. data/app/components/avo/resource_sidebar_component.rb +5 -3
  90. data/app/components/avo/sidebar/link_component.rb +1 -1
  91. data/app/components/avo/sidebar_component.html.erb +10 -3
  92. data/app/components/avo/sidebar_component.rb +5 -3
  93. data/app/components/avo/sidebar_profile_component.html.erb +18 -12
  94. data/app/components/avo/tab_group_component.html.erb +14 -8
  95. data/app/components/avo/tab_group_component.rb +1 -6
  96. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  97. data/app/components/avo/tab_switcher_component.rb +6 -41
  98. data/app/components/avo/views/resource_edit_component.html.erb +23 -84
  99. data/app/components/avo/views/resource_edit_component.rb +20 -19
  100. data/app/components/avo/views/resource_index_component.html.erb +42 -47
  101. data/app/components/avo/views/resource_index_component.rb +76 -13
  102. data/app/components/avo/views/resource_show_component.html.erb +16 -177
  103. data/app/components/avo/views/resource_show_component.rb +16 -10
  104. data/app/controllers/avo/actions_controller.rb +29 -31
  105. data/app/controllers/avo/application_controller.rb +119 -181
  106. data/app/controllers/avo/associations_controller.rb +34 -43
  107. data/app/controllers/avo/attachments_controller.rb +4 -4
  108. data/app/controllers/avo/base_controller.rb +145 -98
  109. data/app/controllers/avo/debug_controller.rb +17 -5
  110. data/app/controllers/avo/home_controller.rb +1 -1
  111. data/app/controllers/avo/search_controller.rb +56 -50
  112. data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
  113. data/app/helpers/avo/application_helper.rb +18 -8
  114. data/app/helpers/avo/resources_helper.rb +1 -1
  115. data/app/helpers/avo/url_helpers.rb +28 -12
  116. data/app/javascript/avo.base.js +1 -0
  117. data/app/javascript/js/controllers/action_controller.js +3 -1
  118. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  119. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
  120. data/app/javascript/js/controllers/filter_controller.js +1 -1
  121. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  122. data/app/javascript/js/controllers/preview_controller.js +24 -0
  123. data/app/javascript/js/controllers/search_controller.js +4 -2
  124. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  125. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  126. data/app/javascript/js/controllers.js +11 -5
  127. data/app/javascript/js/custom-stream-actions.js +15 -0
  128. data/app/views/avo/actions/show.html.erb +9 -5
  129. data/app/views/avo/associations/new.html.erb +2 -2
  130. data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
  131. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
  132. data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
  133. data/app/views/avo/base/edit.html.erb +1 -1
  134. data/app/views/avo/base/index.html.erb +4 -3
  135. data/app/views/avo/base/new.html.erb +2 -1
  136. data/app/views/avo/base/preview.html.erb +19 -0
  137. data/app/views/avo/base/show.html.erb +2 -2
  138. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  139. data/app/views/avo/debug/report.html.erb +32 -17
  140. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  141. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  142. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +1 -1
  143. data/app/views/avo/partials/_footer.html.erb +1 -1
  144. data/app/views/avo/partials/_javascript.html.erb +5 -0
  145. data/app/views/avo/partials/_logo.html.erb +1 -1
  146. data/app/views/avo/partials/_navbar.html.erb +3 -5
  147. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  148. data/app/views/avo/partials/_table_header.html.erb +5 -11
  149. data/app/views/layouts/avo/application.html.erb +5 -4
  150. data/avo.gemspec +10 -8
  151. data/bin/dev +3 -1
  152. data/bin/prod +0 -0
  153. data/config/i18n-tasks.yml +1 -1
  154. data/config/initializers/pagy.rb +2 -0
  155. data/config/master.key +1 -0
  156. data/config/routes.rb +7 -10
  157. data/db/factories.rb +6 -0
  158. data/lib/avo/asset_manager.rb +30 -0
  159. data/lib/avo/base_action.rb +78 -60
  160. data/lib/avo/base_resource.rb +286 -225
  161. data/lib/avo/base_resource_tool.rb +9 -16
  162. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  163. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  164. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  165. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  166. data/lib/avo/concerns/has_controls.rb +37 -0
  167. data/lib/avo/concerns/has_description.rb +23 -0
  168. data/lib/avo/concerns/has_helpers.rb +18 -0
  169. data/lib/avo/concerns/has_item_type.rb +42 -0
  170. data/lib/avo/concerns/has_items.rb +339 -0
  171. data/lib/avo/concerns/hydration.rb +17 -0
  172. data/lib/avo/concerns/is_resource_item.rb +16 -36
  173. data/lib/avo/concerns/is_visible.rb +15 -0
  174. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  175. data/lib/avo/concerns/pagination.rb +53 -0
  176. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  177. data/lib/avo/concerns/visible_items.rb +7 -38
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +28 -11
  180. data/lib/avo/current.rb +39 -0
  181. data/lib/avo/dsl/field_parser.rb +3 -3
  182. data/lib/avo/dynamic_router.rb +18 -3
  183. data/lib/avo/engine.rb +35 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +14 -15
  186. data/lib/avo/fields/base_field.rb +84 -121
  187. data/lib/avo/fields/belongs_to_field.rb +19 -23
  188. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  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 +112 -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 +15 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  199. data/lib/avo/fields/country_field.rb +4 -0
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/external_image_field.rb +2 -2
  202. data/lib/avo/fields/field_manager.rb +55 -0
  203. data/lib/avo/fields/file_field.rb +2 -2
  204. data/lib/avo/fields/gravatar_field.rb +2 -2
  205. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  206. data/lib/avo/fields/has_base_field.rb +21 -17
  207. data/lib/avo/fields/has_many_field.rb +5 -2
  208. data/lib/avo/fields/has_one_field.rb +8 -12
  209. data/lib/avo/fields/heading_field.rb +9 -14
  210. data/lib/avo/fields/hidden_field.rb +1 -1
  211. data/lib/avo/fields/id_field.rb +3 -3
  212. data/lib/avo/fields/location_field.rb +10 -10
  213. data/lib/avo/fields/password_field.rb +1 -1
  214. data/lib/avo/fields/preview_field.rb +14 -0
  215. data/lib/avo/fields/select_field.rb +12 -8
  216. data/lib/avo/fields/status_field.rb +7 -1
  217. data/lib/avo/fields/text_field.rb +2 -2
  218. data/lib/avo/filters/base_filter.rb +9 -4
  219. data/lib/avo/html/builder.rb +8 -8
  220. data/lib/avo/item_grapher.rb +78 -0
  221. data/lib/avo/licensing/h_q.rb +11 -73
  222. data/lib/avo/licensing/license.rb +5 -1
  223. data/lib/avo/licensing/license_manager.rb +1 -1
  224. data/lib/avo/licensing/pro_license.rb +1 -7
  225. data/lib/avo/loaders/fields_loader.rb +7 -1
  226. data/lib/avo/plugin.rb +36 -0
  227. data/lib/avo/plugin_manager.rb +56 -0
  228. data/lib/avo/prefixed_test_helpers.rb +20 -0
  229. data/lib/avo/reloader.rb +3 -0
  230. data/lib/avo/resources/controls/actions_list.rb +7 -12
  231. data/lib/avo/resources/controls/attach_button.rb +15 -0
  232. data/lib/avo/resources/controls/back_button.rb +1 -1
  233. data/lib/avo/resources/controls/base_control.rb +15 -49
  234. data/lib/avo/resources/controls/create_button.rb +15 -0
  235. data/lib/avo/resources/controls/delete_button.rb +5 -1
  236. data/lib/avo/resources/controls/detach_button.rb +4 -1
  237. data/lib/avo/resources/controls/edit_button.rb +4 -1
  238. data/lib/avo/resources/controls/order_controls.rb +8 -0
  239. data/lib/avo/resources/controls/save_button.rb +13 -0
  240. data/lib/avo/resources/controls/show_button.rb +15 -0
  241. data/lib/avo/resources/items/holder.rb +96 -0
  242. data/lib/avo/resources/items/item_group.rb +44 -0
  243. data/lib/avo/resources/items/main_panel.rb +12 -0
  244. data/lib/avo/resources/items/panel.rb +2 -0
  245. data/lib/avo/resources/items/row.rb +42 -0
  246. data/lib/avo/resources/items/sidebar.rb +46 -0
  247. data/lib/avo/resources/items/tab.rb +54 -0
  248. data/lib/avo/resources/items/tab_group.rb +62 -0
  249. data/lib/avo/resources/resource_manager.rb +179 -0
  250. data/lib/avo/services/authorization_service.rb +11 -110
  251. data/lib/avo/services/debug_service.rb +93 -0
  252. data/lib/avo/services/encryption_service.rb +8 -12
  253. data/lib/avo/services/telemetry_service.rb +85 -0
  254. data/lib/avo/test_helpers.rb +362 -0
  255. data/lib/avo/tools/tool_manager.rb +30 -0
  256. data/lib/avo/version.rb +1 -1
  257. data/lib/avo/view_inquirer.rb +36 -0
  258. data/lib/avo.rb +109 -24
  259. data/lib/generators/avo/action_generator.rb +8 -8
  260. data/lib/generators/avo/card_generator.rb +27 -0
  261. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  262. data/lib/generators/avo/controller_generator.rb +3 -0
  263. data/lib/generators/avo/eject_generator.rb +180 -15
  264. data/lib/generators/avo/field_generator.rb +49 -2
  265. data/lib/generators/avo/filter_generator.rb +8 -8
  266. data/lib/generators/avo/js/install_generator.rb +2 -2
  267. data/lib/generators/avo/resource_generator.rb +12 -9
  268. data/lib/generators/avo/scope_generator.rb +15 -0
  269. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  270. data/lib/generators/avo/templates/action.tt +8 -6
  271. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  272. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  273. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  274. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  275. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  276. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  277. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  278. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  279. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  280. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  281. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  282. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  283. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  284. data/lib/generators/avo/templates/locales/avo.ar.yml +7 -6
  285. data/lib/generators/avo/templates/locales/avo.en.yml +6 -3
  286. data/lib/generators/avo/templates/locales/avo.es.yml +127 -0
  287. data/lib/generators/avo/templates/locales/avo.fr.yml +3 -0
  288. data/lib/generators/avo/templates/locales/avo.nb.yml +3 -0
  289. data/lib/generators/avo/templates/locales/avo.nn.yml +3 -0
  290. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +3 -0
  291. data/lib/generators/avo/templates/locales/avo.pt.yml +3 -0
  292. data/lib/generators/avo/templates/locales/avo.ro.yml +8 -5
  293. data/lib/generators/avo/templates/locales/avo.tr.yml +3 -0
  294. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  295. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  296. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  297. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  298. data/lib/generators/avo/templates/scope.tt +6 -0
  299. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  300. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  301. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  302. data/lib/tasks/avo_tasks.rake +72 -4
  303. data/public/avo-assets/avo.base.css +1893 -1187
  304. data/public/avo-assets/avo.base.js +217 -305
  305. data/public/avo-assets/avo.base.js.map +3 -3
  306. data/public/avo-assets/avo.css +9744 -0
  307. data/public/avo-assets/avo.js +513 -0
  308. data/public/avo-assets/avo.js.map +7 -0
  309. data/tailwind.custom.js +47 -0
  310. data/tailwind.preset.js +152 -0
  311. metadata +107 -114
  312. data/app/components/avo/card_component.html.erb +0 -46
  313. data/app/components/avo/card_component.rb +0 -25
  314. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  315. data/app/components/avo/dashboards/divider_component.rb +0 -19
  316. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  317. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  318. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  319. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  320. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  321. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  322. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  323. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  324. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  325. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  326. data/app/components/avo/index/ordering/base_component.rb +0 -9
  327. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  328. data/app/components/avo/index/ordering/button_component.rb +0 -23
  329. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  330. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  331. data/app/components/avo/item_switcher_component.html.erb +0 -27
  332. data/app/components/avo/item_switcher_component.rb +0 -48
  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/tags_field_controller.js +0 -127
  340. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  341. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  342. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  343. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  344. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  345. data/app/views/avo/dashboards/show.html.erb +0 -38
  346. data/app/views/avo/partials/_global_search.html.erb +0 -19
  347. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  348. data/lib/avo/app.rb +0 -237
  349. data/lib/avo/base_card.rb +0 -161
  350. data/lib/avo/concerns/fetches_things.rb +0 -150
  351. data/lib/avo/concerns/handles_field_args.rb +0 -47
  352. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  353. data/lib/avo/concerns/has_fields.rb +0 -334
  354. data/lib/avo/concerns/has_html_attributes.rb +0 -108
  355. data/lib/avo/concerns/policy_helpers.rb +0 -31
  356. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  357. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  358. data/lib/avo/dashboards/base_divider.rb +0 -35
  359. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  360. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  361. data/lib/avo/dashboards/metric_card.rb +0 -9
  362. data/lib/avo/dashboards/partial_card.rb +0 -7
  363. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  364. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  365. data/lib/avo/fields/tags_field.rb +0 -102
  366. data/lib/avo/grid_collector.rb +0 -42
  367. data/lib/avo/hosts/association_scope_host.rb +0 -8
  368. data/lib/avo/hosts/base_host.rb +0 -25
  369. data/lib/avo/hosts/card_visibility.rb +0 -20
  370. data/lib/avo/hosts/dashboard_card.rb +0 -22
  371. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  372. data/lib/avo/hosts/ordering.rb +0 -22
  373. data/lib/avo/hosts/record_host.rb +0 -7
  374. data/lib/avo/hosts/resource_record_host.rb +0 -7
  375. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  376. data/lib/avo/hosts/search_scope_host.rb +0 -7
  377. data/lib/avo/hosts/view_record_host.rb +0 -7
  378. data/lib/avo/hosts/visibility_host.rb +0 -12
  379. data/lib/avo/items_holder.rb +0 -96
  380. data/lib/avo/main_panel.rb +0 -3
  381. data/lib/avo/menu/base_item.rb +0 -25
  382. data/lib/avo/menu/builder.rb +0 -82
  383. data/lib/avo/menu/dashboard.rb +0 -22
  384. data/lib/avo/menu/group.rb +0 -2
  385. data/lib/avo/menu/link.rb +0 -6
  386. data/lib/avo/menu/menu.rb +0 -2
  387. data/lib/avo/menu/resource.rb +0 -22
  388. data/lib/avo/menu/section.rb +0 -2
  389. data/lib/avo/panel.rb +0 -24
  390. data/lib/avo/panel_builder.rb +0 -25
  391. data/lib/avo/resources/controls/action.rb +0 -38
  392. data/lib/avo/resources/controls/execution_context.rb +0 -58
  393. data/lib/avo/resources/controls/items_holder.rb +0 -19
  394. data/lib/avo/resources/controls/link_to.rb +0 -27
  395. data/lib/avo/row.rb +0 -26
  396. data/lib/avo/row_builder.rb +0 -24
  397. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  398. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  399. data/lib/avo/sidebar.rb +0 -30
  400. data/lib/avo/sidebar_builder.rb +0 -24
  401. data/lib/avo/tab.rb +0 -72
  402. data/lib/avo/tab_builder.rb +0 -25
  403. data/lib/avo/tab_group.rb +0 -42
  404. data/lib/avo/tab_group_builder.rb +0 -43
  405. data/lib/avo/tools_manager.rb +0 -11
  406. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  407. data/lib/generators/avo/card/metric_generator.rb +0 -18
  408. data/lib/generators/avo/card/partial_generator.rb +0 -19
  409. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  410. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  411. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -12,7 +12,13 @@ module Avo
12
12
 
13
13
  attr_reader :arguments
14
14
 
15
- delegate :params, to: Avo::App
15
+ delegate :params, to: Avo::Current
16
+ delegate :request, to: Avo::Current
17
+ delegate :view_context, to: Avo::Current
18
+
19
+ def current_user
20
+ Avo::Current.user
21
+ end
16
22
 
17
23
  class << self
18
24
  def decode_filters(filter_params)
@@ -68,14 +74,13 @@ module Avo
68
74
  return true if visible.blank?
69
75
 
70
76
  # Run the visible block if available
71
- Avo::Hosts::VisibilityHost.new(
72
- block: visible,
77
+ Avo::ExecutionContext.new(
78
+ target: visible,
73
79
  params: params,
74
80
  parent_resource: parent_resource,
75
81
  resource: resource,
76
82
  arguments: arguments
77
83
  ).handle
78
-
79
84
  end
80
85
  end
81
86
  end
@@ -19,9 +19,13 @@ 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
+
26
+ def current_user
27
+ Avo::Current.user
28
+ end
25
29
 
26
30
  def initialize(record: nil, resource: nil)
27
31
  @wrapper_stack = {}
@@ -120,11 +124,7 @@ class Avo::HTML::Builder
120
124
 
121
125
  # Parse the properties and assign them to the blocks
122
126
  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
127
+ value = Avo::ExecutionContext.new(target: block || payload, record: record).handle
128
128
 
129
129
  send("#{property}_stack=", value)
130
130
  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
@@ -4,9 +4,9 @@ module Avo
4
4
  attr_accessor :current_request
5
5
  attr_accessor :cache_store
6
6
 
7
- ENDPOINT = "https://avohq.io/api/v1/licenses/check".freeze unless const_defined?(:ENDPOINT)
7
+ ENDPOINT = "https://v3.avohq.io/api/v3/licenses/check".freeze unless const_defined?(:ENDPOINT)
8
8
  REQUEST_TIMEOUT = 5 unless const_defined?(:REQUEST_TIMEOUT) # seconds
9
- CACHE_TIME = 3600 unless const_defined?(:CACHE_TIME) # seconds
9
+ CACHE_TIME = 6.hours.to_i unless const_defined?(:CACHE_TIME) # seconds
10
10
 
11
11
  class << self
12
12
  def cache_key
@@ -16,7 +16,7 @@ module Avo
16
16
 
17
17
  def initialize(current_request = nil)
18
18
  @current_request = current_request
19
- @cache_store = Avo::App.cache_store
19
+ @cache_store = Avo.cache_store
20
20
  end
21
21
 
22
22
  def response
@@ -35,14 +35,12 @@ module Avo
35
35
 
36
36
  # Some cache stores don't auto-expire their keys and payloads so we need to do it for them
37
37
  def expire_cache_if_overdue
38
- return unless cached_response.present?
39
- return unless cached_response["fetched_at"].present?
38
+ return unless cached_response.present? || cached_response&.fetch(:fetched_at, nil).present?
40
39
 
41
- allowed_time = 1.hour
42
40
  parsed_time = Time.parse(cached_response["fetched_at"].to_s)
43
- time_has_passed = parsed_time < Time.now - allowed_time
41
+ cache_should_expire = parsed_time < Time.now - CACHE_TIME
44
42
 
45
- clear_response if time_has_passed
43
+ clear_response if cache_should_expire
46
44
  end
47
45
 
48
46
  def fresh_response
@@ -69,52 +67,14 @@ module Avo
69
67
  app_name: app_name
70
68
  }
71
69
 
72
- metadata = avo_metadata
73
- if metadata[:resources_count] != 0
74
- result[:avo_metadata] = metadata
75
- end
70
+ # metadata = Avo::Services::DebugService.avo_metadata
71
+ # if metadata[:resources_count] != 0
72
+ # result[:avo_metadata] = "metadata"
73
+ # end
76
74
 
77
75
  result
78
76
  end
79
77
 
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
78
  def cached_response
119
79
  cache_store.read self.class.cache_key
120
80
  end
@@ -185,7 +145,7 @@ module Avo
185
145
  end
186
146
 
187
147
  def perform_request
188
- ::Rails.logger.debug "[Avo] Performing request to avohq.io API to check license availability." if Rails.env.development?
148
+ Avo.logger.debug "Performing request to avohq.io API to check license availability." if Rails.env.development?
189
149
 
190
150
  if Rails.env.test?
191
151
  OpenStruct.new({code: 200, parsed_response: {id: "pro", valid: true}})
@@ -200,28 +160,6 @@ module Avo
200
160
  nil
201
161
  end
202
162
 
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
163
  def cache_and_return_error(error, exception_message = "")
226
164
  cache_response response: {
227
165
  id: Avo.configuration.license,
@@ -25,6 +25,10 @@ module Avo
25
25
  id == "pro"
26
26
  end
27
27
 
28
+ def advanced?
29
+ id == "advanced"
30
+ end
31
+
28
32
  def error
29
33
  @response["error"]
30
34
  end
@@ -64,7 +68,7 @@ module Avo
64
68
  if id.present?
65
69
  id.humanize
66
70
  else
67
- self.class.to_s.split('::').last.underscore.humanize.gsub ' license', ''
71
+ self.class.to_s.split("::").last.underscore.humanize.gsub " license", ""
68
72
  end
69
73
  end
70
74
  end
@@ -9,7 +9,7 @@ module Avo
9
9
  case @hq_response["id"]
10
10
  when "community"
11
11
  CommunityLicense.new @hq_response
12
- when "pro"
12
+ when "pro", "advanced"
13
13
  ProLicense.new @hq_response
14
14
  else
15
15
  NilLicense.new @hq_response
@@ -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
  ]
@@ -6,7 +6,7 @@ module Avo
6
6
  end
7
7
 
8
8
  def method_missing(method, *args, &block)
9
- matched_field = Avo::App.fields.find do |field|
9
+ matched_field = Avo.field_manager.find do |field|
10
10
  field[:name].to_s == method.to_s
11
11
  end
12
12
 
@@ -22,6 +22,12 @@ module Avo
22
22
  add_field field
23
23
  end
24
24
  end
25
+
26
+ def respond_to_missing?(method)
27
+ Avo.field_manager.find do |field|
28
+ field[:name].to_s == method.to_s
29
+ end
30
+ end
25
31
  end
26
32
  end
27
33
  end
data/lib/avo/plugin.rb ADDED
@@ -0,0 +1,36 @@
1
+ module Avo
2
+ class Plugin
3
+ def initialize(*, **, &block)
4
+ end
5
+
6
+ class << self
7
+ def name
8
+ return gemspec.name if gemspec.present?
9
+
10
+ self.to_s.split("::").first
11
+ end
12
+
13
+ def version
14
+ "#{namespace}::VERSION".safe_constantize
15
+ end
16
+
17
+ def engine
18
+ "#{namespace}::Engine".safe_constantize
19
+ end
20
+
21
+ def namespace
22
+ modules = to_s.split("::")
23
+ modules.pop
24
+ modules.join("::")
25
+ end
26
+
27
+ def gemspec
28
+ return if engine.blank?
29
+
30
+ gemspec_path = Dir["#{engine.root}/*.gemspec"].first
31
+
32
+ Gem::Specification::load(gemspec_path)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,56 @@
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.field_manager.load_field method_name, klass
29
+ end
30
+
31
+ def register_resource_tool
32
+ end
33
+
34
+ def register_tool
35
+ end
36
+
37
+ def as_json(*arg)
38
+ plugins.map do |plugin|
39
+ {
40
+ klass: plugin.klass.to_s,
41
+ priority: plugin.priority,
42
+ }
43
+ end
44
+ end
45
+
46
+ def installed?(name)
47
+ plugins.any? do |plugin|
48
+ plugin.klass.to_s.chomp("::Plugin").underscore.tr("/", "-") == name.to_s
49
+ end
50
+ end
51
+ end
52
+
53
+ def self.plugin_manager
54
+ @plugin_manager ||= PluginManager.new
55
+ end
56
+ 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_dynamic_filters_installed?
49
+ dirs[Avo::DynamicFilters::Engine.root.join("lib", "avo", "dynamic_filters").to_s] = ["rb"]
50
+ end
48
51
  end
49
52
 
50
53
  dirs
@@ -2,20 +2,15 @@ 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, :include, :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
+ @include = args[:include] || []
13
+ @style = args[:style] || :outline
19
14
  end
20
15
  end
21
16
  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].humanize(capitalize: false)) 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]).humanize 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]).humanize 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]).humanize 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