avo 2.51.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 (377) 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 +15 -26
  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/hidden_field/edit_component.html.erb +1 -2
  40. data/app/components/avo/fields/index_component.rb +5 -5
  41. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  42. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  43. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
  44. data/app/components/avo/fields/show_component.rb +4 -1
  45. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  46. data/app/components/avo/filters_component.html.erb +9 -3
  47. data/app/components/avo/filters_component.rb +4 -4
  48. data/app/components/avo/index/field_wrapper_component.rb +0 -12
  49. data/app/components/avo/index/grid_item_component.html.erb +13 -36
  50. data/app/components/avo/index/grid_item_component.rb +43 -16
  51. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  52. data/app/components/avo/index/resource_controls_component.rb +124 -17
  53. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  54. data/app/components/avo/index/resource_grid_component.rb +5 -2
  55. data/app/components/avo/index/resource_map_component.html.erb +1 -1
  56. data/app/components/avo/index/resource_map_component.rb +3 -3
  57. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  58. data/app/components/avo/index/resource_table_component.rb +14 -20
  59. data/app/components/avo/index/table_row_component.html.erb +8 -4
  60. data/app/components/avo/index/table_row_component.rb +3 -2
  61. data/app/components/avo/item_switcher_component.rb +2 -2
  62. data/app/components/avo/modal_component.html.erb +7 -12
  63. data/app/components/avo/modal_component.rb +0 -21
  64. data/app/components/avo/paginator_component.html.erb +40 -29
  65. data/app/components/avo/paginator_component.rb +5 -23
  66. data/app/components/avo/panel_component.html.erb +8 -6
  67. data/app/components/avo/referrer_params_component.html.erb +1 -2
  68. data/app/components/avo/resource_component.rb +189 -14
  69. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  70. data/app/components/avo/resource_sidebar_component.rb +1 -1
  71. data/app/components/avo/sidebar/link_component.rb +1 -1
  72. data/app/components/avo/sidebar_component.html.erb +10 -3
  73. data/app/components/avo/sidebar_component.rb +5 -3
  74. data/app/components/avo/sidebar_profile_component.html.erb +15 -8
  75. data/app/components/avo/tab_group_component.html.erb +13 -7
  76. data/app/components/avo/tab_group_component.rb +1 -6
  77. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  78. data/app/components/avo/tab_switcher_component.rb +4 -39
  79. data/app/components/avo/views/resource_edit_component.html.erb +12 -48
  80. data/app/components/avo/views/resource_edit_component.rb +7 -18
  81. data/app/components/avo/views/resource_index_component.html.erb +41 -47
  82. data/app/components/avo/views/resource_index_component.rb +62 -12
  83. data/app/components/avo/views/resource_show_component.html.erb +6 -149
  84. data/app/components/avo/views/resource_show_component.rb +6 -11
  85. data/app/controllers/avo/actions_controller.rb +27 -24
  86. data/app/controllers/avo/application_controller.rb +105 -151
  87. data/app/controllers/avo/associations_controller.rb +34 -43
  88. data/app/controllers/avo/attachments_controller.rb +4 -4
  89. data/app/controllers/avo/base_controller.rb +105 -110
  90. data/app/controllers/avo/debug_controller.rb +17 -5
  91. data/app/controllers/avo/home_controller.rb +1 -1
  92. data/app/controllers/avo/search_controller.rb +30 -51
  93. data/app/controllers/avo/team_users_controller.rb +4 -0
  94. data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
  95. data/app/helpers/avo/application_helper.rb +15 -9
  96. data/app/helpers/avo/resources_helper.rb +1 -1
  97. data/app/helpers/avo/url_helpers.rb +27 -11
  98. data/app/javascript/avo.base.js +1 -0
  99. data/app/javascript/js/application.js +0 -3
  100. data/app/javascript/js/controllers/action_controller.js +5 -3
  101. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  102. data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
  103. data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
  104. data/app/javascript/js/controllers/filter_controller.js +1 -1
  105. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  106. data/app/javascript/js/controllers/preview_controller.js +24 -0
  107. data/app/javascript/js/controllers/search_controller.js +2 -2
  108. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  109. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  110. data/app/javascript/js/controllers.js +10 -6
  111. data/app/javascript/js/custom-stream-actions.js +15 -0
  112. data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
  113. data/app/views/avo/actions/show.html.erb +10 -7
  114. data/app/views/avo/associations/new.html.erb +2 -2
  115. data/app/views/avo/base/index.html.erb +3 -2
  116. data/app/views/avo/base/new.html.erb +2 -1
  117. data/app/views/avo/base/preview.html.erb +19 -0
  118. data/app/views/avo/base/show.html.erb +1 -1
  119. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  120. data/app/views/avo/debug/report.html.erb +32 -17
  121. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
  122. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  123. data/app/views/avo/partials/_footer.html.erb +1 -1
  124. data/app/views/avo/partials/_javascript.html.erb +5 -0
  125. data/app/views/avo/partials/_logo.html.erb +1 -1
  126. data/app/views/avo/partials/_navbar.html.erb +3 -5
  127. data/app/views/avo/partials/_table_header.html.erb +5 -11
  128. data/app/views/layouts/avo/application.html.erb +4 -2
  129. data/avo.gemspec +11 -12
  130. data/bin/dev +1 -1
  131. data/bin/prod +0 -0
  132. data/config/i18n-tasks.yml +1 -1
  133. data/config/initializers/pagy.rb +0 -2
  134. data/config/master.key +1 -0
  135. data/config/routes.rb +6 -10
  136. data/db/factories.rb +7 -1
  137. data/lib/avo/action_model.rb +20 -0
  138. data/lib/avo/asset_manager.rb +30 -0
  139. data/lib/avo/base_action.rb +57 -42
  140. data/lib/avo/base_resource.rb +264 -227
  141. data/lib/avo/base_resource_tool.rb +9 -16
  142. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  143. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  144. data/lib/avo/concerns/filters_session_handler.rb +5 -3
  145. data/lib/avo/concerns/has_controls.rb +37 -0
  146. data/lib/avo/concerns/has_description.rb +23 -0
  147. data/lib/avo/concerns/has_item_type.rb +42 -0
  148. data/lib/avo/concerns/has_items.rb +325 -0
  149. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  150. data/lib/avo/concerns/is_resource_item.rb +24 -36
  151. data/lib/avo/concerns/is_visible.rb +15 -0
  152. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  153. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  154. data/lib/avo/configuration/branding.rb +0 -12
  155. data/lib/avo/configuration.rb +1 -37
  156. data/lib/avo/current.rb +39 -0
  157. data/lib/avo/dsl/field_parser.rb +1 -1
  158. data/lib/avo/dynamic_router.rb +18 -3
  159. data/lib/avo/engine.rb +35 -30
  160. data/lib/avo/error_manager.rb +25 -0
  161. data/lib/avo/execution_context.rb +10 -14
  162. data/lib/avo/fields/badge_field.rb +1 -1
  163. data/lib/avo/fields/base_field.rb +91 -106
  164. data/lib/avo/fields/belongs_to_field.rb +18 -22
  165. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  166. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  167. data/lib/avo/fields/concerns/has_default.rb +1 -5
  168. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  169. data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
  170. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  171. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  172. data/lib/avo/fields/concerns/is_required.rb +5 -7
  173. data/lib/avo/fields/concerns/is_searchable.rb +13 -0
  174. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  175. data/lib/avo/fields/country_field.rb +4 -0
  176. data/lib/avo/fields/date_time_field.rb +3 -14
  177. data/lib/avo/fields/field_manager.rb +55 -0
  178. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  179. data/lib/avo/fields/has_base_field.rb +12 -15
  180. data/lib/avo/fields/has_many_field.rb +5 -2
  181. data/lib/avo/fields/has_one_field.rb +6 -10
  182. data/lib/avo/fields/heading_field.rb +4 -1
  183. data/lib/avo/fields/hidden_field.rb +1 -1
  184. data/lib/avo/fields/id_field.rb +1 -1
  185. data/lib/avo/fields/location_field.rb +8 -8
  186. data/lib/avo/fields/password_field.rb +1 -1
  187. data/lib/avo/fields/preview_field.rb +14 -0
  188. data/lib/avo/fields/select_field.rb +12 -8
  189. data/lib/avo/fields/status_field.rb +4 -0
  190. data/lib/avo/filters/base_filter.rb +8 -4
  191. data/lib/avo/html/builder.rb +7 -8
  192. data/lib/avo/item_grapher.rb +78 -0
  193. data/lib/avo/licensing/h_q.rb +8 -67
  194. data/lib/avo/licensing/license.rb +1 -1
  195. data/lib/avo/licensing/pro_license.rb +1 -7
  196. data/lib/avo/loaders/fields_loader.rb +7 -1
  197. data/lib/avo/plugin.rb +16 -0
  198. data/lib/avo/plugin_manager.rb +56 -0
  199. data/lib/avo/prefixed_test_helpers.rb +20 -0
  200. data/lib/avo/reloader.rb +3 -0
  201. data/lib/avo/resources/controls/actions_list.rb +7 -12
  202. data/lib/avo/resources/controls/attach_button.rb +15 -0
  203. data/lib/avo/resources/controls/back_button.rb +1 -1
  204. data/lib/avo/resources/controls/base_control.rb +15 -49
  205. data/lib/avo/resources/controls/create_button.rb +15 -0
  206. data/lib/avo/resources/controls/delete_button.rb +5 -1
  207. data/lib/avo/resources/controls/detach_button.rb +4 -1
  208. data/lib/avo/resources/controls/edit_button.rb +4 -1
  209. data/lib/avo/resources/controls/order_controls.rb +8 -0
  210. data/lib/avo/resources/controls/save_button.rb +13 -0
  211. data/lib/avo/resources/controls/show_button.rb +15 -0
  212. data/lib/avo/resources/items/holder.rb +84 -0
  213. data/lib/avo/resources/items/item_group.rb +49 -0
  214. data/lib/avo/resources/items/main_panel.rb +2 -0
  215. data/lib/avo/resources/items/panel.rb +2 -0
  216. data/lib/avo/resources/items/row.rb +54 -0
  217. data/lib/avo/resources/items/sidebar.rb +47 -0
  218. data/lib/avo/resources/items/tab.rb +60 -0
  219. data/lib/avo/resources/items/tab_group.rb +68 -0
  220. data/lib/avo/resources/resource_manager.rb +174 -0
  221. data/lib/avo/services/authorization_service.rb +11 -110
  222. data/lib/avo/services/debug_service.rb +93 -0
  223. data/lib/avo/services/encryption_service.rb +5 -1
  224. data/lib/avo/services/telemetry_service.rb +85 -0
  225. data/lib/avo/test_helpers.rb +362 -0
  226. data/lib/avo/tools/tool_manager.rb +30 -0
  227. data/lib/avo/version.rb +1 -1
  228. data/lib/avo.rb +115 -24
  229. data/lib/generators/avo/action_generator.rb +8 -8
  230. data/lib/generators/avo/card_generator.rb +27 -0
  231. data/lib/generators/avo/filter_generator.rb +8 -8
  232. data/lib/generators/avo/resource_generator.rb +4 -4
  233. data/lib/generators/avo/scope_generator.rb +15 -0
  234. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
  235. data/lib/generators/avo/templates/action.tt +8 -6
  236. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  237. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  238. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  239. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  240. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  241. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  242. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  243. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  244. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  245. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  246. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  247. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  248. data/lib/generators/avo/templates/initializer/avo.tt +1 -9
  249. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  250. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  251. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  252. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  253. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  254. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  255. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  256. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  257. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  258. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  259. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  260. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  261. data/lib/generators/avo/templates/scope.tt +6 -0
  262. data/lib/generators/avo/templates/tool/view.tt +2 -2
  263. data/lib/tasks/avo_tasks.rake +27 -0
  264. data/public/avo-assets/avo.base.css +1810 -1189
  265. data/public/avo-assets/avo.base.js +217 -307
  266. data/public/avo-assets/avo.base.js.map +3 -3
  267. data/public/avo-assets/avo.css +9744 -0
  268. data/public/avo-assets/avo.js +513 -0
  269. data/public/avo-assets/avo.js.map +7 -0
  270. metadata +102 -146
  271. data/app/assets/stylesheets/css/tags.css +0 -32
  272. data/app/components/avo/card_component.html.erb +0 -46
  273. data/app/components/avo/card_component.rb +0 -25
  274. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  275. data/app/components/avo/dashboards/divider_component.rb +0 -19
  276. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  277. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  278. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  279. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  280. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  281. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  282. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  283. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  284. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  285. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  286. data/app/components/avo/index/ordering/base_component.rb +0 -9
  287. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  288. data/app/components/avo/index/ordering/button_component.rb +0 -23
  289. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  290. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  291. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  292. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  293. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  294. data/app/controllers/avo/dashboards_controller.rb +0 -22
  295. data/app/controllers/avo/reorder_controller.rb +0 -25
  296. data/app/javascript/js/controllers/base_controller.js +0 -22
  297. data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
  298. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  299. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  300. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  301. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  302. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  303. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  304. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  305. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  306. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  307. data/app/views/avo/dashboards/show.html.erb +0 -38
  308. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  309. data/app/views/avo/partials/_global_search.html.erb +0 -19
  310. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  311. data/lib/avo/app.rb +0 -237
  312. data/lib/avo/base_card.rb +0 -161
  313. data/lib/avo/concerns/fetches_things.rb +0 -150
  314. data/lib/avo/concerns/handles_field_args.rb +0 -47
  315. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  316. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  317. data/lib/avo/concerns/has_fields.rb +0 -334
  318. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  319. data/lib/avo/concerns/pagination.rb +0 -53
  320. data/lib/avo/concerns/policy_helpers.rb +0 -31
  321. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  322. data/lib/avo/concerns/visible_items.rb +0 -51
  323. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  324. data/lib/avo/dashboards/base_divider.rb +0 -35
  325. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  326. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  327. data/lib/avo/dashboards/metric_card.rb +0 -9
  328. data/lib/avo/dashboards/partial_card.rb +0 -7
  329. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  330. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  331. data/lib/avo/fields/tags_field.rb +0 -102
  332. data/lib/avo/grid_collector.rb +0 -42
  333. data/lib/avo/hosts/association_scope_host.rb +0 -8
  334. data/lib/avo/hosts/base_host.rb +0 -25
  335. data/lib/avo/hosts/card_visibility.rb +0 -20
  336. data/lib/avo/hosts/dashboard_card.rb +0 -22
  337. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  338. data/lib/avo/hosts/ordering.rb +0 -22
  339. data/lib/avo/hosts/record_host.rb +0 -7
  340. data/lib/avo/hosts/resource_record_host.rb +0 -7
  341. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  342. data/lib/avo/hosts/search_scope_host.rb +0 -7
  343. data/lib/avo/hosts/view_record_host.rb +0 -7
  344. data/lib/avo/hosts/visibility_host.rb +0 -12
  345. data/lib/avo/items_holder.rb +0 -96
  346. data/lib/avo/main_panel.rb +0 -3
  347. data/lib/avo/menu/base_item.rb +0 -25
  348. data/lib/avo/menu/builder.rb +0 -82
  349. data/lib/avo/menu/dashboard.rb +0 -22
  350. data/lib/avo/menu/group.rb +0 -2
  351. data/lib/avo/menu/link.rb +0 -6
  352. data/lib/avo/menu/menu.rb +0 -4
  353. data/lib/avo/menu/resource.rb +0 -22
  354. data/lib/avo/menu/section.rb +0 -2
  355. data/lib/avo/panel.rb +0 -24
  356. data/lib/avo/panel_builder.rb +0 -25
  357. data/lib/avo/resources/controls/action.rb +0 -38
  358. data/lib/avo/resources/controls/execution_context.rb +0 -58
  359. data/lib/avo/resources/controls/items_holder.rb +0 -19
  360. data/lib/avo/resources/controls/link_to.rb +0 -27
  361. data/lib/avo/row.rb +0 -26
  362. data/lib/avo/row_builder.rb +0 -24
  363. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  364. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  365. data/lib/avo/sidebar.rb +0 -30
  366. data/lib/avo/sidebar_builder.rb +0 -24
  367. data/lib/avo/tab.rb +0 -72
  368. data/lib/avo/tab_builder.rb +0 -25
  369. data/lib/avo/tab_group.rb +0 -42
  370. data/lib/avo/tab_group_builder.rb +0 -43
  371. data/lib/avo/tools_manager.rb +0 -11
  372. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  373. data/lib/generators/avo/card/metric_generator.rb +0 -18
  374. data/lib/generators/avo/card/partial_generator.rb +0 -19
  375. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  376. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  377. /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -0,0 +1,9 @@
1
+ <% if valid %>
2
+ <span class="text-green-700 text-xl">
3
+ <%= svg "check-badge", class: "h-5 inline -mt-1 relative" %> <span>Valid</span>
4
+ </span>
5
+ <% else %>
6
+ <span class="text-orange-700 text-xl">
7
+ <%= svg "exclamation-circle", class: "h-5 inline -mt-1 relative" %> <span>Invalid</span>
8
+ </span>
9
+ <% end %>
@@ -1,22 +1,37 @@
1
1
  <turbo-frame id="debug-report">
2
- <div class="font-semibold">Debug report <small class="font-normal">(don't post this anywhere public)</small></div>
3
- <div>
4
- <% if defined?(ap) %>
5
- <%== ap Avo::App.debug_report(request) %>
6
- <% else %>
7
- <pre><%== JSON.pretty_generate(Avo::App.debug_report(request)) %></pre>
2
+ <div class="flex gap-2">
3
+ <%= form_with url: avo.avo_private_send_to_hq_path, data: {turbo_frame: :send_to_hq}, class: "w-full" do |f| %>
4
+ <div class="space-y-8 divide-y divide-gray-200">
5
+ <div>
6
+ <div>
7
+ <h3 class="text-lg font-medium leading-6 text-gray-900">Send in a bug report (pro feature)</h3>
8
+ <p class="mt-1 text-sm text-gray-500">If you think there is something wrong with Avo and you'd like to report with some (anonymized) telemetry about the app, please fill in any relevant details and send it in.</p>
9
+ <p class="mt-1 text-sm text-gray-500">Otherwise, please <a href="https://avo.cool/new-issue" target="_blank">create a GitHub issue</a> where everyone can contribute.</p>
10
+ </div>
11
+
12
+ <div class="sm:col-span-6 mt-4">
13
+ <label for="about" class="block text-sm font-medium text-gray-700">Details</label>
14
+ <div class="mt-1">
15
+ <%= f.text_area :body, rows: 3, class: "block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm disabled:bg-gray-100", disabled: !Avo::Current.license.pro? %>
16
+ </div>
17
+ </div>
18
+ <%= f.hidden_field :license_key, value: Avo::Services::DebugService.debug_report(request)[:license_response]["license_key"] %>
19
+ <%= a_button icon: 'heroicons/outline/paper-airplane',
20
+ color: :primary,
21
+ style: :primary,
22
+ class: "mt-4",
23
+ disabled: !Avo::Current.license.pro?,
24
+ type: :submit do %>
25
+ Send to HQ
26
+ <% end %>
27
+ </div>
28
+ </div>
8
29
  <% end %>
9
30
  </div>
10
- <div class="flex justify-end">
11
- <%= a_button icon: 'heroicons/outline/clipboard',
12
- color: :primary,
13
- style: :primary,
14
- data: {
15
- controller: 'copy-to-clipboard',
16
- action: "click->copy-to-clipboard#copy",
17
- text: Avo::App.debug_report(request),
18
- } do %>
19
- Copy debug info
20
- <% end %>
31
+ <div class="text-right">
32
+ <%= turbo_frame_tag :send_to_hq %>
33
+ </div>
34
+ <div class="overflow-auto max-w-full">
35
+
21
36
  </div>
22
37
  </turbo-frame>
@@ -1,7 +1,6 @@
1
1
  <%
2
- license = Avo::App.license
2
+ license = Avo.license
3
3
  information_items = [
4
- 'license',
5
4
  'license_key',
6
5
  'ruby_version',
7
6
  'rails_version',
@@ -14,14 +13,14 @@
14
13
  hq_payload = Avo::Licensing::HQ.new(request).payload
15
14
  %>
16
15
  <div class="flex flex-col">
17
- <%= render Avo::PanelComponent.new(name: 'Debug Avo', description: 'Use this page to debug the Avo license.') do |c| %>
16
+ <%= render Avo::PanelComponent.new(name: 'Avo Status', description: 'Use this page to debug your Avo instance.') do |c| %>
18
17
  <% c.with_tools do %>
19
18
  <% end %>
20
19
  <% c.with_bare_content do %>
21
- <div class="grid gap-4 sm:grid-cols-3">
22
- <div class="relative flex flex-col bg-white rounded shadow-panel p-4 space-y-4 h-full col-span-1">
23
- <div class="flex justify-between w-full">
24
- <div class="font-semibold">License info</div>
20
+ <div class="grid gap-4 grid-cols-2">
21
+ <div class="relative flex flex-col bg-white rounded shadow-panel p-4 space-y-4 h-full">
22
+ <div class="flex justify-between w-full">
23
+ <div class="font-semibold">License info</div>
25
24
  <div class="flex justify-self-end">
26
25
  <%= a_button style: :outline,
27
26
  color: :blue,
@@ -33,10 +32,10 @@
33
32
  Refresh license
34
33
  <% end %>
35
34
  </div>
36
- </div>
35
+ </div>
37
36
  <div class="flex flex-col flex-1">
38
37
  <div>
39
- <div class="text-xl font-semibold"><%= license.name %></div>
38
+ <div class="text-xl font-semibold"><%= render partial: "valid_indicator", locals: {valid: license.valid?} %> <%= license.name %> license </div>
40
39
  <% if license.response['reason'] %>
41
40
  <dl>
42
41
  <dt class="font-semibold text-sm">Error</dt>
@@ -63,17 +62,35 @@
63
62
  (<%= time_ago_in_words license.response['fetched_at'] %> ago)</dd>
64
63
  <% end %>
65
64
  <dt class="font-semibold text-sm">Cache store</dt>
66
- <dd><%= Avo::App.cache_store.class.to_s %> - <%= Avo::App.cache_store.options.inspect %></dd>
67
65
  </dl>
68
66
  </div>
69
67
  </div>
70
68
  </div>
71
69
  </div>
72
- <div class="relative bg-white rounded shadow-panel p-4 space-y-4 col-span-2">
73
- <turbo-frame id="debug-report" src="<%= root_path %>avo_private/debug/report" target="_top" class="block">
74
- Loading...
75
- </turbo-frame>
70
+ <div class="relative flex flex-col bg-white rounded shadow-panel p-4 space-y-4 h-full">
71
+ <div class="flex justify-between w-full">
72
+ <div class="font-semibold">Plugins</div>
73
+ </div>
74
+ <div class="flex flex-col flex-1">
75
+ <div>
76
+ <ul>
77
+ <li>Avo <%= Avo::VERSION %></li>
78
+ <% Avo.plugin_manager.plugins.each do |plugin| %>
79
+ <li><%= plugin.klass.to_s.split("::").first %> <%= plugin.klass.version %></li>
80
+ <% end %>
81
+ </ul>
82
+ </div>
83
+ </div>
76
84
  </div>
85
+ <%= render Avo::PanelComponent.new(title: "Report") do |c| %>
86
+ <% c.with_body do %>
87
+ <div class="p-4">
88
+ <turbo-frame id="debug-report" src="<%= root_path %>avo_private/debug/report" target="_top" class="block">
89
+ Loading...
90
+ </turbo-frame>
91
+ </div>
92
+ <% end %>
93
+ <% end %>
77
94
  </div>
78
95
  <% end %>
79
96
  <% end %>
@@ -5,8 +5,8 @@
5
5
  </a>
6
6
  </div>
7
7
  <% end %>
8
- <% if Avo::App.error_messages.present? %>
9
- <% Avo::App.error_messages.each do |error| %>
8
+ <% if Avo.error_manager.has_errors?.present? %>
9
+ <% Avo.error_manager.all.each do |error| %>
10
10
  <% if error.is_a? Hash %>
11
11
  <%
12
12
  url, message, target = error.values_at :url, :message, :target
@@ -1,3 +1,3 @@
1
1
  <div class="text-center text-sm text-gray-700 <%= 'print:hidden' if Avo.configuration.hide_layout_when_printing %>">
2
- <a href="https://avohq.io/" target="_blank">Avo</a> · &copy; <%= Date.today.year %> AvoHQ · <span title="<%= Avo::App.license.valid ? 'valid' : 'invalid'%> <%= Avo::App.license.id %> license">v<%= Avo::VERSION %></span>
2
+ <a href="https://avohq.io/" target="_blank">Avo</a> · &copy; <%= Date.today.year %> AvoHQ · <span title="<%= Avo.license.valid ? 'valid' : 'invalid'%> <%= Avo.license.id %> license">v<%= Avo::VERSION %></span>
3
3
  </div>
@@ -4,4 +4,9 @@
4
4
  Avo.configuration.root_path = '<%= root_path_without_url %>'
5
5
  Avo.configuration.search_debounce = '<%= Avo.configuration.search_debounce %>'
6
6
  Avo.configuration.cookies_key = '<%= Avo::COOKIES_KEY %>'
7
+ <% if Avo.avo_filters_installed? %>
8
+ Avo.configuration.avo_filters = {
9
+ param_key: '<%= Avo::DynamicFilters.configuration.param_key %>'
10
+ }
11
+ <% end %>
7
12
  <% end %>
@@ -1,4 +1,4 @@
1
- <%= link_to root_path, class: 'logo-placeholder h-full w-full flex justify-start' do %>
1
+ <%= link_to avo.root_path, class: 'logo-placeholder h-full w-full flex justify-start' do %>
2
2
  <%= image_tag Avo.configuration.branding.logo, class: 'hidden sm:block object-contain', title: 'Avo' %>
3
3
  <%= image_tag Avo.configuration.branding.logomark, class: 'sm:hidden object-contain', title: 'Avo' %>
4
4
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <div
2
- class="fixed bg-white p-2 w-full flex flex-shrink-0 items-center z-50 px-4 lg:px-4 border-b space-x-4 lg:space-x-0 h-16 <%= 'print:hidden' if Avo.configuration.hide_layout_when_printing %>"
2
+ class="fixed bg-white p-2 w-full flex flex-shrink-0 items-center z-50 px-4 border-b space-x-4 lg:space-x-0 h-16 <%= 'print:hidden' if Avo.configuration.hide_layout_when_printing %>"
3
3
  v-if="layout !== 'blank'"
4
4
  >
5
5
  <div class="flex items-center space-x-2 w-auto lg:w-64 flex-shrink-0 h-full">
@@ -9,10 +9,8 @@
9
9
  </div>
10
10
  <%= render partial: "avo/partials/logo" %>
11
11
  </div>
12
- <div class="flex-1 flex items-center justify-between lg:justify-start space-x-2 sm:space-x-8 lg:pl-4">
13
- <div class="flex">
14
- <%= render partial: "avo/partials/global_search" if ::Avo::App.license.has_with_trial(:global_search) && ::Avo.configuration.feature_enabled?(:global_search) %>
15
- </div>
12
+ <div class="flex-1 flex items-center justify-between lg:justify-start space-x-2 sm:space-x-8 lg:px-2">
13
+ <%= render Avo::Pro::GlobalSearchComponent.new rescue nil %>
16
14
  <div class="m-0">
17
15
  <%= render partial: "avo/partials/header" %>
18
16
  </div>
@@ -1,4 +1,6 @@
1
- <thead class="bg-white border-b border-gray-200 pb-1">
1
+ <thead
2
+ data-component-name="avo/partials/table_header"
3
+ class="bg-white border-b border-gray-200 pb-1">
2
4
  <% if @resource.record_selector %>
3
5
  <th class="rounded-lg" data-control="item-select-th">
4
6
  <%== item_select_all_input %>
@@ -35,14 +37,6 @@
35
37
  sort_direction = 'desc'
36
38
  end
37
39
  classes = "text-gray-500 tracking-tight leading-tight text-xs font-semibold"
38
- classes += case field.index_text_align.to_sym
39
- when :right
40
- " text-right"
41
- when :center
42
- " text-center"
43
- else
44
- ""
45
- end
46
40
  %>
47
41
  <%= content_tag :th,
48
42
  class: "text-left uppercase px-3 py-3 whitespace-nowrap rounded-l",
@@ -53,12 +47,12 @@
53
47
  } do %>
54
48
  <% if field.sortable %>
55
49
  <%= link_to params.permit!.merge(sort_by: sort_by, sort_direction: sort_direction), class: "flex items-center #{classes} #{'cursor-pointer' if field.sortable}", 'data-turbo-frame': params[:turbo_frame] do %>
56
- <%= field.name %>
50
+ <%= field.table_header_label %>
57
51
  <%= render partial: 'avo/partials/sortable_component', locals: {field: field} %>
58
52
  <% end %>
59
53
  <% else %>
60
54
  <div class="block w-full <%= classes %>">
61
- <%= field.name %>
55
+ <%= field.table_header_label %>
62
56
  </div>
63
57
  <% end %>
64
58
  <% end %>
@@ -9,6 +9,7 @@
9
9
  <%= render partial: 'avo/partials/javascript' %>
10
10
  <%= render partial: 'avo/partials/branding' %>
11
11
  <%= render partial: 'avo/partials/pre_head' %>
12
+ <%= render Avo::AssetManager::StylesheetComponent.new asset_manager: Avo.asset_manager %>
12
13
  <% if Avo::PACKED %>
13
14
  <%= javascript_include_tag "/avo-assets/avo.base", "data-turbo-track": "reload", defer: true %>
14
15
  <%= stylesheet_link_tag "/avo-assets/avo.base", "data-turbo-track": "reload", defer: true %>
@@ -19,6 +20,7 @@
19
20
  <%= javascript_include_tag "hotwire-livereload", defer: true %>
20
21
  <% end %>
21
22
  <% end %>
23
+ <%= render Avo::AssetManager::JavascriptComponent.new asset_manager: Avo.asset_manager %>
22
24
  <%= render partial: 'avo/partials/head' %>
23
25
  </head>
24
26
  <body class="bg-application os-mac">
@@ -58,8 +60,8 @@
58
60
  <%= render partial: "avo/partials/scripts" %>
59
61
  <!-- Avo version: <%= Avo::VERSION %> -->
60
62
  <!-- Environment: <%= Rails.env %> -->
61
- <!-- License ID: <%= Avo::App.license.id %> -->
62
- <!-- License valid?: <%= Avo::App.license.valid ? "valid" : "invalid" %> -->
63
+ <!-- License ID: <%= Avo.license.id %> -->
64
+ <!-- License valid?: <%= Avo.license.valid ? "valid" : "invalid" %> -->
63
65
  </body>
64
66
  </html>
65
67
  <!-- ✨ Built with Avo • https://www.avohq.io/ -->
data/avo.gemspec CHANGED
@@ -1,19 +1,18 @@
1
- $:.push File.expand_path("lib", __dir__)
1
+ # $:.push File.expand_path("lib", __dir__)
2
2
 
3
3
  # Maintain your gem's version:
4
- require "avo/version"
4
+ require_relative "lib/avo/version"
5
5
 
6
6
  # Describe your gem and declare its dependencies:
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = "avo"
9
9
  spec.version = Avo::VERSION
10
- spec.authors = ["Adrian Marin", "Mihai Marin", "Paul Bob"]
10
+ spec.authors = ["Adrian Marin", "Mihai Marin"]
11
11
  spec.email = ["avo@avohq.io"]
12
12
  spec.homepage = "https://avohq.io"
13
- spec.summary = "Admin panel framework and Content Management System for Ruby on Rails."
14
- spec.description = "Avo is a very custom Content Management System for Ruby on Rails that saves engineers and teams months of development time by building user interfaces and logic using configuration rather than traditional coding; When configuration is not enough, you can fallback to familiar Ruby on Rails code."
15
- spec.license = "LGPL-3.0"
16
- spec.licenses = ["LGPL-3.0", "Commercial"]
13
+ spec.summary = "Configuration-based, no-maintenance, extendable Ruby on Rails admin panel framework."
14
+ spec.description = "Avo abstracts away the common parts of building apps, letting your engineers work on your app's essential components. The result is a full-featured admin panel that works out of the box, ready to give to your end-users."
15
+ spec.license = "Commercial"
17
16
 
18
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
19
18
  # to allow pushing to a single host or delete this section to allow pushing to any host.
@@ -28,20 +27,20 @@ Gem::Specification.new do |spec|
28
27
  "public gem pushes."
29
28
  end
30
29
 
31
- spec.required_ruby_version = ">= 2.6.0"
30
+ spec.required_ruby_version = ">= 3.0.0"
32
31
  spec.post_install_message = "Thank you for using Avo 💪 Docs are available at https://docs.avohq.io"
33
32
 
34
33
  spec.files = Dir["{bin,app,config,db,lib,public}/**/*", "MIT-LICENSE", "Rakefile", "README.md", "avo.gemspec", "Gemfile", "Gemfile.lock"]
35
34
 
36
- spec.add_dependency "activerecord", ">= 6.0"
37
- spec.add_dependency "actionview", ">= 6.0"
35
+ spec.add_dependency "activerecord", ">= 6.1"
36
+ spec.add_dependency "activesupport", ">= 6.1"
37
+ spec.add_dependency "actionview", ">= 6.1"
38
38
  spec.add_dependency "pagy"
39
39
  spec.add_dependency "zeitwerk", ">= 2.6.2"
40
40
  spec.add_dependency "httparty"
41
41
  spec.add_dependency "active_link_to"
42
- spec.add_dependency "view_component", ">= 2.54.0"
42
+ spec.add_dependency "view_component", ">= 3.0.0"
43
43
  spec.add_dependency "turbo-rails"
44
- spec.add_dependency "turbo_power", "~> 0.5.0"
45
44
  spec.add_dependency "addressable"
46
45
  spec.add_dependency "meta-tags"
47
46
  spec.add_dependency "dry-initializer"
data/bin/dev CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env bash
1
+ #!/usr/bin/env sh
2
2
 
3
3
  PORT="${PORT:-3030}"
4
4
  export PORT
data/bin/prod CHANGED
File without changes
@@ -3,7 +3,7 @@
3
3
  # The "main" locale.
4
4
  base_locale: en
5
5
  ## All available locales are inferred from the data by default. Alternatively, specify them explicitly:
6
- locales: [ar, en, es, fr, nb, nn, pt-BR, pt, ro, tr]
6
+ locales: [en, fr, nb, nn, pt-BR, pt, ro, tr]
7
7
  ## Reporting locale, default: en. Available: en, ru.
8
8
  # internal_locale: en
9
9
 
@@ -1,5 +1,4 @@
1
1
  require "pagy/extras/trim"
2
- require "pagy/extras/countless"
3
2
 
4
3
  # For locales without native pagy i18n support
5
4
  def pagy_locale_path(file_name)
@@ -8,7 +7,6 @@ end
8
7
 
9
8
  extra_locales = [
10
9
  {locale: "en"},
11
- {locale: "es"},
12
10
  {locale: "fr"},
13
11
  {locale: "nb"},
14
12
  {locale: "pt-BR"},
data/config/master.key ADDED
@@ -0,0 +1 @@
1
+ 2aeb23d82b909d9c6b5abb62f7058c2a
data/config/routes.rb CHANGED
@@ -4,11 +4,11 @@ Avo::Engine.routes.draw do
4
4
  get "resources", to: redirect(Avo.configuration.root_path)
5
5
  get "dashboards", to: redirect(Avo.configuration.root_path)
6
6
 
7
- post "/rails/active_storage/direct_uploads", to: "/active_storage/direct_uploads#create"
7
+ mount Avo::DynamicFilters::Engine, at: "/avo-dynamic_filters" if defined?(Avo::DynamicFilters::Engine)
8
+ mount Avo::Dashboards::Engine, at: "/dashboards" if defined?(Avo::Dashboards::Engine)
9
+ mount Avo::Pro::Engine, at: "/avo/avo-pro" if defined?(Avo::Pro::Engine)
8
10
 
9
- resources :dashboards do
10
- resources :cards, controller: "dashboards/cards"
11
- end
11
+ post "/rails/active_storage/direct_uploads", to: "/active_storage/direct_uploads#create"
12
12
 
13
13
  scope "avo_api", as: "avo_api" do
14
14
  get "/search", to: "search#index"
@@ -16,11 +16,6 @@ Avo::Engine.routes.draw do
16
16
  post "/resources/:resource_name/:id/attachments/", to: "attachments#create"
17
17
  end
18
18
 
19
- # Records ordering
20
- scope "reorder", as: "reorder" do
21
- patch "/:resource_name/:id", to: "reorder#order", as: "order"
22
- end
23
-
24
19
  get "failed_to_load", to: "home#failed_to_load"
25
20
 
26
21
  scope "resources", as: "resources" do
@@ -44,7 +39,8 @@ Avo::Engine.routes.draw do
44
39
  end
45
40
 
46
41
  scope "/avo_private", as: "avo_private" do
47
- get "/debug", to: "debug#index", as: "debug_index"
42
+ get "/status", to: "debug#status", as: "status"
43
+ post "/status/send_to_hq", to: "debug#send_to_hq", as: "send_to_hq"
48
44
  get "/debug/report", to: "debug#report", as: "debug_report"
49
45
  post "/debug/refresh_license", to: "debug#refresh_license"
50
46
  end
data/db/factories.rb CHANGED
@@ -9,6 +9,12 @@ FactoryBot.define do
9
9
  custom_css { ".header {\n color: red;\n}" }
10
10
  end
11
11
 
12
+ trait :with_post do
13
+ after(:create) do |user|
14
+ create(:post, user_id: user.id)
15
+ end
16
+ end
17
+
12
18
  factory :team do
13
19
  name { Faker::Company.name }
14
20
  description { Faker::Lorem.paragraph(sentence_count: 4) }
@@ -32,7 +38,7 @@ FactoryBot.define do
32
38
  factory :project do
33
39
  name { Faker::App.name }
34
40
  status { ['closed', :rejected, :failed, 'loading', :running, :waiting].sample }
35
- stage { ["Discovery", "Idea", "Done", "On hold", "Cancelled", "Drafting"].sample }
41
+ stage { ["Discovery", "Idea", "Done", "On hold", "Cancelled"].sample }
36
42
  budget { Faker::Number.decimal(l_digits: 4) }
37
43
  country { Faker::Address.country_code }
38
44
  description { Faker::Markdown.sandwich(sentences: 5) }
@@ -0,0 +1,20 @@
1
+ module Avo
2
+ class ActionModel
3
+ include ActiveModel::Model
4
+
5
+ # This class augments a model the action form declaration.
6
+ def initialize(attributes = {})
7
+ set_attr_accessors attributes
8
+
9
+ super(attributes)
10
+ end
11
+
12
+ private
13
+
14
+ def set_attr_accessors(attributes)
15
+ attributes.each do |k, v|
16
+ self.class.class_eval { attr_accessor k }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ module Avo
2
+ class AssetManager
3
+ include ActionView::Helpers::AssetTagHelper
4
+
5
+ attr_reader :stylesheets
6
+ attr_reader :javascripts
7
+
8
+ def initialize
9
+ @stylesheets = []
10
+ @javascripts = []
11
+ end
12
+
13
+ def reset
14
+ @stylesheets = []
15
+ @javascripts = []
16
+ end
17
+
18
+ def add_stylesheet(path)
19
+ @stylesheets.push path
20
+ end
21
+
22
+ def add_javascript(path)
23
+ @javascripts.push path
24
+ end
25
+ end
26
+
27
+ def self.asset_manager
28
+ @manager ||= AssetManager.new
29
+ end
30
+ end