avo 2.46.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 (409) 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 +12 -29
  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 +3 -2
  73. data/app/components/avo/index/resource_table_component.rb +8 -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 +1 -1
  84. data/app/components/avo/paginator_component.rb +6 -6
  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 -86
  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 -180
  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 +139 -91
  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 +5 -3
  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 +10 -6
  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/_footer.html.erb +1 -1
  143. data/app/views/avo/partials/_javascript.html.erb +5 -0
  144. data/app/views/avo/partials/_logo.html.erb +1 -1
  145. data/app/views/avo/partials/_navbar.html.erb +3 -5
  146. data/app/views/avo/partials/_resource_search.html.erb +1 -0
  147. data/app/views/avo/partials/_table_header.html.erb +5 -11
  148. data/app/views/layouts/avo/application.html.erb +5 -4
  149. data/avo.gemspec +10 -8
  150. data/bin/dev +3 -1
  151. data/bin/prod +0 -0
  152. data/config/master.key +1 -0
  153. data/config/routes.rb +7 -10
  154. data/db/factories.rb +6 -0
  155. data/lib/avo/asset_manager.rb +30 -0
  156. data/lib/avo/base_action.rb +82 -67
  157. data/lib/avo/base_resource.rb +286 -226
  158. data/lib/avo/base_resource_tool.rb +9 -16
  159. data/lib/avo/concerns/borrow_items_holder.rb +35 -0
  160. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  161. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
  162. data/lib/avo/concerns/filters_session_handler.rb +7 -5
  163. data/lib/avo/concerns/has_controls.rb +37 -0
  164. data/lib/avo/concerns/has_description.rb +23 -0
  165. data/lib/avo/concerns/has_helpers.rb +18 -0
  166. data/lib/avo/concerns/has_item_type.rb +42 -0
  167. data/lib/avo/concerns/has_items.rb +339 -0
  168. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  169. data/lib/avo/concerns/hydration.rb +17 -0
  170. data/lib/avo/concerns/is_resource_item.rb +16 -36
  171. data/lib/avo/concerns/is_visible.rb +15 -0
  172. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  173. data/lib/avo/concerns/visible_in_different_views.rb +132 -0
  174. data/lib/avo/concerns/visible_items.rb +7 -38
  175. data/lib/avo/configuration/branding.rb +0 -12
  176. data/lib/avo/configuration.rb +28 -11
  177. data/lib/avo/current.rb +39 -0
  178. data/lib/avo/dsl/field_parser.rb +3 -3
  179. data/lib/avo/dynamic_router.rb +18 -3
  180. data/lib/avo/engine.rb +35 -30
  181. data/lib/avo/error_manager.rb +25 -0
  182. data/lib/avo/execution_context.rb +14 -15
  183. data/lib/avo/fields/base_field.rb +84 -122
  184. data/lib/avo/fields/belongs_to_field.rb +19 -23
  185. data/lib/avo/fields/concerns/file_authorization.rb +2 -2
  186. data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
  187. data/lib/avo/fields/concerns/has_default.rb +1 -5
  188. data/lib/avo/fields/concerns/has_field_name.rb +22 -0
  189. data/lib/avo/fields/concerns/has_html_attributes.rb +112 -0
  190. data/lib/avo/fields/concerns/is_disabled.rb +1 -5
  191. data/lib/avo/fields/concerns/is_readonly.rb +1 -5
  192. data/lib/avo/fields/concerns/is_required.rb +5 -7
  193. data/lib/avo/fields/concerns/is_searchable.rb +15 -0
  194. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  195. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  196. data/lib/avo/fields/country_field.rb +4 -0
  197. data/lib/avo/fields/date_time_field.rb +1 -5
  198. data/lib/avo/fields/external_image_field.rb +2 -2
  199. data/lib/avo/fields/field_manager.rb +55 -0
  200. data/lib/avo/fields/file_field.rb +2 -2
  201. data/lib/avo/fields/gravatar_field.rb +2 -2
  202. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  203. data/lib/avo/fields/has_base_field.rb +21 -17
  204. data/lib/avo/fields/has_many_field.rb +5 -2
  205. data/lib/avo/fields/has_one_field.rb +8 -12
  206. data/lib/avo/fields/heading_field.rb +9 -14
  207. data/lib/avo/fields/hidden_field.rb +1 -1
  208. data/lib/avo/fields/id_field.rb +3 -3
  209. data/lib/avo/fields/location_field.rb +10 -10
  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 +7 -1
  214. data/lib/avo/fields/text_field.rb +2 -2
  215. data/lib/avo/filters/base_filter.rb +9 -4
  216. data/lib/avo/html/builder.rb +8 -8
  217. data/lib/avo/item_grapher.rb +78 -0
  218. data/lib/avo/licensing/h_q.rb +11 -73
  219. data/lib/avo/licensing/license.rb +5 -1
  220. data/lib/avo/licensing/license_manager.rb +1 -1
  221. data/lib/avo/licensing/pro_license.rb +1 -7
  222. data/lib/avo/loaders/fields_loader.rb +7 -1
  223. data/lib/avo/plugin.rb +36 -0
  224. data/lib/avo/plugin_manager.rb +56 -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 +7 -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 +96 -0
  239. data/lib/avo/resources/items/item_group.rb +44 -0
  240. data/lib/avo/resources/items/main_panel.rb +12 -0
  241. data/lib/avo/resources/items/panel.rb +2 -0
  242. data/lib/avo/resources/items/row.rb +42 -0
  243. data/lib/avo/resources/items/sidebar.rb +46 -0
  244. data/lib/avo/resources/items/tab.rb +54 -0
  245. data/lib/avo/resources/items/tab_group.rb +62 -0
  246. data/lib/avo/resources/resource_manager.rb +179 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +93 -0
  249. data/lib/avo/services/encryption_service.rb +8 -12
  250. data/lib/avo/services/telemetry_service.rb +85 -0
  251. data/lib/avo/test_helpers.rb +362 -0
  252. data/lib/avo/tools/tool_manager.rb +30 -0
  253. data/lib/avo/version.rb +1 -1
  254. data/lib/avo/view_inquirer.rb +36 -0
  255. data/lib/avo.rb +109 -24
  256. data/lib/generators/avo/action_generator.rb +8 -8
  257. data/lib/generators/avo/card_generator.rb +27 -0
  258. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  259. data/lib/generators/avo/controller_generator.rb +3 -0
  260. data/lib/generators/avo/eject_generator.rb +180 -15
  261. data/lib/generators/avo/field_generator.rb +49 -2
  262. data/lib/generators/avo/filter_generator.rb +8 -8
  263. data/lib/generators/avo/js/install_generator.rb +2 -2
  264. data/lib/generators/avo/resource_generator.rb +12 -9
  265. data/lib/generators/avo/scope_generator.rb +15 -0
  266. data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
  267. data/lib/generators/avo/templates/action.tt +8 -6
  268. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  269. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  270. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  271. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  272. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  273. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  274. data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
  275. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  276. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  277. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  278. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  279. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  280. data/lib/generators/avo/templates/initializer/avo.tt +7 -3
  281. data/lib/generators/avo/templates/locales/avo.ar.yml +1 -0
  282. data/lib/generators/avo/templates/locales/avo.en.yml +4 -3
  283. data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
  284. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
  285. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
  286. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
  287. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
  288. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
  289. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -5
  290. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -0
  291. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  292. data/lib/generators/avo/templates/resource/resource.tt +7 -7
  293. data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
  294. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  295. data/lib/generators/avo/templates/scope.tt +6 -0
  296. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  297. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  298. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  299. data/lib/tasks/avo_tasks.rake +72 -4
  300. data/public/avo-assets/avo.base.css +1893 -1187
  301. data/public/avo-assets/avo.base.js +217 -305
  302. data/public/avo-assets/avo.base.js.map +3 -3
  303. data/public/avo-assets/avo.css +9744 -0
  304. data/public/avo-assets/avo.js +513 -0
  305. data/public/avo-assets/avo.js.map +7 -0
  306. data/tailwind.custom.js +47 -0
  307. data/tailwind.preset.js +152 -0
  308. metadata +106 -116
  309. data/app/components/avo/card_component.html.erb +0 -46
  310. data/app/components/avo/card_component.rb +0 -25
  311. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  312. data/app/components/avo/dashboards/divider_component.rb +0 -19
  313. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  314. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  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/item_switcher_component.html.erb +0 -27
  329. data/app/components/avo/item_switcher_component.rb +0 -48
  330. data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
  331. data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
  332. data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
  333. data/app/controllers/avo/dashboards_controller.rb +0 -22
  334. data/app/controllers/avo/reorder_controller.rb +0 -25
  335. data/app/javascript/js/controllers/base_controller.js +0 -22
  336. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  337. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  338. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  339. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  340. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  341. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  342. data/app/views/avo/dashboards/show.html.erb +0 -38
  343. data/app/views/avo/partials/_global_search.html.erb +0 -19
  344. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  345. data/lib/avo/app.rb +0 -237
  346. data/lib/avo/base_card.rb +0 -161
  347. data/lib/avo/concerns/fetches_things.rb +0 -150
  348. data/lib/avo/concerns/handles_field_args.rb +0 -47
  349. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  350. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  351. data/lib/avo/concerns/has_fields.rb +0 -334
  352. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  353. data/lib/avo/concerns/policy_helpers.rb +0 -31
  354. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  355. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  356. data/lib/avo/dashboards/base_divider.rb +0 -35
  357. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  358. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  359. data/lib/avo/dashboards/metric_card.rb +0 -9
  360. data/lib/avo/dashboards/partial_card.rb +0 -7
  361. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  362. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  363. data/lib/avo/fields/tags_field.rb +0 -102
  364. data/lib/avo/grid_collector.rb +0 -42
  365. data/lib/avo/hosts/association_scope_host.rb +0 -8
  366. data/lib/avo/hosts/base_host.rb +0 -25
  367. data/lib/avo/hosts/card_visibility.rb +0 -20
  368. data/lib/avo/hosts/dashboard_card.rb +0 -22
  369. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  370. data/lib/avo/hosts/ordering.rb +0 -22
  371. data/lib/avo/hosts/record_host.rb +0 -7
  372. data/lib/avo/hosts/resource_record_host.rb +0 -7
  373. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  374. data/lib/avo/hosts/search_scope_host.rb +0 -7
  375. data/lib/avo/hosts/view_record_host.rb +0 -7
  376. data/lib/avo/hosts/visibility_host.rb +0 -12
  377. data/lib/avo/items_holder.rb +0 -96
  378. data/lib/avo/main_panel.rb +0 -3
  379. data/lib/avo/menu/base_item.rb +0 -25
  380. data/lib/avo/menu/builder.rb +0 -82
  381. data/lib/avo/menu/dashboard.rb +0 -22
  382. data/lib/avo/menu/group.rb +0 -2
  383. data/lib/avo/menu/link.rb +0 -6
  384. data/lib/avo/menu/menu.rb +0 -2
  385. data/lib/avo/menu/resource.rb +0 -22
  386. data/lib/avo/menu/section.rb +0 -2
  387. data/lib/avo/panel.rb +0 -24
  388. data/lib/avo/panel_builder.rb +0 -25
  389. data/lib/avo/resources/controls/action.rb +0 -38
  390. data/lib/avo/resources/controls/execution_context.rb +0 -58
  391. data/lib/avo/resources/controls/items_holder.rb +0 -19
  392. data/lib/avo/resources/controls/link_to.rb +0 -27
  393. data/lib/avo/row.rb +0 -26
  394. data/lib/avo/row_builder.rb +0 -24
  395. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  396. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  397. data/lib/avo/sidebar.rb +0 -30
  398. data/lib/avo/sidebar_builder.rb +0 -24
  399. data/lib/avo/tab.rb +0 -72
  400. data/lib/avo/tab_builder.rb +0 -25
  401. data/lib/avo/tab_group.rb +0 -42
  402. data/lib/avo/tab_group_builder.rb +0 -43
  403. data/lib/avo/tools_manager.rb +0 -11
  404. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  405. data/lib/generators/avo/card/metric_generator.rb +0 -18
  406. data/lib/generators/avo/card/partial_generator.rb +0 -19
  407. data/lib/generators/avo/templates/js/avo.custom.js +0 -2
  408. data/lib/generators/avo/templates/standalone_action.tt +0 -8
  409. /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -5,11 +5,7 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def is_readonly?
8
- if readonly.respond_to? :call
9
- Avo::Hosts::ResourceViewRecordHost.new(block: readonly, record: model, view: view, resource: resource).handle
10
- else
11
- readonly
12
- end
8
+ Avo::ExecutionContext.new(target: readonly, record: record, view: view, resource: resource).handle
13
9
  end
14
10
  end
15
11
  end
@@ -5,17 +5,15 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def is_required?
8
- if required.respond_to? :call
9
- Avo::Hosts::ResourceViewRecordHost.new(block: required, record: model, view: view, resource: resource).handle
10
- else
11
- required.nil? ? required_from_validators : required
12
- end
8
+ return required_from_validators if required.nil?
9
+
10
+ Avo::ExecutionContext.new(target: required, record: record, view: view, resource: resource).handle
13
11
  end
14
12
 
15
13
  private
16
14
 
17
15
  def required_from_validators
18
- return false if model.nil?
16
+ return false if record.nil?
19
17
 
20
18
  validators.any? do |validator|
21
19
  validator.is_a? ActiveModel::Validations::PresenceValidator
@@ -23,7 +21,7 @@ module Avo
23
21
  end
24
22
 
25
23
  def validators
26
- model.class.validators_on(id)
24
+ record.class.validators_on(id)
27
25
  end
28
26
  end
29
27
  end
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module IsSearchable
5
+ extend ActiveSupport::Concern
6
+
7
+ def is_searchable?
8
+ return false unless defined?(Avo::Pro)
9
+
10
+ @searchable && Avo.license.has_with_trial(:searchable_associations)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,7 +5,11 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def use_resource
8
- App.get_resource @use_resource
8
+ Avo.resource_manager.get_resource @use_resource
9
+ rescue
10
+ # On boot we eager load the resources before the app is set.
11
+ # Because of that, we don't have a resource manager.
12
+ nil
9
13
  end
10
14
  end
11
15
  end
@@ -0,0 +1,45 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module UseViewComponents
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ attr_reader :components
9
+ end
10
+
11
+ def view_component_name
12
+ "#{type.camelize}Field"
13
+ end
14
+
15
+ # For custom components the namespace will be different than Avo::Fields so we should take that into account.
16
+ def view_component_namespace
17
+ "#{self.class.to_s.deconstantize}::#{view_component_name}"
18
+ end
19
+
20
+ # Try and build the component class or fallback to a blank one
21
+ def component_for_view(view = :index)
22
+ # Use the edit variant for all "update" views
23
+ view = :edit if view.in? [:new, :create, :update]
24
+
25
+ custom_components = Avo::ExecutionContext.new(
26
+ target: components,
27
+ resource: @resource,
28
+ record: @record,
29
+ view: view
30
+ ).handle
31
+
32
+ component_class = custom_components.dig("#{view}_component".to_sym) || "#{view_component_namespace}::#{view.to_s.camelize}Component"
33
+ component_class.to_s.constantize
34
+ rescue
35
+ unless Rails.env.test?
36
+ Avo.logger.info "Failed to find component for the `#{self.class}` field on the `#{view}` view."
37
+ end
38
+ # When returning nil, a race condition happens and throws an error in some environments.
39
+ # See https://github.com/avo-hq/avo/pull/365
40
+ ::Avo::BlankFieldComponent
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -30,6 +30,10 @@ module Avo
30
30
  end
31
31
  end
32
32
  end
33
+
34
+ def options_for_filter
35
+ select_options
36
+ end
33
37
  end
34
38
  end
35
39
  end
@@ -51,11 +51,7 @@ module Avo
51
51
  end
52
52
 
53
53
  def timezone
54
- if @timezone.respond_to?(:call)
55
- return Avo::Hosts::ResourceViewRecordHost.new(block: @timezone, record: resource.model, resource: resource, view: view).handle
56
- end
57
-
58
- @timezone
54
+ Avo::ExecutionContext.new(target: @timezone, record: resource.record, resource: resource, view: view).handle
59
55
  end
60
56
  end
61
57
  end
@@ -4,12 +4,12 @@ module Avo
4
4
  attr_reader :width
5
5
  attr_reader :height
6
6
  attr_reader :radius
7
- attr_reader :link_to_resource
7
+ attr_reader :link_to_record
8
8
 
9
9
  def initialize(id, **args, &block)
10
10
  super(id, **args, &block)
11
11
 
12
- @link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
12
+ @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
13
13
 
14
14
  @width = args[:width].present? ? args[:width] : 40
15
15
  @height = args[:height].present? ? args[:height] : 40
@@ -0,0 +1,55 @@
1
+ module Avo
2
+ module Fields
3
+ class FieldManager
4
+ class << self
5
+ def build
6
+ instance = new
7
+ instance.init_fields
8
+ instance
9
+ end
10
+ end
11
+
12
+ attr_reader :fields
13
+
14
+ def initialize
15
+ @fields = []
16
+ end
17
+
18
+ def all
19
+ fields
20
+ .map do |field|
21
+ field[:name] = field[:name].to_s
22
+
23
+ field
24
+ end
25
+ .uniq do |field|
26
+ field[:name]
27
+ end
28
+ end
29
+
30
+ # This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
31
+ # so later we can instantiate them on our resources.
32
+ #
33
+ # If the field has their `def_method` set up it will follow that convention, if not it will snake_case the name:
34
+ #
35
+ # Avo::Fields::TextField -> text
36
+ # Avo::Fields::DateTimeField -> date_time
37
+ def init_fields
38
+ Avo::Fields::BaseField.descendants.each do |class_name|
39
+ next if class_name.to_s == "BaseField"
40
+
41
+ if class_name.to_s.end_with? "Field"
42
+ load_field class_name.get_field_name, class_name
43
+ end
44
+ end
45
+ end
46
+
47
+ def load_field(method_name, klass)
48
+ fields.push(
49
+ name: method_name.to_s,
50
+ class: klass
51
+ )
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,7 +1,7 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class FileField < BaseField
4
- attr_accessor :link_to_resource
4
+ attr_accessor :link_to_record
5
5
  attr_accessor :is_avatar
6
6
  attr_accessor :is_image
7
7
  attr_accessor :is_audio
@@ -12,7 +12,7 @@ module Avo
12
12
  def initialize(id, **args, &block)
13
13
  super(id, **args, &block)
14
14
 
15
- @link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
15
+ @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
16
16
  @is_avatar = args[:is_avatar].present? ? args[:is_avatar] : false
17
17
  @is_image = args[:is_image].present? ? args[:is_image] : @is_avatar
18
18
  @is_audio = args[:is_audio].present? ? args[:is_audio] : false
@@ -4,7 +4,7 @@ require "erb"
4
4
  module Avo
5
5
  module Fields
6
6
  class GravatarField < BaseField
7
- attr_reader :link_to_resource
7
+ attr_reader :link_to_record
8
8
  attr_reader :rounded
9
9
  attr_reader :size
10
10
  attr_reader :default
@@ -16,7 +16,7 @@ module Avo
16
16
 
17
17
  hide_on [:edit, :new]
18
18
 
19
- @link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
19
+ @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
20
20
  @rounded = args[:rounded].nil? ? true : args[:rounded]
21
21
  @size = args[:size].present? ? args[:size].to_i : 32
22
22
  @default = args[:default].present? ? ERB::Util.url_encode(args[:default]).to_s : ""
@@ -4,8 +4,7 @@ module Avo
4
4
  def initialize(id, **args, &block)
5
5
  args[:updatable] = false
6
6
 
7
- hide_on :all
8
- show_on Avo.configuration.resource_default_view
7
+ only_on Avo.configuration.resource_default_view
9
8
 
10
9
  super(id, **args, &block)
11
10
  end
@@ -1,6 +1,7 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class HasBaseField < BaseField
4
+ include Avo::Fields::Concerns::IsSearchable
4
5
  include Avo::Fields::Concerns::UseResource
5
6
 
6
7
  attr_accessor :display
@@ -25,12 +26,8 @@ module Avo
25
26
  @link_to_child_resource = args[:link_to_child_resource] || false
26
27
  end
27
28
 
28
- def searchable
29
- @searchable && ::Avo::App.license.has_with_trial(:searchable_associations)
30
- end
31
-
32
- def resource
33
- @resource || Avo::App.get_resource_by_model_name(@model.class)
29
+ def field_resource
30
+ resource || Avo.resource_manager.get_resource_by_model_class(@record.class)
34
31
  end
35
32
 
36
33
  def turbo_frame
@@ -38,9 +35,9 @@ module Avo
38
35
  end
39
36
 
40
37
  def frame_url
41
- Avo::Services::URIService.parse(@resource.record_path)
38
+ Avo::Services::URIService.parse(field_resource.record_path)
42
39
  .append_path(id.to_s)
43
- .append_query(turbo_frame: turbo_frame.to_s)
40
+ .append_query(query_params)
44
41
  .to_s
45
42
  end
46
43
 
@@ -53,18 +50,18 @@ module Avo
53
50
 
54
51
  # What the user sees in the text field
55
52
  def field_label
56
- value.send(target_resource.class.title)
53
+ target_resource.new(record: value, view: view, user: user).record_title
57
54
  rescue
58
55
  nil
59
56
  end
60
57
 
61
58
  def target_resource
62
- if @model._reflections[id.to_s].klass.present?
63
- Avo::App.get_resource_by_model_name @model._reflections[id.to_s].klass.to_s
64
- elsif @model._reflections[id.to_s].options[:class_name].present?
65
- Avo::App.get_resource_by_model_name @model._reflections[id.to_s].options[:class_name]
59
+ if @record._reflections[id.to_s].klass.present?
60
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].klass.to_s
61
+ elsif @record._reflections[id.to_s].options[:class_name].present?
62
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].options[:class_name]
66
63
  else
67
- Avo::App.get_resource_by_name id.to_s
64
+ Avo.resource_manager.get_resource_by_name id.to_s
68
65
  end
69
66
  end
70
67
 
@@ -82,15 +79,15 @@ module Avo
82
79
 
83
80
  # Adds the view override component
84
81
  # has_one, has_many, has_and_belongs_to_many fields don't have edit views
85
- def component_for_view(view = :index)
86
- view = :show if view.in? [:new, :create, :update, :edit]
82
+ def component_for_view(view = Avo::ViewInquirer.new("index"))
83
+ view = Avo::ViewInquirer.new("show") if view.in? %w[new create update edit]
87
84
 
88
85
  super view
89
86
  end
90
87
 
91
88
  def authorized?
92
89
  method = "view_#{id}?".to_sym
93
- service = resource.authorization
90
+ service = field_resource.authorization
94
91
 
95
92
  if service.has_method? method
96
93
  service.authorize_action(method, raise_exception: false)
@@ -103,6 +100,13 @@ module Avo
103
100
  use_resource&.name || super
104
101
  end
105
102
 
103
+ def query_params
104
+ {
105
+ turbo_frame: turbo_frame,
106
+ view: view
107
+ }
108
+ end
109
+
106
110
  private
107
111
 
108
112
  def frame_id
@@ -4,11 +4,14 @@ module Avo
4
4
  def initialize(id, **args, &block)
5
5
  args[:updatable] = false
6
6
 
7
- hide_on :all
8
- show_on Avo.configuration.resource_default_view
7
+ only_on Avo.configuration.resource_default_view
9
8
 
10
9
  super(id, **args, &block)
11
10
  end
11
+
12
+ def translated_name(default:)
13
+ t(translation_key, count: 2, default: default_name).capitalize
14
+ end
12
15
  end
13
16
  end
14
17
  end
@@ -4,7 +4,7 @@ module Avo
4
4
  attr_accessor :relation_method
5
5
 
6
6
  def initialize(id, **args, &block)
7
- hide_on :new, :edit
7
+ hide_on :forms
8
8
 
9
9
  super(id, **args, &block)
10
10
 
@@ -14,30 +14,26 @@ module Avo
14
14
  end
15
15
 
16
16
  def label
17
- value.send(target_resource.title)
18
- end
19
-
20
- def resource
21
- Avo::App.get_resource_by_model_name @model.class
17
+ field_label
22
18
  end
23
19
 
24
20
  def frame_url
25
- Avo::Services::URIService.parse(@resource.record_path)
21
+ Avo::Services::URIService.parse(field_resource.record_path)
26
22
  .append_paths(id, value.id)
27
- .append_query(turbo_frame: turbo_frame)
23
+ .append_query(query_params)
28
24
  .to_s
29
25
  end
30
26
 
31
27
  def fill_field(model, key, value, params)
32
28
  if value.blank?
33
- related_model = nil
29
+ related_record = nil
34
30
  else
35
31
  related_class = model.class.reflections[name.to_s.downcase].class_name
36
- related_resource = ::Avo::App.get_resource_by_model_name(related_class)
37
- related_model = related_resource.find_record value
32
+ related_resource = Avo.resource_manager.get_resource_by_model_class(related_class)
33
+ related_record = related_resource.find_record value
38
34
  end
39
35
 
40
- model.public_send("#{key}=", related_model)
36
+ model.public_send("#{key}=", related_record)
41
37
 
42
38
  model
43
39
  end
@@ -1,35 +1,30 @@
1
- require 'securerandom'
1
+ require "securerandom"
2
2
 
3
3
  module Avo
4
4
  module Fields
5
5
  class HeadingField < BaseField
6
6
  attr_reader :as_html
7
- attr_reader :empty
8
-
9
- def initialize(content, **args, &block)
10
- # Mark the field as empty if there's no content passed
11
- @empty = content.blank?
12
- # Add dummy content
13
- content ||= SecureRandom.hex
14
7
 
8
+ def initialize(id, **args, &block)
15
9
  args[:updatable] = false
10
+ @label = args[:label] || id.to_s.humanize
11
+
12
+ super(id, **args, &block)
16
13
 
17
- super(content, **args, &block)
14
+ # this field is not used to update anything
15
+ @for_presentation_only = true
18
16
 
19
17
  hide_on :index
20
18
 
21
- @as_html = args[:as_html].present? ? args[:as_html] : false
19
+ @as_html = args[:as_html].presence || false
22
20
  end
23
21
 
24
22
  def id
25
23
  "heading_#{name.to_s.parameterize.underscore}"
26
24
  end
27
25
 
28
- # Override the value method if the field is empty
29
26
  def value
30
- return nil if empty
31
-
32
- super
27
+ block.present? ? execute_block : @label
33
28
  end
34
29
  end
35
30
  end
@@ -4,7 +4,7 @@ module Avo
4
4
  def initialize(id, **args, &block)
5
5
  super(id, **args, &block)
6
6
 
7
- only_on [:edit, :new]
7
+ only_on :forms
8
8
  end
9
9
  end
10
10
  end
@@ -1,18 +1,18 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class IdField < BaseField
4
- attr_reader :link_to_resource
4
+ attr_reader :link_to_record
5
5
 
6
6
  def initialize(id, **args, &block)
7
7
  args[:readonly] = true
8
8
 
9
- hide_on [:edit, :new]
9
+ hide_on :forms
10
10
 
11
11
  super(id, **args, &block)
12
12
 
13
13
  add_boolean_prop args, :sortable, true
14
14
 
15
- @link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
15
+ @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
16
16
  end
17
17
  end
18
18
  end
@@ -19,9 +19,9 @@ module Avo
19
19
 
20
20
  def as_lat_long_field_id(get)
21
21
  if get == :lat
22
- "#{id}[#{stored_as.first}]"
22
+ stored_as.first
23
23
  elsif get == :long
24
- "#{id}[#{stored_as.last}]"
24
+ stored_as.last
25
25
  end
26
26
  end
27
27
 
@@ -35,20 +35,20 @@ module Avo
35
35
 
36
36
  def as_lat_long_value(get)
37
37
  if get == :lat
38
- model.send(stored_as.first)
38
+ record.send(stored_as.first)
39
39
  elsif get == :long
40
- model.send(stored_as.last)
40
+ record.send(stored_as.last)
41
41
  end
42
42
  end
43
43
 
44
- def fill_field(model, key, value, params)
44
+ def fill_field(record, key, value, params)
45
45
  if value_as_array?
46
46
  latitude_field, longitude_field = stored_as
47
- model.send("#{latitude_field}=", value[latitude_field])
48
- model.send("#{longitude_field}=", value[longitude_field])
49
- model
47
+ record.send("#{latitude_field}=", value[latitude_field])
48
+ record.send("#{longitude_field}=", value[longitude_field])
49
+ record
50
50
  else
51
- super(model, key, value.split(","), params)
51
+ super(record, key, value.split(","), params)
52
52
  end
53
53
  end
54
54
 
@@ -62,7 +62,7 @@ module Avo
62
62
 
63
63
  def value
64
64
  if value_as_array?
65
- [@model.send(stored_as.first), @model.send(stored_as.last)]
65
+ [@record.send(stored_as.first), @record.send(stored_as.last)]
66
66
  else
67
67
  super
68
68
  end
@@ -6,7 +6,7 @@ module Avo
6
6
 
7
7
  super(id, **args, &block)
8
8
 
9
- hide_on [:index, :show]
9
+ hide_on :index, :show
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,14 @@
1
+ module Avo
2
+ module Fields
3
+ class PreviewField < BaseField
4
+ def table_header_label
5
+ # If the user gives us a name, use that, if not, leave it blank
6
+ if @args[:name].present?
7
+ @args[:name]
8
+ else
9
+ ""
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -14,11 +14,14 @@ module Avo
14
14
 
15
15
  @options_from_args = if args[:options].is_a? Hash
16
16
  ActiveSupport::HashWithIndifferentAccess.new args[:options]
17
+ elsif args[:enum].present?
18
+ args[:enum]
17
19
  else
18
20
  args[:options]
19
21
  end
20
- @enum = args[:enum].present? ? args[:enum] : nil
21
- @display_value = args[:display_value].present? ? args[:display_value] : false
22
+
23
+ @enum = args[:enum]
24
+ @display_value = args[:display_value] || false
22
25
  end
23
26
 
24
27
  def options_for_select
@@ -56,13 +59,14 @@ module Avo
56
59
 
57
60
  private
58
61
 
59
- # Cache options as options given on block or as options received from arguments
60
62
  def options
61
- if options_from_args.respond_to? :call
62
- options_from_args.call model: model, resource: resource, view: view, field: self
63
- else
64
- options_from_args
65
- end
63
+ Avo::ExecutionContext.new(
64
+ target: options_from_args,
65
+ record: record,
66
+ resource: resource,
67
+ view: view,
68
+ field: self
69
+ ).handle
66
70
  end
67
71
  end
68
72
  end
@@ -6,17 +6,23 @@ module Avo
6
6
 
7
7
  @loading_when = args[:loading_when].present? ? [args[:loading_when]].flatten.map(&:to_sym) : [:waiting, :running]
8
8
  @failed_when = args[:failed_when].present? ? [args[:failed_when]].flatten.map(&:to_sym) : [:failed]
9
+ @success_when = args[:success_when].present? ? [args[:success_when]].flatten.map(&:to_sym) : []
9
10
  end
10
11
 
11
12
  def status
12
- status = "success"
13
+ status = "neutral"
13
14
  if value.present?
14
15
  status = "failed" if @failed_when.include? value.to_sym
15
16
  status = "loading" if @loading_when.include? value.to_sym
17
+ status = "success" if @success_when.include? value.to_sym
16
18
  end
17
19
 
18
20
  status
19
21
  end
22
+
23
+ def options_for_filter
24
+ [@failed_when, @loading_when].flatten
25
+ end
20
26
  end
21
27
  end
22
28
  end
@@ -1,14 +1,14 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class TextField < BaseField
4
- attr_reader :link_to_resource
4
+ attr_reader :link_to_record
5
5
  attr_reader :as_html
6
6
  attr_reader :protocol
7
7
 
8
8
  def initialize(id, **args, &block)
9
9
  super(id, **args, &block)
10
10
 
11
- add_boolean_prop args, :link_to_resource
11
+ add_boolean_prop args, :link_to_record
12
12
  add_boolean_prop args, :as_html
13
13
  add_string_prop args, :protocol
14
14
  end