avo 2.46.0 → 3.0.0.pre1

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

Potentially problematic release.


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

Files changed (417) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -22
  3. data/Gemfile.lock +181 -160
  4. data/README.md +1 -1
  5. data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
  6. data/app/assets/builds/avo.base.js +93804 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/stylesheets/avo.base.css +2 -2
  9. data/app/assets/svgs/failed_to_load.svg +1 -0
  10. data/app/assets/svgs/font.svg +1 -0
  11. data/app/assets/svgs/grid-empty-state.svg +1 -0
  12. data/app/assets/svgs/table-empty-state.svg +1 -0
  13. data/app/assets/svgs/triangle-up.svg +1 -0
  14. data/app/components/avo/actions_component.html.erb +18 -4
  15. data/app/components/avo/actions_component.rb +12 -18
  16. data/app/components/avo/alert_component.html.erb +1 -1
  17. data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
  18. data/app/components/avo/asset_manager/javascript_component.rb +13 -0
  19. data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
  20. data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
  21. data/app/components/avo/base_component.rb +14 -11
  22. data/app/components/avo/button_component.rb +20 -3
  23. data/app/components/avo/empty_state_component.rb +1 -1
  24. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  25. data/app/components/avo/field_wrapper_component.rb +12 -23
  26. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
  27. data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -20
  28. data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
  29. data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
  30. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -2
  31. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
  32. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  33. data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
  34. data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
  35. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  36. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  37. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  38. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  39. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  40. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  41. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  42. data/app/components/avo/fields/edit_component.rb +1 -1
  43. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  44. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  45. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  46. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  47. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  48. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  49. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  50. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  51. data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
  52. data/app/components/avo/fields/has_one_field/show_component.html.erb +2 -2
  53. data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
  54. data/app/components/avo/fields/index_component.rb +5 -6
  55. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  56. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  57. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  58. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  59. data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
  60. data/app/components/avo/fields/preview_field/index_component.rb +4 -0
  61. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  62. data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
  63. data/app/components/avo/fields/show_component.rb +4 -1
  64. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  65. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  66. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  67. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  68. data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
  69. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  70. data/app/components/avo/filters_component.html.erb +9 -3
  71. data/app/components/avo/filters_component.rb +4 -4
  72. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  73. data/app/components/avo/index/grid_item_component.html.erb +5 -2
  74. data/app/components/avo/index/grid_item_component.rb +7 -6
  75. data/app/components/avo/index/resource_controls_component.html.erb +3 -81
  76. data/app/components/avo/index/resource_controls_component.rb +128 -18
  77. data/app/components/avo/index/resource_grid_component.html.erb +5 -3
  78. data/app/components/avo/index/resource_grid_component.rb +5 -2
  79. data/app/components/avo/index/resource_table_component.html.erb +5 -4
  80. data/app/components/avo/index/resource_table_component.rb +14 -20
  81. data/app/components/avo/index/table_row_component.html.erb +8 -4
  82. data/app/components/avo/index/table_row_component.rb +3 -2
  83. data/app/components/avo/item_switcher_component.html.erb +5 -10
  84. data/app/components/avo/item_switcher_component.rb +2 -3
  85. data/app/components/avo/modal_component.html.erb +7 -12
  86. data/app/components/avo/modal_component.rb +0 -21
  87. data/app/components/avo/paginator_component.html.erb +40 -29
  88. data/app/components/avo/paginator_component.rb +5 -23
  89. data/app/components/avo/panel_component.html.erb +8 -11
  90. data/app/components/avo/panel_component.rb +0 -1
  91. data/app/components/avo/profile_item_component.html.erb +2 -17
  92. data/app/components/avo/profile_item_component.rb +1 -13
  93. data/app/components/avo/referrer_params_component.html.erb +1 -4
  94. data/app/components/avo/resource_component.rb +142 -30
  95. data/app/components/avo/resource_sidebar_component.html.erb +6 -2
  96. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  97. data/app/components/avo/sidebar/link_component.rb +3 -5
  98. data/app/components/avo/sidebar_component.html.erb +9 -2
  99. data/app/components/avo/sidebar_component.rb +5 -3
  100. data/app/components/avo/sidebar_profile_component.html.erb +27 -20
  101. data/app/components/avo/tab_group_component.html.erb +13 -7
  102. data/app/components/avo/tab_group_component.rb +1 -6
  103. data/app/components/avo/tab_switcher_component.html.erb +17 -40
  104. data/app/components/avo/tab_switcher_component.rb +4 -39
  105. data/app/components/avo/views/resource_edit_component.html.erb +16 -52
  106. data/app/components/avo/views/resource_edit_component.rb +7 -18
  107. data/app/components/avo/views/resource_index_component.html.erb +38 -53
  108. data/app/components/avo/views/resource_index_component.rb +60 -16
  109. data/app/components/avo/views/resource_show_component.html.erb +8 -151
  110. data/app/components/avo/views/resource_show_component.rb +6 -11
  111. data/app/controllers/avo/actions_controller.rb +19 -16
  112. data/app/controllers/avo/application_controller.rb +40 -109
  113. data/app/controllers/avo/associations_controller.rb +34 -41
  114. data/app/controllers/avo/attachments_controller.rb +10 -25
  115. data/app/controllers/avo/base_controller.rb +91 -103
  116. data/app/controllers/avo/debug_controller.rb +17 -5
  117. data/app/controllers/avo/search_controller.rb +29 -54
  118. data/app/controllers/avo/team_users_controller.rb +4 -0
  119. data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
  120. data/app/helpers/avo/application_helper.rb +20 -21
  121. data/app/helpers/avo/resources_helper.rb +1 -1
  122. data/app/helpers/avo/url_helpers.rb +27 -11
  123. data/app/javascript/avo.base.js +1 -0
  124. data/app/javascript/js/application.js +0 -5
  125. data/app/javascript/js/controllers/action_controller.js +5 -3
  126. data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
  127. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  128. data/app/javascript/js/controllers/filter_controller.js +1 -1
  129. data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
  130. data/app/javascript/js/controllers/preview_controller.js +24 -0
  131. data/app/javascript/js/controllers/search_controller.js +1 -3
  132. data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
  133. data/app/javascript/js/controllers/toggle_controller.js +48 -0
  134. data/app/javascript/js/controllers.js +12 -8
  135. data/app/javascript/js/custom-stream-actions.js +15 -0
  136. data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
  137. data/app/views/avo/actions/show.html.erb +12 -11
  138. data/app/views/avo/associations/new.html.erb +4 -4
  139. data/app/views/avo/base/index.html.erb +3 -2
  140. data/app/views/avo/base/new.html.erb +2 -1
  141. data/app/views/avo/base/preview.html.erb +19 -0
  142. data/app/views/avo/base/show.html.erb +1 -1
  143. data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
  144. data/app/views/avo/debug/report.html.erb +32 -17
  145. data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -15
  146. data/app/views/avo/home/index.html.erb +1 -1
  147. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  148. data/app/views/avo/partials/_javascript.html.erb +5 -0
  149. data/app/views/avo/partials/_logo.html.erb +1 -1
  150. data/app/views/avo/partials/_navbar.html.erb +3 -5
  151. data/app/views/avo/partials/_table_header.html.erb +5 -3
  152. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  153. data/app/views/avo/private/design.html.erb +2 -2
  154. data/app/views/layouts/avo/application.html.erb +3 -0
  155. data/avo.gemspec +6 -7
  156. data/bin/dev +1 -1
  157. data/bin/prod +0 -0
  158. data/config/i18n-tasks.yml +1 -1
  159. data/config/initializers/pagy.rb +10 -14
  160. data/config/master.key +1 -0
  161. data/config/routes.rb +8 -12
  162. data/db/factories.rb +7 -18
  163. data/lib/avo/action_model.rb +20 -0
  164. data/lib/avo/app.rb +90 -162
  165. data/lib/avo/asset_manager.rb +30 -0
  166. data/lib/avo/base_action.rb +38 -36
  167. data/lib/avo/base_resource.rb +108 -96
  168. data/lib/avo/base_resource_tool.rb +9 -16
  169. data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
  170. data/lib/avo/concerns/filters_session_handler.rb +1 -0
  171. data/lib/avo/concerns/has_controls.rb +37 -0
  172. data/lib/avo/concerns/has_item_type.rb +38 -0
  173. data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
  174. data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
  175. data/lib/avo/concerns/is_resource_item.rb +24 -36
  176. data/lib/avo/concerns/is_visible.rb +15 -0
  177. data/lib/avo/concerns/visible_in_different_views.rb +126 -0
  178. data/lib/avo/configuration/branding.rb +0 -12
  179. data/lib/avo/configuration.rb +8 -45
  180. data/lib/avo/current.rb +5 -0
  181. data/lib/avo/dsl/field_parser.rb +1 -1
  182. data/lib/avo/dynamic_router.rb +6 -2
  183. data/lib/avo/engine.rb +37 -30
  184. data/lib/avo/error_manager.rb +25 -0
  185. data/lib/avo/execution_context.rb +9 -15
  186. data/lib/avo/fields/badge_field.rb +1 -1
  187. data/lib/avo/fields/base_field.rb +72 -124
  188. data/lib/avo/fields/belongs_to_field.rb +14 -25
  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 +110 -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 +13 -0
  197. data/lib/avo/fields/concerns/use_resource.rb +5 -1
  198. data/lib/avo/fields/country_field.rb +4 -0
  199. data/lib/avo/fields/date_field.rb +3 -16
  200. data/lib/avo/fields/date_time_field.rb +1 -5
  201. data/lib/avo/fields/field_manager.rb +45 -0
  202. data/lib/avo/fields/file_field.rb +0 -2
  203. data/lib/avo/fields/files_field.rb +0 -6
  204. data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
  205. data/lib/avo/fields/has_base_field.rb +11 -14
  206. data/lib/avo/fields/has_many_field.rb +5 -2
  207. data/lib/avo/fields/has_one_field.rb +5 -10
  208. data/lib/avo/fields/heading_field.rb +4 -1
  209. data/lib/avo/fields/hidden_field.rb +1 -1
  210. data/lib/avo/fields/id_field.rb +2 -3
  211. data/lib/avo/fields/password_field.rb +1 -1
  212. data/lib/avo/fields/preview_field.rb +14 -0
  213. data/lib/avo/fields/select_field.rb +12 -8
  214. data/lib/avo/fields/status_field.rb +4 -0
  215. data/lib/avo/filters/base_filter.rb +3 -8
  216. data/lib/avo/grid_collector.rb +7 -9
  217. data/lib/avo/html/builder.rb +5 -8
  218. data/lib/avo/item_grapher.rb +78 -0
  219. data/lib/avo/licensing/h_q.rb +4 -68
  220. data/lib/avo/licensing/license.rb +2 -2
  221. data/lib/avo/licensing/license_manager.rb +1 -1
  222. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  223. data/lib/avo/licensing/pro_license.rb +1 -7
  224. data/lib/avo/plugin.rb +6 -0
  225. data/lib/avo/plugin_manager.rb +58 -0
  226. data/lib/avo/prefixed_test_helpers.rb +20 -0
  227. data/lib/avo/reloader.rb +3 -0
  228. data/lib/avo/resources/controls/actions_list.rb +6 -12
  229. data/lib/avo/resources/controls/attach_button.rb +15 -0
  230. data/lib/avo/resources/controls/back_button.rb +1 -1
  231. data/lib/avo/resources/controls/base_control.rb +15 -49
  232. data/lib/avo/resources/controls/create_button.rb +15 -0
  233. data/lib/avo/resources/controls/delete_button.rb +5 -1
  234. data/lib/avo/resources/controls/detach_button.rb +4 -1
  235. data/lib/avo/resources/controls/edit_button.rb +4 -1
  236. data/lib/avo/resources/controls/order_controls.rb +8 -0
  237. data/lib/avo/resources/controls/save_button.rb +13 -0
  238. data/lib/avo/resources/controls/show_button.rb +15 -0
  239. data/lib/avo/resources/items/holder.rb +76 -0
  240. data/lib/avo/resources/items/item_group.rb +48 -0
  241. data/lib/avo/resources/items/main_panel.rb +2 -0
  242. data/lib/avo/resources/items/panel.rb +2 -0
  243. data/lib/avo/resources/items/sidebar.rb +47 -0
  244. data/lib/avo/resources/items/tab.rb +60 -0
  245. data/lib/avo/resources/items/tab_group.rb +68 -0
  246. data/lib/avo/resources/resource_manager.rb +181 -0
  247. data/lib/avo/services/authorization_service.rb +11 -110
  248. data/lib/avo/services/debug_service.rb +92 -0
  249. data/lib/avo/services/telemetry_service.rb +84 -0
  250. data/lib/avo/test_helpers.rb +362 -0
  251. data/lib/avo/tools/tool_manager.rb +30 -0
  252. data/lib/avo/version.rb +1 -1
  253. data/lib/avo.rb +7 -0
  254. data/lib/generators/avo/eject_generator.rb +0 -1
  255. data/lib/generators/avo/install_generator.rb +1 -11
  256. data/lib/generators/avo/resource_generator.rb +5 -23
  257. data/lib/generators/avo/scope_generator.rb +15 -0
  258. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
  259. data/lib/generators/avo/templates/action.tt +1 -1
  260. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  261. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  262. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  263. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  264. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  265. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  266. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  267. data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
  268. data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
  269. data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
  270. data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
  271. data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
  272. data/lib/generators/avo/templates/initializer/avo.tt +1 -11
  273. data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
  274. data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
  275. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
  276. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
  277. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
  278. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
  279. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
  280. data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
  281. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
  282. data/lib/generators/avo/templates/resource/resource.tt +1 -1
  283. data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
  284. data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
  285. data/lib/generators/avo/templates/scope.tt +6 -0
  286. data/lib/generators/avo/templates/standalone_action.tt +1 -1
  287. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  288. data/lib/generators/avo/templates/tool/view.tt +2 -2
  289. data/lib/tasks/avo_tasks.rake +22 -0
  290. metadata +82 -161
  291. data/app/assets/stylesheets/css/tags.css +0 -32
  292. data/app/assets/svgs/map-empty-state.svg +0 -35
  293. data/app/assets/svgs/map-view-type.svg +0 -3
  294. data/app/components/avo/card_component.html.erb +0 -46
  295. data/app/components/avo/card_component.rb +0 -25
  296. data/app/components/avo/dashboards/divider_component.html.erb +0 -9
  297. data/app/components/avo/dashboards/divider_component.rb +0 -19
  298. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  299. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  300. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  301. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  302. data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
  303. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
  304. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  305. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  306. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  307. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  308. data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
  309. data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
  310. data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
  311. data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
  312. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  313. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  314. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  315. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  316. data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
  317. data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
  318. data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
  319. data/app/components/avo/fields/tags_field/index_component.rb +0 -9
  320. data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
  321. data/app/components/avo/fields/tags_field/show_component.rb +0 -5
  322. data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
  323. data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
  324. data/app/components/avo/index/ordering/base_component.rb +0 -9
  325. data/app/components/avo/index/ordering/button_component.html.erb +0 -11
  326. data/app/components/avo/index/ordering/button_component.rb +0 -23
  327. data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
  328. data/app/components/avo/index/ordering/buttons_component.rb +0 -47
  329. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  330. data/app/components/avo/index/resource_map_component.rb +0 -109
  331. data/app/components/avo/row_component.html.erb +0 -3
  332. data/app/components/avo/row_component.rb +0 -12
  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/reload_belongs_to_field_controller.js +0 -51
  340. data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
  341. data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
  342. data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
  343. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
  344. data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
  345. data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
  346. data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
  347. data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
  348. data/app/views/avo/dashboards/cards/show.html.erb +0 -3
  349. data/app/views/avo/dashboards/show.html.erb +0 -38
  350. data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
  351. data/app/views/avo/partials/_global_search.html.erb +0 -19
  352. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  353. data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
  354. data/lib/avo/base_card.rb +0 -161
  355. data/lib/avo/concerns/fetches_things.rb +0 -150
  356. data/lib/avo/concerns/handles_field_args.rb +0 -47
  357. data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
  358. data/lib/avo/concerns/has_editable_controls.rb +0 -34
  359. data/lib/avo/concerns/has_html_attributes.rb +0 -123
  360. data/lib/avo/concerns/pagination.rb +0 -53
  361. data/lib/avo/concerns/policy_helpers.rb +0 -31
  362. data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
  363. data/lib/avo/concerns/visible_items.rb +0 -51
  364. data/lib/avo/dashboards/base_dashboard.rb +0 -89
  365. data/lib/avo/dashboards/base_divider.rb +0 -35
  366. data/lib/avo/dashboards/chartkick_card.rb +0 -77
  367. data/lib/avo/dashboards/dashboard_card.rb +0 -6
  368. data/lib/avo/dashboards/metric_card.rb +0 -9
  369. data/lib/avo/dashboards/partial_card.rb +0 -7
  370. data/lib/avo/fields/area_field.rb +0 -39
  371. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  372. data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
  373. data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
  374. data/lib/avo/fields/location_field.rb +0 -86
  375. data/lib/avo/fields/tags_field.rb +0 -102
  376. data/lib/avo/hosts/association_scope_host.rb +0 -8
  377. data/lib/avo/hosts/base_host.rb +0 -25
  378. data/lib/avo/hosts/card_visibility.rb +0 -20
  379. data/lib/avo/hosts/dashboard_card.rb +0 -22
  380. data/lib/avo/hosts/dashboard_visibility.rb +0 -19
  381. data/lib/avo/hosts/ordering.rb +0 -22
  382. data/lib/avo/hosts/record_host.rb +0 -7
  383. data/lib/avo/hosts/resource_record_host.rb +0 -7
  384. data/lib/avo/hosts/resource_view_record_host.rb +0 -7
  385. data/lib/avo/hosts/search_scope_host.rb +0 -7
  386. data/lib/avo/hosts/view_record_host.rb +0 -7
  387. data/lib/avo/hosts/visibility_host.rb +0 -12
  388. data/lib/avo/items_holder.rb +0 -96
  389. data/lib/avo/main_panel.rb +0 -3
  390. data/lib/avo/menu/base_item.rb +0 -25
  391. data/lib/avo/menu/builder.rb +0 -82
  392. data/lib/avo/menu/dashboard.rb +0 -22
  393. data/lib/avo/menu/group.rb +0 -2
  394. data/lib/avo/menu/link.rb +0 -6
  395. data/lib/avo/menu/menu.rb +0 -2
  396. data/lib/avo/menu/resource.rb +0 -22
  397. data/lib/avo/menu/section.rb +0 -2
  398. data/lib/avo/panel.rb +0 -24
  399. data/lib/avo/panel_builder.rb +0 -25
  400. data/lib/avo/resources/controls/action.rb +0 -38
  401. data/lib/avo/resources/controls/execution_context.rb +0 -58
  402. data/lib/avo/resources/controls/items_holder.rb +0 -19
  403. data/lib/avo/resources/controls/link_to.rb +0 -27
  404. data/lib/avo/row.rb +0 -26
  405. data/lib/avo/row_builder.rb +0 -24
  406. data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
  407. data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
  408. data/lib/avo/sidebar.rb +0 -30
  409. data/lib/avo/sidebar_builder.rb +0 -24
  410. data/lib/avo/tab.rb +0 -72
  411. data/lib/avo/tab_builder.rb +0 -25
  412. data/lib/avo/tab_group.rb +0 -42
  413. data/lib/avo/tab_group_builder.rb +0 -43
  414. data/lib/avo/tools_manager.rb +0 -11
  415. data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
  416. data/public/avo-assets/avo.base.js +0 -1037
  417. data/public/avo-assets/avo.base.js.map +0 -7
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class CreateButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ if args[:item].present?
9
+ @label = I18n.t("avo.create_new_item", item: args[:item]) if label.nil?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,7 +5,11 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.delete").capitalize
8
+ @label = args[:label] || I18n.t("avo.delete").capitalize
9
+ if args[:item].present?
10
+ @title = I18n.t("avo.delete_item", item: args[:item]).capitalize if title.nil?
11
+ @confirmation_message = I18n.t("avo.are_you_sure") if confirmation_message.nil?
12
+ end
9
13
  end
10
14
  end
11
15
  end
@@ -5,7 +5,10 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.detach_item", item: title).humanize
8
+ if args[:item].present?
9
+ @title = I18n.t("avo.detach_item", item: args[:item]).capitalize if title.nil?
10
+ @confirmation_message = I18n.t("avo.are_you_sure_detach_item", item: args[:item]) if confirmation_message.nil?
11
+ end
9
12
  end
10
13
  end
11
14
  end
@@ -5,7 +5,10 @@ module Avo
5
5
  def initialize(**args)
6
6
  super(**args)
7
7
 
8
- @label = I18n.t("avo.edit").capitalize
8
+ @label = args[:label] || I18n.t("avo.edit").capitalize
9
+ if args[:item].present?
10
+ @title = I18n.t("avo.edit_item", item: args[:item]).capitalize if title.nil?
11
+ end
9
12
  end
10
13
  end
11
14
  end
@@ -0,0 +1,8 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class OrderControls < BaseControl
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class SaveButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ @label = args[:label] || I18n.t("avo.save").capitalize
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Avo
2
+ module Resources
3
+ module Controls
4
+ class ShowButton < BaseControl
5
+ def initialize(**args)
6
+ super(**args)
7
+
8
+ if args[:item].present?
9
+ @title = I18n.t("avo.view_item", item: args[:item]).capitalize if title.nil?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,76 @@
1
+ class Avo::Resources::Items::Holder
2
+ attr_reader :tools
3
+ attr_accessor :items
4
+ attr_accessor :invalid_fields
5
+
6
+ def initialize
7
+ @items = []
8
+ @items_index = 0
9
+ @invalid_fields = []
10
+ end
11
+
12
+ # Adds a field to the items_holder
13
+ def field(field_name, **args, &block)
14
+ field_parser = Avo::Dsl::FieldParser.new(id: field_name, order_index: @items_index, **args, &block).parse
15
+
16
+ if field_parser.invalid?
17
+ as = args.fetch(:as, nil)
18
+
19
+ # End execution ehre and add the field to the invalid_fileds payload so we know to wanr the developer about that.
20
+ # @todo: Make sure this warning is still active
21
+ return add_invalid_field({
22
+ name: field_name,
23
+ as: as,
24
+ # resource: resource_class.name,
25
+ message: "There's an invalid field configuration for this resource. <br/> <code class='px-1 py-px rounded bg-red-600'>field :#{field_name}, as: #{as}</code>"
26
+ })
27
+ end
28
+
29
+ add_item field_parser.instance
30
+ end
31
+
32
+ def tabs(instance)
33
+ add_item instance
34
+ end
35
+
36
+ def tab(name, **args, &block)
37
+ add_item Avo::Resources::Items::Tab::Builder.parse_block(name: name, **args, &block)
38
+ end
39
+
40
+ def tool(klass, **args)
41
+ instance = klass.new(**args)
42
+ add_item instance
43
+ end
44
+
45
+ def panel(panel_name = nil, **args, &block)
46
+ panel = Avo::Resources::Items::ItemGroup::Builder.parse_block(name: panel_name, **args, &block)
47
+
48
+ add_item panel
49
+ end
50
+
51
+ def heading(body = nil, **args, &block)
52
+ field = Avo::Fields::HeadingField.new(body, **args)
53
+
54
+ add_item field
55
+ end
56
+
57
+ def sidebar(instance)
58
+ add_item instance
59
+ end
60
+
61
+ def add_item(instance)
62
+ @items << instance
63
+
64
+ increment_order_index
65
+ end
66
+
67
+ private
68
+
69
+ def add_invalid_field(payload)
70
+ @invalid_fields << payload
71
+ end
72
+
73
+ def increment_order_index
74
+ @items_index += 1
75
+ end
76
+ end
@@ -0,0 +1,48 @@
1
+ class Avo::Resources::Items::ItemGroup
2
+ prepend Avo::Concerns::IsResourceItem
3
+
4
+ include Avo::Concerns::HasItems
5
+ include Avo::Concerns::HasItemType
6
+ include Avo::Concerns::IsVisible
7
+ include Avo::Concerns::VisibleInDifferentViews
8
+
9
+ attr_reader :name
10
+ attr_reader :description
11
+
12
+ delegate :items, :add_item, to: :items_holder
13
+
14
+ def initialize(name: nil, description: nil, view: nil, **args)
15
+ @name = name
16
+ @view = view
17
+ @description = description
18
+ @items_holder = Avo::Resources::Items::Holder.new
19
+ @args = args
20
+
21
+ post_initialize if respond_to?(:post_initialize)
22
+ end
23
+
24
+ class Builder
25
+ class << self
26
+ def parse_block(**args, &block)
27
+ Docile.dsl_eval(new(**args), &block).build
28
+ end
29
+ end
30
+
31
+ delegate :heading, to: :items_holder
32
+ delegate :field, to: :items_holder
33
+ delegate :items, to: :items_holder
34
+
35
+ attr_reader :items_holder
36
+
37
+ def initialize(name: nil, **args)
38
+ @panel = Avo::Resources::Items::Panel.new(name: name, **args)
39
+ @items_holder = Avo::Resources::Items::Holder.new
40
+ end
41
+
42
+ # Fetch the tab
43
+ def build
44
+ @panel.items_holder = @items_holder
45
+ @panel
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,2 @@
1
+ class Avo::Resources::Items::MainPanel < Avo::Resources::Items::Panel
2
+ end
@@ -0,0 +1,2 @@
1
+ class Avo::Resources::Items::Panel < Avo::Resources::Items::ItemGroup
2
+ end
@@ -0,0 +1,47 @@
1
+ class Avo::Resources::Items::Sidebar
2
+ prepend Avo::Concerns::IsResourceItem
3
+
4
+ include Avo::Concerns::HasItems
5
+ include Avo::Concerns::HasItemType
6
+ include Avo::Concerns::IsVisible
7
+ include Avo::Concerns::VisibleInDifferentViews
8
+
9
+ delegate :items, :add_item, to: :items_holder
10
+
11
+ attr_reader :name
12
+
13
+ def initialize(name: nil, view: nil, **args)
14
+ @name = name
15
+ @items_holder = Avo::Resources::Items::Holder.new
16
+ @view = view
17
+ @args = args
18
+
19
+ post_initialize if respond_to?(:post_initialize)
20
+ end
21
+
22
+ class Builder
23
+ class << self
24
+ def parse_block(**args, &block)
25
+ Docile.dsl_eval(new(**args), &block).build
26
+ end
27
+ end
28
+
29
+ attr_reader :items_holder
30
+
31
+ delegate :field, to: :items_holder
32
+ delegate :items, to: :items_holder
33
+ delegate :heading, to: :items_holder
34
+
35
+ def initialize(name: nil, **args)
36
+ @sidebar = Avo::Resources::Items::Sidebar.new(**args)
37
+ @items_holder = Avo::Resources::Items::Holder.new
38
+ end
39
+
40
+ # Fetch the sidebar
41
+ def build
42
+ @sidebar.items_holder = @items_holder
43
+ @sidebar
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,60 @@
1
+ class Avo::Resources::Items::Tab
2
+ prepend Avo::Concerns::IsResourceItem
3
+
4
+ include Avo::Concerns::HasItems
5
+ include Avo::Concerns::HasItemType
6
+ include Avo::Concerns::IsVisible
7
+ include Avo::Concerns::VisibleInDifferentViews
8
+
9
+ delegate :items, :add_item, to: :items_holder
10
+
11
+ attr_accessor :description
12
+
13
+ def initialize(name: nil, description: nil, view: nil, **args)
14
+ @name = name
15
+ @description = description
16
+ @items_holder = Avo::Resources::Items::Holder.new
17
+ @view = view
18
+ @args = args
19
+
20
+ post_initialize if respond_to?(:post_initialize)
21
+ end
22
+
23
+ def name
24
+ Avo::ExecutionContext.new(target: @name).handle
25
+ end
26
+
27
+ def turbo_frame_id(parent: nil)
28
+ id = "#{Avo::Resources::Items::Tab.to_s.parameterize} #{name}".parameterize
29
+
30
+ return id if parent.nil?
31
+
32
+ "#{parent.turbo_frame_id} #{id}".parameterize
33
+ end
34
+
35
+ class Builder
36
+ class << self
37
+ def parse_block(**args, &block)
38
+ Docile.dsl_eval(new(**args), &block).build
39
+ end
40
+ end
41
+
42
+ attr_reader :items_holder
43
+
44
+ delegate :field, to: :items_holder
45
+ delegate :tool, to: :items_holder
46
+ delegate :panel, to: :items_holder
47
+ delegate :items, to: :items_holder
48
+
49
+ def initialize(name: nil, **args)
50
+ @tab = Avo::Resources::Items::Tab.new(name: name, **args)
51
+ @items_holder = Avo::Resources::Items::Holder.new
52
+ end
53
+
54
+ # Fetch the tab
55
+ def build
56
+ @tab.items_holder = @items_holder
57
+ @tab
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,68 @@
1
+ class Avo::Resources::Items::TabGroup
2
+ prepend Avo::Concerns::IsResourceItem
3
+
4
+ include Avo::Concerns::HasItems
5
+ include Avo::Concerns::HasItemType
6
+ include Avo::Concerns::IsVisible
7
+ include Avo::Concerns::VisibleInDifferentViews
8
+
9
+ attr_accessor :index
10
+ attr_accessor :style
11
+
12
+ def initialize(index: 0, view: nil, style: nil, **args)
13
+ @index = index
14
+ @items_holder = Avo::Resources::Items::Holder.new
15
+ @view = view
16
+ @style = style
17
+ @args = args
18
+
19
+ post_initialize if respond_to?(:post_initialize)
20
+ end
21
+
22
+ def turbo_frame_id
23
+ "#{Avo::Resources::Items::TabGroup.to_s.parameterize} #{index}".parameterize
24
+ end
25
+
26
+ class Builder
27
+ class << self
28
+ def parse_block(**args, &block)
29
+ Docile.dsl_eval(new(**args), &block).build
30
+ end
31
+ end
32
+
33
+ attr_reader :items_holder
34
+
35
+ delegate :tab, to: :items_holder
36
+
37
+ def initialize(style: nil)
38
+ @group = Avo::Resources::Items::TabGroup.new(style: style)
39
+ @items_holder = Avo::Resources::Items::Holder.new
40
+ end
41
+
42
+ def field(field_name, **args, &block)
43
+ parsed = Avo::Dsl::FieldParser.new(id: field_name, order_index: @items_index, **args, &block).parse
44
+ field_instance = parsed.instance
45
+
46
+ name = field_instance.name
47
+ tab = Avo::Resources::Items::Tab.new name: name
48
+
49
+ if field_instance.has_own_panel?
50
+ tab.items_holder.add_item parsed.instance
51
+ else
52
+ # If the field is not in a panel, create one and add it
53
+ panel = Avo::Resources::Items::Panel.new name: name
54
+ panel.items_holder.add_item parsed.instance
55
+ # Add that panel to the items_holder
56
+ tab.items_holder.add_item panel
57
+ end
58
+
59
+ @items_holder.tabs tab
60
+ end
61
+
62
+ # Fetch the tab
63
+ def build
64
+ @group.items_holder = @items_holder
65
+ @group
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,181 @@
1
+ module Avo
2
+ module Resources
3
+ class ResourceManager
4
+ attr_accessor :resources
5
+
6
+ alias_method :all, :resources
7
+
8
+ class << self
9
+ def build
10
+ instance = new
11
+ instance.init_resources
12
+ instance.check_bad_resources
13
+ instance
14
+ end
15
+
16
+ # Fetches the resources available to the application.
17
+ # We have two ways of doing that.
18
+ #
19
+ # 1. Through eager loading.
20
+ # We automatically eager load the resources directory and fetch the descendants from the scanned files.
21
+ # This is the simple way to get started.
22
+ #
23
+ # 2. Manually, declared by the user.
24
+ # We have this option to load the resources because when they are loaded automatically through eager loading,
25
+ # those Resource classes and their methods may trigger loading other classes. And that may disrupt Rails booting process.
26
+ # Ex: AdminResource may use self.model_class = User. That will trigger Ruby to load the User class and itself load
27
+ # other classes in a chain reaction.
28
+ # The scenario that comes up most often is when Rails boots, the routes are being computed which eager loads the resource files.
29
+ # At that boot time some migration might have not been run yet, but Rails tries to access them through model associations,
30
+ # and they are not available.
31
+ #
32
+ # To enable this feature add a `resources` array config in your Avo initializer.
33
+ # config.resources = [
34
+ # "UserResource",
35
+ # "FishResource",
36
+ # ]
37
+ def fetch_resources
38
+ resources = if Avo.configuration.resources.nil?
39
+ BaseResource.descendants
40
+ else
41
+ Avo.configuration.resources
42
+ end
43
+
44
+ resources.map do |resource|
45
+ if resource.is_a?(Class)
46
+ resource
47
+ else
48
+ resource.to_s.safe_constantize
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def initialize
55
+ @resources = []
56
+ end
57
+
58
+ def init_resources
59
+ self.resources = self.class.fetch_resources
60
+ .reject do |resource|
61
+ # Remove the BaseResource. We only need the descendants
62
+ resource == Avo::BaseResource
63
+ end
64
+ .uniq do |klass|
65
+ # On invalid resource configuration the resource classes get duplicated in `ObjectSpace`
66
+ # We need to de-duplicate them
67
+ klass.name
68
+ end
69
+ .map do |resource|
70
+ resource.new if resource.is_a? Class
71
+ end
72
+ end
73
+
74
+ def check_bad_resources
75
+ resources.each do |resource|
76
+ has_model = resource.model_class.present?
77
+
78
+ unless has_model
79
+ possible_model = resource.class.to_s.gsub "Avo::Resources::", ""
80
+ possible_model = possible_model.gsub "Resource", ""
81
+
82
+ Avo::App.errors.add({
83
+ url: "https://docs.avohq.io/2.0/resources.html#custom-model-class",
84
+ target: "_blank",
85
+ message: "#{resource.class} does not have a valid model assigned. It failed to find the #{possible_model} model. \n\r Please create that model or assign one using self.model_class = YOUR_MODEL"
86
+ })
87
+ end
88
+ end
89
+ end
90
+
91
+ # Filters out the resources that are missing the model_class
92
+ def valid_resources
93
+ resources
94
+ .select do |resource|
95
+ resource.model_class.present?
96
+ end
97
+ .sort_by(&:to_s)
98
+ end
99
+
100
+ # Returns the Avo resource by camelized name
101
+ #
102
+ # get_resource_by_name('User') => Avo::Resources::User
103
+ def get_resource(resource)
104
+ resource = "Avo::Resources::#{resource}" unless resource.to_s.starts_with?("Avo::Resources::")
105
+
106
+ resources.find do |available_resource|
107
+ resource.to_s == available_resource.class.to_s
108
+ end
109
+ end
110
+
111
+ # Returns the Avo resource by singular snake_cased name
112
+ #
113
+ # get_resource_by_name('user') => Avo::Resources::User
114
+ def get_resource_by_name(name)
115
+ get_resource name.singularize.camelize
116
+ end
117
+
118
+ # Returns the Avo resource by singular snake_cased name
119
+ # From all the resources that use the same model_class, it will fetch the first one in alphabetical order
120
+ #
121
+ # get_resource_by_name('User') => Avo::Resources::User
122
+ # get_resource_by_name(User) => Avo::Resources::User
123
+
124
+ def get_resource_by_model_class(klass)
125
+ # Fetch the mappings imposed by the user.
126
+ # If they are present, use those ones.
127
+ mapping = get_mapping_for_model klass
128
+ return get_resource(mapping) if mapping.present?
129
+
130
+ valid_resources
131
+ .find do |resource|
132
+ resource.model_class.model_name.name == klass.to_s
133
+ end
134
+ end
135
+
136
+ # Returns the Avo resource by singular snake_cased name
137
+ #
138
+ # get_resource_by_controller_name('delayed_backend_active_record_jobs') => DelayedJobResource
139
+ # get_resource_by_controller_name('users') => Avo::Resources::User
140
+ def get_resource_by_controller_name(name)
141
+ valid_resources
142
+ .find do |resource|
143
+ resource.model_class.to_s.pluralize.underscore.tr("/", "_") == name.to_s
144
+ end
145
+ end
146
+
147
+ # Returns the Avo resource by some name
148
+ def guess_resource(name)
149
+ get_resource_by_name(name.to_s) || get_resource_by_model_class(name)
150
+ end
151
+
152
+ # Returns the Rails model class by singular snake_cased name
153
+ #
154
+ # get_model_class_by_name('user') => User
155
+ def get_model_class_by_name(name)
156
+ name.to_s.camelize.singularize
157
+ end
158
+
159
+ def get_available_resources(user = nil)
160
+ valid_resources
161
+ .select do |resource|
162
+ Services::AuthorizationService.authorize user, resource.model_class, Avo.configuration.authorization_methods.stringify_keys["index"], raise_exception: false
163
+ end
164
+ .sort_by { |r| r.name }
165
+ end
166
+
167
+ def resources_for_navigation(user = nil)
168
+ get_available_resources(user)
169
+ .select do |resource|
170
+ resource.visible_on_sidebar
171
+ end
172
+ end
173
+
174
+ private
175
+
176
+ def get_mapping_for_model(klass)
177
+ (Avo.configuration.model_resource_mapping || {}).stringify_keys.transform_values(&:to_s)[klass.to_s]
178
+ end
179
+ end
180
+ end
181
+ end