decidim-core 0.29.6 → 0.30.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity/show.erb +6 -6
  3. data/app/cells/decidim/address/show.erb +3 -3
  4. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  5. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  6. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  7. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  8. data/app/cells/decidim/author/flag.erb +6 -0
  9. data/app/cells/decidim/author/flag_user.erb +14 -0
  10. data/app/cells/decidim/author/show.erb +2 -6
  11. data/app/cells/decidim/author_cell.rb +1 -11
  12. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  13. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  14. data/app/cells/decidim/comments_button_cell.rb +14 -2
  15. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  16. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  17. data/app/cells/decidim/content_blocks/participatory_space_extra_data/extra_data.erb +2 -2
  18. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +2 -11
  19. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  20. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  21. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  22. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  23. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  24. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  25. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  26. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  27. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  28. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  29. data/app/cells/decidim/flag_modal/flag_user.erb +34 -0
  30. data/app/cells/decidim/flag_modal/show.erb +52 -0
  31. data/app/cells/decidim/flag_modal_cell.rb +56 -0
  32. data/app/cells/decidim/follow_button/show.erb +1 -2
  33. data/app/cells/decidim/follow_button_cell.rb +5 -0
  34. data/app/cells/decidim/footer_topics/show.erb +2 -2
  35. data/app/cells/decidim/group_admins/show.erb +1 -3
  36. data/app/cells/decidim/group_members/show.erb +2 -6
  37. data/app/cells/decidim/images_panel/show.erb +2 -5
  38. data/app/cells/decidim/map/show.erb +3 -0
  39. data/app/cells/decidim/map/template.erb +14 -0
  40. data/app/cells/decidim/map_cell.rb +39 -0
  41. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  42. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  43. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  44. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +4 -4
  45. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +3 -5
  46. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  47. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  48. data/app/cells/decidim/profile/avatar.erb +2 -0
  49. data/app/cells/decidim/profile/badge.erb +3 -3
  50. data/app/cells/decidim/profile/details.erb +1 -2
  51. data/app/cells/decidim/profile_actions/show.erb +1 -1
  52. data/app/cells/decidim/profile_sidebar/show.erb +167 -0
  53. data/app/cells/decidim/profile_sidebar_cell.rb +68 -0
  54. data/app/cells/decidim/progress_bar/show.erb +2 -2
  55. data/app/cells/decidim/report_button/already_reported_modal.erb +2 -2
  56. data/app/cells/decidim/report_button/flag_modal.erb +36 -24
  57. data/app/cells/decidim/report_button_cell.rb +9 -2
  58. data/app/cells/decidim/resource_history/show.erb +20 -0
  59. data/app/cells/decidim/resource_history_cell.rb +66 -0
  60. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  61. data/app/cells/decidim/resource_types_filter_cell.rb +6 -6
  62. data/app/cells/decidim/share_button_cell.rb +0 -4
  63. data/app/cells/decidim/share_widget/modal.erb +26 -0
  64. data/app/cells/decidim/share_widget/show.erb +2 -0
  65. data/app/cells/decidim/share_widget_cell.rb +20 -0
  66. data/app/cells/decidim/tags/show.erb +7 -4
  67. data/app/cells/decidim/tags_cell.rb +11 -72
  68. data/app/cells/decidim/upload_modal/files.erb +4 -4
  69. data/app/cells/decidim/upload_modal_cell.rb +3 -5
  70. data/app/cells/decidim/user_activity/show.erb +1 -1
  71. data/app/cells/decidim/user_activity_cell.rb +1 -6
  72. data/app/commands/decidim/amendable/accept.rb +1 -2
  73. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  74. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  75. data/app/commands/decidim/create_omniauth_registration.rb +21 -17
  76. data/app/commands/decidim/create_report.rb +8 -11
  77. data/app/commands/decidim/create_user_group.rb +6 -2
  78. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  79. data/app/commands/decidim/invite_user.rb +1 -1
  80. data/app/commands/decidim/search.rb +0 -14
  81. data/app/commands/decidim/update_account.rb +11 -3
  82. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  83. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  84. data/app/commands/decidim/update_user_group.rb +7 -1
  85. data/app/constraints/decidim/current_component.rb +1 -1
  86. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  87. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  88. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  89. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  90. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  91. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  92. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  93. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  94. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  95. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  96. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  97. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  98. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -4
  99. data/app/controllers/decidim/amendments_controller.rb +3 -3
  100. data/app/controllers/decidim/application_controller.rb +9 -0
  101. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  102. data/app/controllers/decidim/components/base_controller.rb +3 -7
  103. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  104. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  105. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  106. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  107. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  108. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  109. data/app/controllers/decidim/follows_controller.rb +1 -1
  110. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  111. data/app/controllers/decidim/homepage_controller.rb +0 -1
  112. data/app/controllers/decidim/open_data_controller.rb +33 -8
  113. data/app/controllers/decidim/profiles_controller.rb +2 -2
  114. data/app/controllers/decidim/reports_controller.rb +2 -7
  115. data/app/controllers/decidim/user_activities_controller.rb +1 -1
  116. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  117. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  118. data/app/forms/decidim/account_form.rb +2 -5
  119. data/app/forms/decidim/amendable/form.rb +4 -2
  120. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  121. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  122. data/app/forms/decidim/omniauth_registration_form.rb +15 -2
  123. data/app/forms/decidim/registration_form.rb +1 -1
  124. data/app/forms/decidim/user_group_form.rb +0 -2
  125. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  126. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  127. data/app/helpers/decidim/amendments_helper.rb +1 -11
  128. data/app/helpers/decidim/application_helper.rb +6 -2
  129. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  130. data/app/helpers/decidim/cache_helper.rb +1 -1
  131. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  132. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  133. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  134. data/app/helpers/decidim/filters_helper.rb +0 -25
  135. data/app/helpers/decidim/layout_helper.rb +6 -6
  136. data/app/helpers/decidim/map_helper.rb +1 -1
  137. data/app/helpers/decidim/menu_helper.rb +2 -2
  138. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  139. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  140. data/app/helpers/decidim/modal_helper.rb +23 -0
  141. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  142. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  143. data/app/helpers/decidim/orders_helper.rb +1 -2
  144. data/app/helpers/decidim/paginate_helper.rb +1 -1
  145. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  146. data/app/helpers/decidim/passwords_helper.rb +2 -2
  147. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  148. data/app/helpers/decidim/tooltip_helper.rb +1 -4
  149. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  150. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  151. data/app/jobs/decidim/export_job.rb +5 -1
  152. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  153. data/app/jobs/decidim/open_data_job.rb +4 -4
  154. data/app/mailers/decidim/export_mailer.rb +7 -12
  155. data/app/mailers/decidim/notifications_digest_mailer.rb +1 -7
  156. data/app/mailers/decidim/reported_mailer.rb +2 -18
  157. data/app/models/decidim/action_log.rb +20 -1
  158. data/app/models/decidim/category.rb +4 -0
  159. data/app/models/decidim/component.rb +25 -3
  160. data/app/models/decidim/metric.rb +2 -1
  161. data/app/models/decidim/moderation.rb +16 -0
  162. data/app/models/decidim/newsletter.rb +12 -8
  163. data/app/models/decidim/organization.rb +7 -3
  164. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  165. data/app/models/decidim/private_export.rb +24 -0
  166. data/app/models/decidim/push_notification_message.rb +1 -1
  167. data/app/models/decidim/report.rb +1 -1
  168. data/app/models/decidim/scope.rb +4 -0
  169. data/app/models/decidim/share_token.rb +36 -10
  170. data/app/models/decidim/taxonomization.rb +23 -0
  171. data/app/models/decidim/taxonomy.rb +139 -0
  172. data/app/models/decidim/taxonomy_filter.rb +130 -0
  173. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  174. data/app/models/decidim/user.rb +13 -23
  175. data/app/models/decidim/user_base_entity.rb +12 -4
  176. data/app/models/decidim/user_moderation.rb +9 -0
  177. data/app/models/decidim/user_report.rb +4 -0
  178. data/app/packs/entrypoints/decidim_core.js +1 -0
  179. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  180. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  181. data/app/packs/images/decidim/brands/google.svg +7 -1
  182. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  183. data/app/packs/images/decidim/default-avatar.svg +1 -1
  184. data/app/packs/src/decidim/callout.js +8 -13
  185. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  186. data/app/packs/src/decidim/clipboard.js +18 -9
  187. data/app/packs/src/decidim/datepicker/datepicker_functions.js +3 -3
  188. data/app/packs/src/decidim/datepicker/generate_datepicker.js +0 -2
  189. data/app/packs/src/decidim/datepicker/generate_timepicker.js +0 -2
  190. data/app/packs/src/decidim/decidim_application.js +1 -0
  191. data/app/packs/src/decidim/direct_uploads/upload_field.js +4 -3
  192. data/app/packs/src/decidim/direct_uploads/upload_modal.js +9 -8
  193. data/app/packs/src/decidim/editor/common/suggestion.js +1 -11
  194. data/app/packs/src/decidim/form_filter.js +0 -6
  195. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  196. data/app/packs/src/decidim/index.js +9 -5
  197. data/app/packs/src/decidim/input_character_counter.js +1 -1
  198. data/app/packs/src/decidim/map/provider/here.js +1 -1
  199. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  200. data/app/packs/src/decidim/sticky_footer.js +29 -0
  201. data/app/packs/src/decidim/sticky_header.js +6 -31
  202. data/app/packs/src/decidim/user_registrations.js +13 -0
  203. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +212 -0
  204. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  205. data/app/packs/stylesheets/decidim/_activity.scss +4 -4
  206. data/app/packs/stylesheets/decidim/_author.scss +0 -8
  207. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  208. data/app/packs/stylesheets/decidim/_cards.scss +1 -9
  209. data/app/packs/stylesheets/decidim/_content_blocks.scss +0 -4
  210. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  211. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  212. data/app/packs/stylesheets/decidim/_filters.scss +1 -1
  213. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  214. data/app/packs/stylesheets/decidim/_header.scss +39 -70
  215. data/app/packs/stylesheets/decidim/_layout.scss +34 -4
  216. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  217. data/app/packs/stylesheets/decidim/_modal.scss +47 -1
  218. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  219. data/app/packs/stylesheets/decidim/_modal_update.scss +1 -5
  220. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  221. data/app/packs/stylesheets/decidim/_profile.scss +7 -7
  222. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  223. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  224. data/app/packs/stylesheets/decidim/application.scss +1 -1
  225. data/app/packs/stylesheets/decidim/editor.scss +1 -3
  226. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  227. data/app/packs/stylesheets/decidim/map.scss +7 -10
  228. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  229. data/app/permissions/decidim/default_permissions.rb +0 -2
  230. data/app/permissions/decidim/permissions.rb +9 -15
  231. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  232. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  233. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  234. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  235. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  236. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  237. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  238. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  239. data/app/presenters/decidim/log/user_presenter.rb +0 -1
  240. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  241. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  242. data/app/presenters/decidim/notification_to_mailer_presenter.rb +3 -7
  243. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  244. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  245. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  246. data/app/presenters/decidim/user_presenter.rb +1 -1
  247. data/app/queries/decidim/last_activity.rb +0 -25
  248. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  249. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  250. data/app/queries/decidim/public_activities.rb +1 -12
  251. data/app/queries/decidim/stats_users_count.rb +2 -2
  252. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  253. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  254. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  255. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  256. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  257. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  258. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  259. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  260. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  261. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  262. data/app/services/decidim/action_authorizer.rb +32 -3
  263. data/app/services/decidim/base_diff_renderer.rb +1 -3
  264. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  265. data/app/services/decidim/onboarding_manager.rb +272 -0
  266. data/app/services/decidim/open_data_exporter.rb +139 -13
  267. data/app/services/decidim/static_map_generator.rb +1 -1
  268. data/app/services/decidim/traceability.rb +13 -0
  269. data/app/uploaders/decidim/application_uploader.rb +1 -1
  270. data/app/validators/etiquette_validator.rb +9 -2
  271. data/app/validators/passthru_validator.rb +1 -1
  272. data/app/validators/password_validator.rb +1 -3
  273. data/app/validators/translated_etiquette_validator.rb +32 -0
  274. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  275. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  276. data/app/views/decidim/application/_collection.html.erb +30 -18
  277. data/app/views/decidim/application/_document.html.erb +2 -2
  278. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  279. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  280. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  281. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  282. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  283. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  284. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  285. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  286. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  287. data/app/views/decidim/errors/internal_server_error.html.erb +1 -1
  288. data/app/views/decidim/errors/not_found.html.erb +1 -1
  289. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  290. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  291. data/app/views/decidim/last_activities/index.html.erb +1 -1
  292. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +2 -1
  293. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  294. data/app/views/decidim/newsletters/unsubscribe.html.erb +4 -16
  295. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  296. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  297. data/app/views/decidim/open_data/index.html.erb +108 -0
  298. data/app/views/decidim/pages/show.html.erb +2 -1
  299. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  300. data/app/views/decidim/reported_mailer/hide.html.erb +9 -0
  301. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  302. data/app/views/decidim/searches/_count.html.erb +1 -1
  303. data/app/views/decidim/searches/_filters.html.erb +39 -76
  304. data/app/views/decidim/shared/_component_announcement.html.erb +1 -1
  305. data/app/views/decidim/shared/_confirm_modal.html.erb +5 -3
  306. data/app/views/decidim/shared/_filters.html.erb +5 -7
  307. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  308. data/app/views/decidim/shared/_orders.html.erb +2 -2
  309. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  310. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  311. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  312. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  313. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  314. data/app/views/kaminari/decidim/_page.html.erb +1 -1
  315. data/app/views/kaminari/decidim/_paginator.html.erb +1 -1
  316. data/app/views/layouts/decidim/_application.html.erb +1 -2
  317. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  318. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  319. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  320. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  321. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  322. data/app/views/layouts/decidim/footer/_main.html.erb +1 -1
  323. data/app/views/layouts/decidim/footer/_main_intro.html.erb +1 -1
  324. data/app/views/layouts/decidim/footer/_main_legal.html.erb +1 -1
  325. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  326. data/app/views/layouts/decidim/footer/_mini.html.erb +2 -2
  327. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  328. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  329. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +0 -6
  330. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +0 -2
  331. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +1 -1
  332. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  333. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +11 -5
  334. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +5 -5
  335. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +1 -1
  336. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  337. data/config/assets.rb +2 -1
  338. data/config/locales/ar.yml +38 -74
  339. data/config/locales/bg-BG.yml +2 -2
  340. data/config/locales/bg.yml +38 -74
  341. data/config/locales/bs-BA.yml +0 -2
  342. data/config/locales/ca.yml +382 -138
  343. data/config/locales/cs.yml +379 -121
  344. data/config/locales/de.yml +370 -133
  345. data/config/locales/el.yml +26 -58
  346. data/config/locales/en.yml +354 -110
  347. data/config/locales/eo.yml +0 -4
  348. data/config/locales/es-MX.yml +368 -127
  349. data/config/locales/es-PY.yml +373 -132
  350. data/config/locales/es.yml +374 -130
  351. data/config/locales/eu.yml +491 -245
  352. data/config/locales/fi-plain.yml +367 -130
  353. data/config/locales/fi.yml +372 -132
  354. data/config/locales/fr-CA.yml +180 -125
  355. data/config/locales/fr-LU.yml +3 -3
  356. data/config/locales/fr.yml +180 -122
  357. data/config/locales/ga-IE.yml +4 -25
  358. data/config/locales/gl.yml +23 -58
  359. data/config/locales/hu.yml +35 -62
  360. data/config/locales/id-ID.yml +24 -57
  361. data/config/locales/is-IS.yml +6 -25
  362. data/config/locales/it.yml +39 -218
  363. data/config/locales/ja.yml +235 -141
  364. data/config/locales/lb-LU.yml +2 -2
  365. data/config/locales/lb.yml +31 -76
  366. data/config/locales/lt.yml +29 -64
  367. data/config/locales/lv.yml +24 -58
  368. data/config/locales/nl.yml +26 -75
  369. data/config/locales/no.yml +26 -70
  370. data/config/locales/pl.yml +35 -72
  371. data/config/locales/pt-BR.yml +44 -63
  372. data/config/locales/pt.yml +26 -70
  373. data/config/locales/ro-RO.yml +118 -183
  374. data/config/locales/ru.yml +16 -43
  375. data/config/locales/sk-SK.yml +3 -3
  376. data/config/locales/sk.yml +27 -72
  377. data/config/locales/sl.yml +0 -4
  378. data/config/locales/sr-CS.yml +0 -2
  379. data/config/locales/sv.yml +141 -133
  380. data/config/locales/tr-TR.yml +32 -75
  381. data/config/locales/uk.yml +8 -29
  382. data/config/locales/zh-CN.yml +24 -68
  383. data/config/locales/zh-TW.yml +28 -62
  384. data/config/routes.rb +4 -10
  385. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  386. data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
  387. data/db/migrate/20180706104107_add_nickname_to_managed_users.rb +1 -1
  388. data/db/migrate/20181001124950_move_users_groups_to_users_table.rb +1 -1
  389. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  390. data/db/migrate/20190412131728_fix_user_names.rb +1 -1
  391. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  392. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  393. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  394. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  395. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  396. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  397. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  398. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  399. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  400. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  401. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  402. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  403. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  404. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  405. data/decidim-core.gemspec +14 -17
  406. data/lib/decidim/action_authorization.rb +3 -2
  407. data/lib/decidim/amendable.rb +1 -1
  408. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  409. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  410. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  411. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  412. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  413. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  414. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  415. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  416. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  417. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  418. data/lib/decidim/api/types/amendment_type.rb +5 -7
  419. data/lib/decidim/api/types/area_api_type.rb +3 -3
  420. data/lib/decidim/api/types/attachment_type.rb +3 -3
  421. data/lib/decidim/api/types/category_type.rb +2 -2
  422. data/lib/decidim/api/types/decidim_type.rb +5 -1
  423. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  424. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  425. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  426. data/lib/decidim/api/types/metric_type.rb +1 -1
  427. data/lib/decidim/api/types/organization_type.rb +5 -0
  428. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  429. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  430. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  431. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  432. data/lib/decidim/api/types/session_type.rb +1 -2
  433. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  434. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  435. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  436. data/lib/decidim/api/types/user_group_type.rb +7 -20
  437. data/lib/decidim/api/types/user_type.rb +7 -20
  438. data/lib/decidim/asset_router/storage.rb +10 -15
  439. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +3 -3
  440. data/lib/decidim/attachment_attributes.rb +1 -1
  441. data/lib/decidim/attribute_encryptor.rb +1 -1
  442. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  443. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  444. data/lib/decidim/attributes/time_with_zone.rb +1 -5
  445. data/lib/decidim/attributes.rb +2 -0
  446. data/lib/decidim/authorization_form_builder.rb +0 -7
  447. data/lib/decidim/coauthorable.rb +1 -1
  448. data/lib/decidim/command.rb +3 -3
  449. data/lib/decidim/commands/destroy_resource.rb +5 -1
  450. data/lib/decidim/commands/resource_handler.rb +2 -2
  451. data/lib/decidim/commands/restore_resource.rb +45 -0
  452. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  453. data/lib/decidim/component_manifest.rb +7 -0
  454. data/lib/decidim/content_parsers/blob_parser.rb +8 -10
  455. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  456. data/lib/decidim/core/api.rb +2 -0
  457. data/lib/decidim/core/engine.rb +21 -7
  458. data/lib/decidim/core/menu.rb +0 -5
  459. data/lib/decidim/core/seeds.rb +42 -2
  460. data/lib/decidim/core/test/factories.rb +107 -4
  461. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  462. data/lib/decidim/core/test/shared_examples/announcements_examples.rb +0 -4
  463. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  464. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  465. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  466. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  467. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  468. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  469. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  470. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  471. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  472. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  473. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  474. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  475. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  476. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  477. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  478. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  479. data/lib/decidim/core/test/shared_examples/reports_examples.rb +15 -53
  480. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  481. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  482. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  483. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  484. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +7 -14
  485. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  486. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  487. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  488. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  489. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  490. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  491. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +0 -26
  492. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -28
  493. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  494. data/lib/decidim/core/test.rb +9 -5
  495. data/lib/decidim/core/version.rb +1 -1
  496. data/lib/decidim/core.rb +58 -0
  497. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  498. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  499. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  500. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  501. data/lib/decidim/download_your_data_serializers.rb +19 -0
  502. data/lib/decidim/exporters/csv.rb +6 -0
  503. data/lib/decidim/exporters/export_manifest.rb +14 -0
  504. data/lib/decidim/exporters/pdf.rb +26 -22
  505. data/lib/decidim/filter_form_builder.rb +12 -15
  506. data/lib/decidim/form_builder.rb +7 -144
  507. data/lib/decidim/has_category.rb +5 -1
  508. data/lib/decidim/has_private_users.rb +4 -0
  509. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  510. data/lib/decidim/has_upload_validations.rb +1 -1
  511. data/lib/decidim/legacy_form_builder.rb +118 -0
  512. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  513. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  514. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  515. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  516. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  517. data/lib/decidim/maintenance/import_models/category.rb +107 -0
  518. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  519. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  520. data/lib/decidim/maintenance/import_models.rb +19 -0
  521. data/lib/decidim/maintenance/taxonomy_importer.rb +132 -0
  522. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  523. data/lib/decidim/maintenance.rb +12 -0
  524. data/lib/decidim/map/autocomplete.rb +52 -8
  525. data/lib/decidim/map/dynamic_map.rb +1 -1
  526. data/lib/decidim/map/provider/dynamic_map/here.rb +40 -1
  527. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  528. data/lib/decidim/map/provider/static_map/here.rb +0 -34
  529. data/lib/decidim/map.rb +3 -6
  530. data/lib/decidim/moderation_tools.rb +16 -19
  531. data/lib/decidim/newsletter_encryptor.rb +1 -1
  532. data/lib/decidim/nicknamizable.rb +9 -6
  533. data/lib/decidim/paddable.rb +1 -1
  534. data/lib/decidim/participable.rb +10 -10
  535. data/lib/decidim/participatory_space_user.rb +10 -0
  536. data/lib/decidim/private_download_helper.rb +15 -0
  537. data/lib/decidim/record_encryptor.rb +51 -46
  538. data/lib/decidim/reportable.rb +2 -6
  539. data/lib/decidim/resourceable.rb +16 -0
  540. data/lib/decidim/seeds.rb +18 -20
  541. data/lib/decidim/settings_manifest.rb +34 -1
  542. data/lib/decidim/soft_deletable.rb +17 -0
  543. data/lib/decidim/taxonomizable.rb +72 -0
  544. data/lib/decidim/translatable_attributes.rb +1 -5
  545. data/lib/decidim/view_model.rb +0 -1
  546. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  547. data/lib/tasks/decidim_procfile.rake +6 -0
  548. data/lib/tasks/decidim_tasks.rake +1 -0
  549. data/lib/tasks/decidim_taxonomies.rake +155 -0
  550. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  551. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  552. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +20 -23
  553. data/lib/tasks/upgrade/migrations.rake +91 -0
  554. metadata +201 -114
  555. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  556. data/app/cells/decidim/author/badge.erb +0 -6
  557. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  558. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  559. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  560. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  561. data/app/cells/decidim/report_user_button/already_reported_modal.erb +0 -11
  562. data/app/cells/decidim/report_user_button/flag_modal.erb +0 -47
  563. data/app/cells/decidim/report_user_button/show.erb +0 -2
  564. data/app/cells/decidim/report_user_button_cell.rb +0 -59
  565. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  566. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  567. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  568. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  569. data/app/commands/decidim/update_user_interests.rb +0 -41
  570. data/app/controllers/decidim/scopes_controller.rb +0 -84
  571. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  572. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  573. data/app/forms/decidim/user_interests_form.rb +0 -17
  574. data/app/helpers/decidim/categories_helper.rb +0 -26
  575. data/app/helpers/decidim/scopes_helper.rb +0 -105
  576. data/app/jobs/decidim/hide_child_resources_job.rb +0 -24
  577. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  578. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  579. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  580. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  581. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  582. data/app/packs/src/decidim/dropdown_menu.js +0 -18
  583. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  584. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  585. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  586. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  587. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  588. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  589. data/app/views/decidim/reported_mailer/hidden_automatically.html.erb +0 -25
  590. data/app/views/decidim/reported_mailer/hidden_manually.html.erb +0 -25
  591. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  592. data/app/views/decidim/scopes/picker.html.erb +0 -53
  593. data/app/views/decidim/shared/_comments.html.erb +0 -0
  594. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  595. data/app/views/decidim/shared/_tags.html.erb +0 -1
  596. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  597. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  598. data/app/views/decidim/user_interests/show.html.erb +0 -22
  599. data/config/initializers/foundation_rails_helper.rb +0 -4
  600. data/config/locales/ca-IT.yml +0 -2146
  601. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  602. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  603. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  604. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  605. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  606. data/lib/decidim/seven_zip_wrapper.rb +0 -29
  607. data/lib/tasks/upgrade/clean_hidden_resources.rake +0 -33
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class Scope < ApplicationRecord
7
+ resource_models [
8
+ "Decidim::Assembly", "Decidim::ParticipatoryProcess", "Decidim::Conference", "Decidim::InitiativesTypeScope",
9
+ "Decidim::ActionLog",
10
+ "Decidim::Accountability::Result",
11
+ "Decidim::Budgets::Budget", "Decidim::Budgets::Project",
12
+ "Decidim::Debates::Debate",
13
+ "Decidim::Meetings::Meeting",
14
+ "Decidim::Proposals::CollaborativeDraft", "Decidim::Proposals::Proposal"
15
+ ]
16
+ participatory_space_models ["Decidim::Assembly", "Decidim::ParticipatoryProcess", "Decidim::Conference", "Decidim::Initiative"]
17
+
18
+ self.table_name = "decidim_scopes"
19
+
20
+ def self.root_taxonomy_name = "~ #{I18n.t("decidim.admin.titles.scopes")}"
21
+
22
+ belongs_to :parent,
23
+ class_name: "Decidim::Maintenance::ImportModels::Scope",
24
+ inverse_of: :children,
25
+ optional: true
26
+
27
+ has_many :children,
28
+ foreign_key: "parent_id",
29
+ class_name: "Decidim::Maintenance::ImportModels::Scope",
30
+ inverse_of: :parent
31
+
32
+ attr_writer :full_name
33
+
34
+ def full_name
35
+ return @full_name if defined?(@full_name)
36
+
37
+ @full_name ||= name.dup
38
+ @full_name[I18n.locale.to_s] = "#{parent.full_name[I18n.locale.to_s]} > #{@full_name[I18n.locale.to_s]}" if parent_ids.count > 2
39
+ @full_name
40
+ end
41
+
42
+ def parent_ids
43
+ @parent_ids ||= parent_id ? parent.parent_ids + [parent_id] : []
44
+ end
45
+
46
+ def all_names
47
+ names = parent_ids.map do |id|
48
+ Scope.find_by(id:).name[I18n.locale.to_s]
49
+ end + [name[I18n.locale.to_s]]
50
+
51
+ return names if names.count < 4
52
+
53
+ names[0..1] + [names[2..].join(" > ")]
54
+ end
55
+
56
+ def all_children
57
+ @all_children ||= children.map do |child|
58
+ [child] + child.all_children
59
+ end.flatten
60
+ end
61
+
62
+ def children_taxonomies
63
+ # next level is going to be too deep, we transform the children into siblings
64
+ return sibling_taxonomies if parent_ids.count.positive?
65
+
66
+ children.to_h { |child| [child.full_name[I18n.locale.to_s], child.taxonomies] }
67
+ end
68
+
69
+ def sibling_taxonomies
70
+ all_children.to_h do |child|
71
+ [
72
+ child.full_name[I18n.locale.to_s],
73
+ {
74
+ name: child.full_name,
75
+ origin: child.to_global_id.to_s,
76
+ children: {},
77
+ resources: child.resources
78
+ }
79
+ ]
80
+ end
81
+ end
82
+
83
+ def taxonomies
84
+ {
85
+ name:,
86
+ origin: to_global_id.to_s,
87
+ children: children_taxonomies,
88
+ resources:
89
+ }
90
+ end
91
+
92
+ def resources
93
+ Scope.resource_classes.each_with_object({}) do |klass, hash|
94
+ items = if klass.to_s == "Decidim::InitiativesTypeScope"
95
+ klass.where(decidim_scopes_id: id)
96
+ else
97
+ klass.where(decidim_scope_id: id)
98
+ end
99
+ hash.merge!(items.to_h { |resource| [resource.to_global_id.to_s, resource_name(resource)] })
100
+ end
101
+ end
102
+
103
+ def self.filter_item_for_space_manifest(participatory_space_manifests)
104
+ items = []
105
+ all_in_org.where(parent_id: nil).find_each do |scope|
106
+ items << [scope.name[I18n.locale.to_s]]
107
+ scope.all_children.map(&:all_names).each do |names|
108
+ items << names
109
+ end
110
+ end
111
+
112
+ {
113
+ participatory_space_manifests:,
114
+ name: root_taxonomy_name,
115
+ items:,
116
+ components: []
117
+ }
118
+ end
119
+
120
+ def self.filter_item_for_component(component, space)
121
+ return unless component.settings.respond_to?(:taxonomy_filters)
122
+
123
+ scopes_enabled = component.attributes.dig("settings", "global", "scopes_enabled")
124
+ scope_id = component.attributes.dig("settings", "global", "scope_id")
125
+ return unless scopes_enabled
126
+
127
+ scope = find_by(id: scope_id) || (space.scopes_enabled? && find_by(id: space.decidim_scope_id))
128
+ list = scope ? [scope] + scope.all_children : all
129
+
130
+ {
131
+ name: root_taxonomy_name,
132
+ internal_name: "#{root_taxonomy_name}: #{component.name[I18n.locale.to_s]}",
133
+ items: list.map(&:all_names),
134
+ components: [component.to_global_id.to_s]
135
+ }
136
+ end
137
+
138
+ def self.all_filters
139
+ manifests = []
140
+ filters = []
141
+ Scope.participatory_space_classes.each do |space_class|
142
+ manifests << space_class.to_s.split("::").last.underscore.pluralize
143
+ # 1 filter per participatory space as space_filter=true
144
+ # 1 filter per component as space_filter=false on those with scopes, suffix: "Component Name"
145
+ # Only for components with scopes
146
+ space_class.where(organization:).each do |space|
147
+ space.components.each do |component|
148
+ component_filter = filter_item_for_component(component, space)
149
+ filters << component_filter if component_filter
150
+ end
151
+ end
152
+ end
153
+ filters << filter_item_for_space_manifest(manifests)
154
+ filters
155
+ end
156
+
157
+ def self.all_taxonomies
158
+ all_in_org.where(parent_id: nil).to_h { |scope| [scope.name[I18n.locale.to_s], scope.taxonomies] }
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This class should not be imported automatically by the Decidim web app
5
+ # It holds utilities for maintenance tasks (such as importing taxonomies)
6
+ # and compatibility models that might not be longer present in the current Decidim version
7
+ module Maintenance
8
+ module ImportModels
9
+ autoload :ApplicationRecord, "decidim/maintenance/import_models/application_record"
10
+ autoload :ParticipatoryProcessType, "decidim/maintenance/import_models/participatory_process_type"
11
+ autoload :AssemblyType, "decidim/maintenance/import_models/assembly_type"
12
+ autoload :Scope, "decidim/maintenance/import_models/scope"
13
+ autoload :Area, "decidim/maintenance/import_models/area"
14
+ autoload :AreaType, "decidim/maintenance/import_models/area_type"
15
+ autoload :Category, "decidim/maintenance/import_models/category"
16
+ autoload :Categorization, "decidim/maintenance/import_models/categorization"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ class TaxonomyImporter
6
+ def initialize(organization, roots)
7
+ @organization = organization
8
+ @roots = roots
9
+ @result = { taxonomy_map: {}, taxonomies_created: [], taxonomies_assigned: {}, filters_created: {}, components_assigned: {}, failed_resources: [], failed_components: [] }
10
+ end
11
+
12
+ attr_reader :organization, :roots, :result
13
+
14
+ def import!(&)
15
+ roots.each do |name, element|
16
+ root = find_taxonomy!(root_taxonomies, name)
17
+ element["taxonomies"].each do |item_name, taxonomy|
18
+ import_taxonomy_item(root, item_name, taxonomy)
19
+ yield "Taxonomy imported", item_name if block_given?
20
+ end
21
+ element["filters"].each do |filter|
22
+ import_filter(root, filter)
23
+ yield "Filter imported", filter["name"] if block_given?
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def import_taxonomy_item(parent, name, item)
31
+ taxonomy = find_taxonomy!(parent.children, name)
32
+ taxonomy.update!(name: item["name"]) if item["name"].present?
33
+ result[:taxonomy_map][taxonomy.id] = item["origin"]
34
+
35
+ item["resources"].each do |object_id, _name|
36
+ apply_taxonomy_to_resource(object_id, taxonomy)
37
+ end
38
+ item["children"].each do |child_name, child|
39
+ import_taxonomy_item(taxonomy, child_name, child)
40
+ end
41
+ end
42
+
43
+ def apply_taxonomy_to_resource(object_id, taxonomy)
44
+ resource = GlobalID::Locator.locate(object_id)
45
+ return result[:failed_resources] << object_id unless resource
46
+
47
+ name = taxonomy.name[organization.default_locale]
48
+
49
+ begin
50
+ if resource.respond_to? :taxonomy
51
+ resource.update(decidim_taxonomy_id: taxonomy.id)
52
+ else
53
+ return if resource.taxonomies.include?(taxonomy)
54
+
55
+ resource.taxonomies << taxonomy
56
+ end
57
+ result[:taxonomies_assigned][name] ||= []
58
+ result[:taxonomies_assigned][name] << object_id unless result[:taxonomies_assigned][name].include?(object_id)
59
+ rescue ActiveRecord::RecordInvalid
60
+ result[:failed_resources] << object_id
61
+ end
62
+ end
63
+
64
+ def import_filter(root, data)
65
+ filter = find_taxonomy_filter!(root, data)
66
+
67
+ data["items"].each do |item_names|
68
+ taxonomy = root
69
+ item_names.each do |item_name|
70
+ taxonomy = find_taxonomy!(taxonomy.children, item_name)
71
+ end
72
+ next if filter.filter_items.exists?(taxonomy_item: taxonomy)
73
+
74
+ filter.filter_items.create!(taxonomy_item: taxonomy) do
75
+ result[:filters_created][filter.internal_name[organization.default_locale]] ||= []
76
+ result[:filters_created][filter.internal_name[organization.default_locale]] << item_names.join(" > ")
77
+ end
78
+ end
79
+
80
+ data["components"].each do |component_id|
81
+ component = GlobalID::Locator.locate(component_id)
82
+ if component
83
+ begin
84
+ component.update!(settings: { taxonomy_filters: [filter.id.to_s] })
85
+ result[:components_assigned][filter.internal_name[organization.default_locale]] ||= []
86
+ result[:components_assigned][filter.internal_name[organization.default_locale]] << component_id
87
+ rescue ActiveRecord::RecordInvalid
88
+ result[:failed_components] << component_id
89
+ end
90
+ else
91
+ result[:failed_components] << component_id
92
+ end
93
+ end
94
+ end
95
+
96
+ def find_taxonomy(association, name)
97
+ association.find_by("name->>? = ?", organization.default_locale, name)
98
+ end
99
+
100
+ def find_taxonomy!(association, name)
101
+ find_taxonomy(association, name) || create_taxonomy!(association, name)
102
+ end
103
+
104
+ def create_taxonomy!(association, name)
105
+ association.create!(name: { organization.default_locale => name }, organization:) do
106
+ result[:taxonomies_created] << name
107
+ end
108
+ end
109
+
110
+ def find_taxonomy_filter!(root_taxonomy, data)
111
+ name = data["internal_name"] || data["name"]
112
+ attributes = {
113
+ "participatory_space_manifests" => data["participatory_space_manifests"] || []
114
+ }
115
+ attributes["internal_name"] = { organization.default_locale => data["internal_name"] } if data["internal_name"]
116
+ attributes["name"] = { organization.default_locale => data["public_name"] } if data["public_name"]
117
+
118
+ find_taxonomy_filter(root_taxonomy, name:, participatory_space_manifests: data["participatory_space_manifests"]) || root_taxonomy.taxonomy_filters.create!(attributes)
119
+ end
120
+
121
+ def find_taxonomy_filter(root_taxonomy, name:, participatory_space_manifests:)
122
+ root_taxonomy.taxonomy_filters.all.detect do |filter|
123
+ filter.internal_name[organization.default_locale] == name && filter.participatory_space_manifests == participatory_space_manifests
124
+ end
125
+ end
126
+
127
+ def root_taxonomies
128
+ organization.taxonomies.roots
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ class TaxonomyPlan
6
+ def initialize(organization, models, importer: TaxonomyImporter)
7
+ @organization = organization
8
+ @models = models
9
+ @importer = importer
10
+ end
11
+
12
+ attr_reader :organization, :models, :importer
13
+
14
+ def import(data, &)
15
+ data["imported_taxonomies"].each do |model_name, taxonomies|
16
+ klass = importer.new(organization, taxonomies)
17
+ if block_given?
18
+ yield klass, model_name
19
+ else
20
+ klass.import!
21
+ end
22
+ end
23
+ end
24
+
25
+ def to_json(*_args, &)
26
+ I18n.with_locale(organization.default_locale) do
27
+ JSON.pretty_generate(to_h(&))
28
+ end
29
+ end
30
+
31
+ def to_h(&)
32
+ {
33
+ organization: {
34
+ id: organization.id,
35
+ locale: organization.default_locale,
36
+ host: organization.host,
37
+ name: translate(organization.name)
38
+ },
39
+ existing_taxonomies:,
40
+ imported_taxonomies: imported_taxonomies(&)
41
+ }
42
+ end
43
+
44
+ def imported_taxonomies
45
+ return @imported_taxonomies if defined?(@imported_taxonomies)
46
+
47
+ @imported_taxonomies = {}
48
+ models.map do |model|
49
+ yield model if block_given?
50
+ @imported_taxonomies[model.table_name] = model.with(organization).to_taxonomies
51
+ end
52
+ @imported_taxonomies
53
+ end
54
+
55
+ def existing_taxonomies
56
+ organization.taxonomies.roots.to_h do |root|
57
+ [
58
+ translate(root.name),
59
+ root.children.to_h do |taxonomy|
60
+ [
61
+ translate(taxonomy.name),
62
+ taxonomy.children.map do |child|
63
+ translate(child.name)
64
+ end
65
+ ]
66
+ end
67
+ ]
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def translate(translatable)
74
+ return translatable[organization.default_locale.to_s]
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/maintenance/import_models"
4
+ module Decidim
5
+ # This class should not be imported automatically by the Decidim web app
6
+ # It holds utilities for maintenance tasks (such as importing taxonomies)
7
+ # and compatibility models that might not be longer present in the current Decidim version
8
+ module Maintenance
9
+ autoload :TaxonomyImporter, "decidim/maintenance/taxonomy_importer"
10
+ autoload :TaxonomyPlan, "decidim/maintenance/taxonomy_plan"
11
+ end
12
+ end
@@ -9,24 +9,68 @@ module Decidim
9
9
  # Provides all the necessary functionality to initialize the front-end
10
10
  # geocoding autocompletion functionality.
11
11
  class Builder < Decidim::Map::Frontend::Builder
12
- # Displays the geocoding field element's markup for the view.
12
+ delegate :icon, :content_tag, :asset_pack_path, to: :template
13
+
14
+ # Renders the geocoding field element for the view. If the component supports
15
+ # geolocation (as determined by `show_my_location_button?`), the field will include
16
+ # a button allowing the user to use their current location to autofill the address.
17
+ # Otherwise, a standard geocoding input field is rendered without the location button.
13
18
  #
14
- # @param object_name [String, Symbol] The name for the object for which
15
- # the field is generated for.
16
- # @param method [String, Symbol] The method/property in the object that
17
- # the field is for.
18
- # @param options [Hash] Extra options for the field.
19
- # @return [String] The field element's markup.
19
+ # @param object_name [String, Symbol] The name of the object the field is being generated for.
20
+ # @param method [String, Symbol] The specific attribute or property of the object.
21
+ # @param options [Hash] Additional options for customizing the field's behavior and appearance.
22
+ # @return [String] The HTML markup for the geocoding field.
20
23
  def geocoding_field(object_name, method, options = {})
21
24
  options[:autocomplete] ||= "off"
22
-
23
25
  append_assets
26
+
27
+ if show_my_location_button?
28
+ geocoding_field_with_location_button(object_name, method, options)
29
+ else
30
+ geocoding_field_without_location_button(object_name, method, options)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def geocoding_field_with_location_button(object_name, method, options)
37
+ template.snippets.add(:decidim_geocoding_scripts, template.append_javascript_pack_tag("decidim_geocoding"))
38
+ template.snippets.add(:decidim_geocoding_styles, template.append_stylesheet_pack_tag("decidim_geocoding"))
39
+
40
+ template.content_tag(:div, class: "geocoding-container") do
41
+ template.text_field(
42
+ object_name,
43
+ method,
44
+ options.merge("data-decidim-geocoding" => view_options.to_json)
45
+ ) +
46
+ template.content_tag(:div, class: "input-group-button user-device-location") do
47
+ template.content_tag(:button, class: "button button__sm md:button__sm button__text-secondary", type: "button", data: {
48
+ input: "#{object_name}_#{method}",
49
+ latitude: "#{object_name}_latitude",
50
+ longitude: "#{object_name}_longitude",
51
+ error_no_location: I18n.t("errors.no_device_location", scope: "decidim.proposals.forms"),
52
+ error_unsupported: I18n.t("errors.device_not_supported", scope: "decidim.proposals.forms"),
53
+ url: Decidim::Core::Engine.routes.url_helpers.locate_path
54
+ }) do
55
+ icon("map-pin-line", role: "img", "aria-hidden": true) + " #{I18n.t("use_my_location", scope: "decidim.proposals.forms")}"
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ def geocoding_field_without_location_button(object_name, method, options)
24
62
  template.text_field(
25
63
  object_name,
26
64
  method,
27
65
  options.merge("data-decidim-geocoding" => view_options.to_json)
28
66
  )
29
67
  end
68
+
69
+ def show_my_location_button?
70
+ return unless template.respond_to?(:current_component)
71
+
72
+ template.current_component.manifest_name.to_sym == :proposals
73
+ end
30
74
  end
31
75
 
32
76
  # This module will be included in the main application's form builder in
@@ -71,7 +71,7 @@ module Decidim
71
71
  content = template.capture { yield }.html_safe if block_given?
72
72
 
73
73
  template.content_tag(:div, map_html_options) do
74
- (content || "")
74
+ content || ""
75
75
  end
76
76
  end
77
77
 
@@ -49,7 +49,46 @@ module Decidim
49
49
  private
50
50
 
51
51
  def language_code
52
- I18n.locale.to_s
52
+ primary = I18n.locale.to_s
53
+ secondary = primary.split("-")[0]
54
+ available_language_codes[primary] || available_language_codes[secondary] || ""
55
+ end
56
+
57
+ def available_language_codes
58
+ @available_language_codes ||= {
59
+ "ar" => "ara", # Arabic
60
+ "eu" => "baq", # Basque
61
+ "ca" => "cat", # Catalan
62
+ "zh" => "chi", # Chinese (simplified)
63
+ # "" => "cht", # Chinese (traditional)
64
+ "cs" => "cze", # Czech
65
+ "da" => "dan", # Danish
66
+ "nl" => "dut", # Dutch
67
+ "en" => "eng", # English
68
+ "fi" => "fin", # Finnish
69
+ "fr" => "fre", # French
70
+ "de" => "ger", # German
71
+ "ga" => "gle", # Gaelic
72
+ "el" => "gre", # Greek
73
+ "he" => "heb", # Hebrew
74
+ "hi" => "hin", # Hindi
75
+ "id" => "ind", # Indonesian
76
+ "it" => "ita", # Italian
77
+ "no" => "nor", # Norwegian
78
+ "fa" => "per", # Persian
79
+ "pl" => "pol", # Polish
80
+ "pt" => "por", # Portuguese
81
+ "ru" => "rus", # Russian
82
+ "si" => "sin", # Sinhalese
83
+ "es" => "spa", # Spanish
84
+ "sv" => "swe", # Swedish
85
+ "th" => "tha", # Thai
86
+ "tr" => "tur", # Turkish
87
+ "uk" => "ukr", # Ukrainian
88
+ "ur" => "urd", # Urdu
89
+ "vi" => "vie", # Vietnamese
90
+ "cy" => "wel" # Welsh
91
+ }
53
92
  end
54
93
  end
55
94
  end
@@ -29,9 +29,7 @@ module Decidim
29
29
  # Some of the matches that have "resultType" == "street" do not even
30
30
  # contain the street name unless they also have the "streets" key in
31
31
  # the "scoring" -> "fieldScore" attribute defined.
32
- street_result = results.find do |r|
33
- r.data["scoring"]["fieldScore"].has_key?("streets")
34
- end
32
+ street_result = find_street_with_name(results)
35
33
  return street_result.address if street_result
36
34
 
37
35
  # Otherwise, sort the results based on their exact distances from
@@ -51,6 +49,14 @@ module Decidim
51
49
 
52
50
  results.first.address
53
51
  end
52
+
53
+ private
54
+
55
+ def find_street_with_name(results)
56
+ results.find do |r|
57
+ r.data && r.data["scoring"] && r.data["scoring"]["fieldScore"] && r.data["scoring"]["fieldScore"].has_key?("streets")
58
+ end
59
+ end
54
60
  end
55
61
  end
56
62
  end
@@ -6,42 +6,8 @@ module Decidim
6
6
  module StaticMap
7
7
  # The static map utility class for the HERE maps service
8
8
  class Here < ::Decidim::Map::StaticMap
9
- def url(latitude:, longitude:, options: {})
10
- map_url = configuration.fetch(:url, nil)
11
- return super unless map_url
12
-
13
- return super unless map_url.include?("mia/v3")
14
-
15
- w = options[:width] || Decidim::Map::StaticMap::DEFAULT_SIZE
16
- h = options[:height] || Decidim::Map::StaticMap::DEFAULT_SIZE
17
-
18
- params = {
19
- apiKey: configuration[:api_key],
20
- overlay: "point:#{latitude},#{longitude};icon=cp;size=large|#{latitude},#{longitude};style=circle;width=50m;color=%231B9D2C60"
21
- }
22
-
23
- URI.parse("#{map_url}:radius=90/#{w}x#{h}/png8").tap do |uri|
24
- uri.query = URI.encode_www_form(params)
25
- end.to_s
26
- end
27
-
28
9
  # @See Decidim::Map::StaticMap#url_params
29
10
  def url_params(latitude:, longitude:, options: {})
30
- ActiveSupport::Deprecation.warn(
31
- <<~DEPRECATION.strip
32
- Please use a V3 version HERE maps.
33
- For further information, see:
34
- https://www.here.com/docs/bundle/map-image-migration-guide-v3/page/README.html
35
- Also make sure your Decidim.maps configurations are using the
36
- up to date format.
37
- You need to change:
38
- static_url = "https://image.maps.ls.hereapi.com/mia/1.6/mapview" if static_provider == "here" && static_url.blank?
39
- to:
40
- static_url = "https://image.maps.hereapi.com/mia/v3/base/mc/overlay" if static_provider == "here"
41
- in your config/initializers/decidim.rb file.
42
- DEPRECATION
43
- )
44
-
45
11
  params = {
46
12
  c: "#{latitude}, #{longitude}",
47
13
  z: options[:zoom] || Decidim::Map::StaticMap::DEFAULT_ZOOM,
data/lib/decidim/map.rb CHANGED
@@ -73,12 +73,9 @@ module Decidim
73
73
  @utility_modules ||= {}
74
74
  @utility_modules[category] = mod
75
75
 
76
- # Dynamically define the category method.
77
- module_eval %{
78
- def self.#{category}(options) # def self.dynamic(options)
79
- utility(:#{category}, options) # utility(:dynamic, options)
80
- end # end
81
- }, __FILE__, __LINE__ - 4
76
+ define_singleton_method(category) do |options|
77
+ utility(category, options)
78
+ end
82
79
 
83
80
  mod
84
81
  end