avo 2.46.0 → 3.0.0.pre2

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
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::TagsField::IndexComponent < Avo::Fields::IndexComponent
4
- include Avo::Fields::Concerns::ItemLabels
5
-
6
- def value
7
- @field.field_value
8
- end
9
- end
@@ -1,7 +0,0 @@
1
- <%= field_wrapper **field_wrapper_args do %>
2
- <div class="flex gap-1 items-center flex-wrap">
3
- <% @field.field_value.each do |item| %>
4
- <%= render Avo::Fields::TagsField::TagComponent.new(label: label_from_item(item)) %>
5
- <% end %>
6
- </div>
7
- <% end %>
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::TagsField::ShowComponent < Avo::Fields::ShowComponent
4
- include Avo::Fields::Concerns::ItemLabels
5
- end
@@ -1,9 +0,0 @@
1
- <div class="flex px-2 py-1 rounded bg-gray-100 text-sm text-gray-800 font-normal flex-shrink-0"
2
- <% if title.present? %>
3
- data-tippy="tooltip"
4
- title="<%= title %>"
5
- <% end %>
6
- data-target="tag-component"
7
- >
8
- <%= label %>
9
- </div>
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Fields::TagsField::TagComponent < ViewComponent::Base
4
- attr_reader :label
5
- attr_reader :title
6
-
7
- def initialize(label: nil, title: nil)
8
- @label = label
9
- @title = title
10
- end
11
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Index::Ordering::BaseComponent < Avo::BaseComponent
4
- private
5
-
6
- def order_actions
7
- @resource.class.order_actions
8
- end
9
- end
@@ -1,11 +0,0 @@
1
- <%= button_to order_path(direction: direction, referrer: request.fullpath),
2
- title: t("avo.order.#{direction}").capitalize,
3
- method: :patch,
4
- class: 'flex items-center',
5
- data: {
6
- target: "order:#{direction}",
7
- 'turbo-frame': params[:turbo_frame],
8
- 'tippy': 'tooltip',
9
- } do %>
10
- <%= helpers.svg(svg, class: 'text-gray-400 h-6 hover:text-gray-600') %>
11
- <% end %>
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Index::Ordering::ButtonComponent < Avo::Index::Ordering::BaseComponent
4
- attr_accessor :resource
5
- attr_accessor :reflection
6
- attr_accessor :direction
7
- attr_accessor :svg
8
-
9
- def initialize(resource:, direction:, svg: nil, reflection: nil)
10
- @resource = resource
11
- @reflection = reflection
12
- @direction = direction
13
- @svg = svg
14
- end
15
-
16
- def render?
17
- order_actions[direction].present?
18
- end
19
-
20
- def order_path(args)
21
- Avo::App.view_context.avo.reorder_order_path(resource.route_key, resource.model.to_param, **args)
22
- end
23
- end
@@ -1,32 +0,0 @@
1
- <div class="flex items-center justify-center" data-component="<%= self.class.to_s.underscore %>">
2
- <% if display_inline? %>
3
- <div class="flex max-w-xs rounded">
4
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :higher, svg: 'arrow-up' %>
5
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :lower, svg: 'arrow-down' %>
6
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :to_top, svg: 'download-solid-reversed' %>
7
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :to_bottom, svg: 'download-solid' %>
8
- </div>
9
- <% else %>
10
- <div class="popover inline-block"
11
- data-controller="popover"
12
- data-popover-translate-x="<%= Avo.configuration.resource_controls_placement == :left ? '20%' : '-100%' %>"
13
- data-popover-translate-y="-32px"
14
- data-action="mouseover->popover#mouseOver mouseout->popover#mouseOut"
15
- >
16
- <%= button_tag nil,
17
- title: t('avo.order.reorder_record').capitalize,
18
- class: 'flex items-center',
19
- data: {
20
- 'tippy': 'tooltip',
21
- } do
22
- %>
23
- <%= helpers.svg('switch-vertical', class: 'text-gray-400 h-6 hover:text-gray-600') %>
24
- <% end %>
25
- <div class="flex hidden absolute max-w-xs bg-white rounded p-2" data-popover-target="content">
26
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :higher, svg: 'arrow-up' %>
27
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :lower, svg: 'arrow-down' %>
28
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :to_top, svg: 'download-solid-reversed' %>
29
- <%= render Avo::Index::Ordering::ButtonComponent.new resource: @resource, reflection: @reflection, direction: :to_bottom, svg: 'download-solid' %>
30
- </div>
31
- <% end %>
32
- </div>
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Index::Ordering::ButtonsComponent < Avo::Index::Ordering::BaseComponent
4
- def initialize(resource: nil, reflection: nil, view_type: nil)
5
- @resource = resource
6
- @reflection = reflection
7
- @view_type = view_type
8
- end
9
-
10
- def render?
11
- has_with_trial(:resource_ordering) && can_order_any? && view_type_is_table? && enabled_in_view?
12
- end
13
-
14
- private
15
-
16
- def can_order_any?
17
- order_actions.present?
18
- end
19
-
20
- def view_type_is_table?
21
- @view_type.to_sym == :table
22
- end
23
-
24
- def display_inline?
25
- ordering[:display_inline]
26
- end
27
-
28
- def enabled_in_view?
29
- in_association = @reflection.present?
30
-
31
- if in_association
32
- visible_on_option.include? :association
33
- else
34
- visible_on_option.include? :index
35
- end
36
- end
37
-
38
- def visible_on_option
39
- return [] if ordering.nil?
40
-
41
- [ordering[:visible_on]].flatten
42
- end
43
-
44
- def ordering
45
- @resource.class.ordering
46
- end
47
- end
@@ -1,16 +0,0 @@
1
- <% if @resources.present? %>
2
- <div class="map-view-container grid <%= grid_layout_classes %>">
3
- <div class="map-component min-h-full <%= map_component_order_class %>">
4
- <%= js_map(resource_location_markers, **resource_mapkick_options) %>
5
- </div>
6
- <% if render_table? %>
7
- <div class="overflow-auto <%= table_component_order_class %>">
8
- <%= render(Avo::Index::ResourceTableComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_model: @parent_model, parent_resource: @parent_resource, pagy: @pagy, query: @query)) %>
9
- </div>
10
- <% end %>
11
- </div>
12
- <% else %>
13
- <div class="bg-white rounded shadow-panel">
14
- <%= helpers.empty_state by_association: params[:related_name].present?, view_type: :map %>
15
- </div>
16
- <% end %>
@@ -1,109 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Avo
4
- module Index
5
- # Render a map view for a list of resources, where each resource is
6
- # expected to have an attribute/attribute set representing its location.
7
- class ResourceMapComponent < ViewComponent::Base
8
- attr_reader :resources
9
-
10
- def initialize(resources: nil, resource: nil, reflection: nil, parent_model: nil, parent_resource: nil, pagy: nil, query: nil)
11
- super
12
- @resources = resources
13
- @resource = resource
14
- @reflection = reflection
15
- @parent_model = parent_model
16
- @parent_resource = parent_resource
17
- @pagy = pagy
18
- @query = query
19
- end
20
-
21
- def grid_layout_classes
22
- return unless render_table?
23
-
24
- if table_positioned_horizontally
25
- "grid-flow-row sm:grid-flow-col grid-rows-1 auto-cols-fr"
26
- elsif table_positioned_vertically
27
- "grid-flow-row grid-cols-1"
28
- end
29
- end
30
-
31
- def table_positioned_horizontally
32
- %i[left right].include?(map_view_table_layout)
33
- end
34
-
35
- def table_positioned_vertically
36
- %i[bottom top].include?(map_view_table_layout)
37
- end
38
-
39
- def map_component_order_class
40
- if render_table? && table_positioned_at_the_start
41
- "order-last"
42
- else
43
- "order-first"
44
- end
45
- end
46
-
47
- def table_component_order_class
48
- if table_positioned_at_the_start
49
- "order-first"
50
- else
51
- "order-last"
52
- end
53
- end
54
-
55
- def table_positioned_at_the_start
56
- %i[left top].include?(map_view_table_layout)
57
- end
58
-
59
- def map_view_table_layout
60
- map_options.dig(:table, :layout)
61
- end
62
-
63
- def resource_location_markers
64
- # If we have no proc and no default location method, don't try to create markers
65
- return [] unless resource_mappable?
66
-
67
- resources
68
- .map do |resource|
69
- Avo::Hosts::ResourceRecordHost.new(block: marker_proc, resource: resource, record: resource.record).handle
70
- end
71
- .compact
72
- .filter do |coordinates|
73
- coordinates[:latitude].present? && coordinates[:longitude].present?
74
- end
75
- end
76
-
77
- def resource_mapkick_options
78
- map_options[:mapkick_options] || {}
79
- end
80
-
81
- def render_table?
82
- map_options.dig(:table, :visible)
83
- end
84
-
85
- private
86
-
87
- def default_record_marker_proc
88
- lambda {
89
- {
90
- latitude: record.coordinates.first,
91
- longitude: record.coordinates.last
92
- }
93
- }
94
- end
95
-
96
- def map_options
97
- @resource.map_view || {}
98
- end
99
-
100
- def marker_proc
101
- map_options[:record_marker] || default_record_marker_proc
102
- end
103
-
104
- def resource_mappable?
105
- map_options[:record_marker].present? || @resources.first.record.respond_to?(:coordinates)
106
- end
107
- end
108
- end
109
- end
@@ -1,3 +0,0 @@
1
- <div class="flex flex-col sm:flex-row min-h-14 grow shrink-0" data-component="<%= self.class %>">
2
- <%= body %>
3
- </div>
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::RowComponent < ViewComponent::Base
4
- attr_reader :classes
5
-
6
- renders_one :body
7
-
8
- def initialize(classes: nil, data: {})
9
- @classes = classes
10
- @data = data
11
- end
12
- end
@@ -1,16 +0,0 @@
1
- <% if item.is_a? Avo::Menu::Link %>
2
- <%= render Avo::Sidebar::LinkComponent.new label: item.name, path: item.path, target: item.target, data: item.data, icon: item.icon %>
3
- <% end %>
4
- <% if item.is_a? Avo::Menu::Resource %>
5
- <%= render Avo::Sidebar::LinkComponent.new label: item.navigation_label, path: helpers.resources_path(resource: resource, **item.fetch_params), data: item.data, icon: item.icon %>
6
- <% end %>
7
- <% if item.is_a? Avo::Menu::Dashboard %>
8
- <%= render Avo::Sidebar::LinkComponent.new label: item.navigation_label, path: dashboard.navigation_path, data: item.data, icon: item.icon %>
9
- <% end %>
10
- <% if item.is_a? Avo::Menu::Section %>
11
- <%= render Avo::Sidebar::SectionComponent.new item: item %>
12
- <% end %>
13
- <% if item.is_a? Avo::Menu::Group %>
14
- <%= render Avo::Sidebar::GroupComponent.new item: item %>
15
- <% end %>
16
-
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Avo::Sidebar::ItemSwitcherComponent < Avo::Sidebar::BaseItemComponent
4
- def resource
5
- item.parsed_resource
6
- end
7
-
8
- def dashboard
9
- item.parsed_dashboard
10
- end
11
-
12
- def render?
13
- item.visible?
14
- end
15
- end
@@ -1,37 +0,0 @@
1
- require_dependency "avo/application_controller"
2
-
3
- module Avo
4
- module Dashboards
5
- class CardsController < ApplicationController
6
- before_action :set_dashboard
7
- before_action :set_card
8
- before_action :detect_chartkick
9
-
10
- def show
11
- render(:chartkick_missing) unless @chartkick_installed
12
- end
13
-
14
- private
15
-
16
- def set_dashboard
17
- @dashboard = Avo::App.get_dashboard_by_id params[:dashboard_id]
18
-
19
- raise ActionController::RoutingError.new("Not Found") if @dashboard.nil? || @dashboard.is_hidden?
20
- end
21
-
22
- def set_card
23
- @card = @dashboard.item_at_index(params[:index].to_i).tap do |card|
24
- card.hydrate(dashboard: @dashboard)
25
- end
26
- end
27
-
28
- def detect_chartkick
29
- @chartkick_installed = if @card.class.ancestors.map(&:to_s).include?("Avo::Dashboards::ChartkickCard")
30
- defined?(Chartkick)
31
- else
32
- true
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,22 +0,0 @@
1
- require_dependency "avo/application_controller"
2
-
3
- module Avo
4
- class DashboardsController < ApplicationController
5
- before_action :set_dashboard, only: :show
6
-
7
- def show
8
- @page_title = @dashboard.name
9
- end
10
-
11
- private
12
-
13
- def set_dashboard
14
- @dashboard = Avo::App.get_dashboard_by_id params[:id]
15
-
16
- authorized = Avo::Hosts::BaseHost.new(block: @dashboard.authorize).handle
17
- raise Avo::NotAuthorizedError.new if !authorized
18
-
19
- raise ActionController::RoutingError.new("Not Found") if @dashboard.nil? || @dashboard.is_hidden?
20
- end
21
- end
22
- end
@@ -1,25 +0,0 @@
1
- require_dependency "avo/application_controller"
2
-
3
- module Avo
4
- class ReorderController < ApplicationController
5
- before_action :set_resource_name
6
- before_action :set_resource
7
- before_action :hydrate_resource
8
- before_action :set_model
9
-
10
- def order
11
- direction = params[:direction].to_sym
12
-
13
- if direction.present?
14
- @resource
15
- .hydrate(model: @model, params: params)
16
- .ordering_host
17
- .order direction
18
- end
19
-
20
- respond_to do |format|
21
- format.html { redirect_to params[:referrer] || resources_path(resource: @resource) }
22
- end
23
- end
24
- end
25
- end
@@ -1,22 +0,0 @@
1
- import { Controller } from '@hotwired/stimulus'
2
-
3
- export default class extends Controller {
4
- /**
5
- * Helper that parses the data attribute value to JSON
6
- */
7
- getJsonAttribute(target, attribute, defaultValue = []) {
8
- let result = defaultValue
9
- try {
10
- result = JSON.parse(target.getAttribute(attribute))
11
- } catch (error) {}
12
-
13
- return result
14
- }
15
-
16
- /**
17
- * Parses the attribute to boolean
18
- */
19
- getBooleanAttribute(target, attribute) {
20
- return target.getAttribute(attribute) === '1'
21
- }
22
- }
@@ -1,51 +0,0 @@
1
- import { Controller } from '@hotwired/stimulus'
2
-
3
- // Used as a custom Stream Action <turbo-stream action="update-belongs-to" />
4
- export default class extends Controller {
5
- static values = {
6
- polymorphic: Boolean,
7
- searchable: Boolean,
8
- targetName: String,
9
- relationName: String
10
- }
11
-
12
- beforeStreamRender(event) {
13
- const { relationName } = event.target.dataset
14
- if (event.target.action !== "update-belongs-to" || this.relationNameValue !== relationName) {
15
- return false;
16
- }
17
-
18
- event.detail.render = (stream) => {
19
- if (this.searchableValue) {
20
- this.updateSearchable(stream)
21
- } else{
22
- this.updateNonSearchable(stream)
23
- }
24
- };
25
- }
26
-
27
- updateSearchable(stream) {
28
- // Update the id component
29
- document.querySelector(`input[name="${this.targetNameValue}"][type="hidden"]`).value = stream.dataset.targetResourceId
30
- // Update the label
31
- document.querySelector(`input[name="${this.targetNameValue}"][type="text"]`).value = stream.dataset.targetResourceLabel
32
- }
33
-
34
- updateNonSearchable(stream) {
35
- const select = this.selectorContext(stream).querySelector(`select[name="${this.targetNameValue}"]`)
36
- const option = document.createElement('option')
37
- option.value = stream.dataset.targetResourceId
38
- option.text = stream.dataset.targetResourceLabel
39
- option.selected = true
40
- select.appendChild(option)
41
- }
42
-
43
- selectorContext(stream) {
44
- // if polymorphic, search for the select in the correct sub-container
45
- if (this.polymorphicValue) {
46
- return document.querySelector(`[data-type="${stream.dataset.targetResourceClass}"]`)
47
- }
48
-
49
- return document
50
- }
51
- }
@@ -1,127 +0,0 @@
1
- import { first, isObject, merge } from 'lodash'
2
- import Tagify from '@yaireo/tagify'
3
- import URI from 'urijs'
4
-
5
- import { suggestionItemTemplate, tagTemplate } from './tags_field_helpers'
6
- import BaseController from '../base_controller'
7
- import debouncePromise from '../../helpers/debounce_promise'
8
-
9
- export default class extends BaseController {
10
- static targets = ['input', 'fakeInput'];
11
-
12
- static values = {
13
- whitelistItems: { type: Array, default: [] },
14
- disallowedItems: { type: Array, default: [] },
15
- enforceSuggestions: { type: Boolean, default: false },
16
- closeOnSelect: { type: Boolean, default: false },
17
- delimiters: { type: Array, default: [] },
18
- suggestionsMaxItems: { type: Number, default: 20 },
19
- mode: String,
20
- fetchValuesFrom: String,
21
- }
22
-
23
- tagify = null;
24
-
25
- searchDebounce = 500
26
-
27
- debouncedFetch = debouncePromise(fetch, this.searchDebounce);
28
-
29
- get suggestionsAreObjects() {
30
- return isObject(first(this.whitelistItemsValue)) || this.fetchValuesFromValue
31
- }
32
-
33
- get tagifyOptions() {
34
- let options = {
35
- whitelist: this.whitelistItemsValue,
36
- blacklist: this.disallowedItemsValue,
37
- enforceWhitelist: this.enforceSuggestionsValue || this.fetchValuesFromValue,
38
- delimiters: this.delimitersValue.join('|'),
39
- dropdown: {
40
- maxItems: this.suggestionsMaxItemsValue,
41
- enabled: 0,
42
- searchKeys: [this.labelAttributeValue],
43
- closeOnSelect: this.closeOnSelectValue,
44
- },
45
- }
46
-
47
- if (this.modeValue) {
48
- options.mode = this.modeValue // null or "select"
49
- }
50
-
51
- if (this.suggestionsAreObjects) {
52
- options = merge(options, {
53
- tagTextProp: 'label',
54
- dropdown: {
55
- searchKeys: ['label'],
56
- mapValueTo: 'value',
57
- },
58
- templates: {
59
- tag: tagTemplate,
60
- dropdownItem: suggestionItemTemplate,
61
- },
62
- originalInputValueFormat: (valuesArr) => valuesArr.map((item) => item.value),
63
- })
64
- } else {
65
- options = merge(options, {
66
- originalInputValueFormat: (valuesArr) => valuesArr.map((item) => item.value).join(','),
67
- })
68
- }
69
-
70
- return options
71
- }
72
-
73
- connect() {
74
- if (this.hasInputTarget) {
75
- this.hideFakeInput()
76
- this.showRealInput()
77
- this.initTagify()
78
- }
79
- }
80
-
81
- initTagify() {
82
- this.tagify = new Tagify(this.inputTarget, this.tagifyOptions)
83
- const that = this
84
-
85
- function onInput(e) {
86
- // Create the URL from which to fetch the values
87
- const query = e.detail.value
88
- const uri = new URI(that.fetchValuesFromValue)
89
- uri.addSearch({
90
- q: query,
91
- })
92
-
93
- // reset current whitelist
94
- that.tagify.whitelist = null
95
- // show the loader animation
96
- that.tagify.loading(true)
97
-
98
- // get new whitelist from a request
99
- that.fetchResults(uri.toString())
100
- .then((result) => {
101
- that.tagify.settings.whitelist = result // add already-existing tags to the new whitelist array
102
-
103
- that.tagify
104
- .loading(false)
105
- .dropdown.show(e.detail.value) // render the suggestions dropdown.
106
- })
107
- .catch(() => that.tagify.dropdown.hide())
108
- }
109
-
110
- if (this.fetchValuesFromValue) {
111
- this.tagify.on('input', onInput)
112
- }
113
- }
114
-
115
- fetchResults(endpoint) {
116
- return this.debouncedFetch(endpoint)
117
- .then((response) => response.json())
118
- }
119
-
120
- hideFakeInput() {
121
- this.fakeInputTarget.classList.add('hidden')
122
- }
123
-
124
- showRealInput() {
125
- this.inputTarget.classList.remove('hidden')
126
- }
127
- }
@@ -1,18 +0,0 @@
1
- import { Controller } from '@hotwired/stimulus'
2
- import { useClickOutside } from 'stimulus-use'
3
-
4
- export default class extends Controller {
5
- static targets = ['panel']
6
-
7
- connect() {
8
- useClickOutside(this)
9
- }
10
-
11
- clickOutside() {
12
- this.panelTarget.classList.add('hidden')
13
- }
14
-
15
- togglePanel() {
16
- this.panelTarget.classList.toggle('hidden')
17
- }
18
- }
@@ -1,12 +0,0 @@
1
- <%= turbo_frame_tag "new_via_belongs_to" do %>
2
- <%= render(Avo::ModalComponent.new(width: :xl, body_class: "bg-application")) do |c| %>
3
- <div class="pt-4 pb-8">
4
- <%= render Avo::Views::ResourceEditComponent.new(
5
- resource: @resource,
6
- model: @model,
7
- view: @view,
8
- display_breadcrumbs: false
9
- ) %>
10
- </div>
11
- <% end %>
12
- <% end %>