decidim-core 0.29.4 → 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 (562) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/address/show.erb +3 -3
  3. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  4. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  5. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  6. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  7. data/app/cells/decidim/author/flag.erb +6 -0
  8. data/app/cells/decidim/author/flag_user.erb +14 -0
  9. data/app/cells/decidim/author/show.erb +4 -2
  10. data/app/cells/decidim/author_cell.rb +1 -1
  11. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  12. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  13. data/app/cells/decidim/comments_button_cell.rb +14 -2
  14. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  15. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  16. data/app/cells/decidim/content_blocks/participatory_space_extra_data/extra_data.erb +2 -2
  17. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  18. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  19. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  20. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  21. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  22. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  23. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  24. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  25. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  26. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  27. data/app/cells/decidim/flag_modal/flag_user.erb +34 -0
  28. data/app/cells/decidim/flag_modal/show.erb +52 -0
  29. data/app/cells/decidim/flag_modal_cell.rb +56 -0
  30. data/app/cells/decidim/follow_button/show.erb +1 -2
  31. data/app/cells/decidim/follow_button_cell.rb +5 -0
  32. data/app/cells/decidim/map/show.erb +3 -0
  33. data/app/cells/decidim/map/template.erb +14 -0
  34. data/app/cells/decidim/map_cell.rb +39 -0
  35. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  36. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  37. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  38. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +4 -4
  39. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +3 -5
  40. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  41. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  42. data/app/cells/decidim/profile_actions/show.erb +1 -1
  43. data/app/cells/decidim/profile_sidebar/show.erb +167 -0
  44. data/app/cells/decidim/profile_sidebar_cell.rb +68 -0
  45. data/app/cells/decidim/progress_bar/show.erb +2 -2
  46. data/app/cells/decidim/report_button/already_reported_modal.erb +2 -2
  47. data/app/cells/decidim/report_button/flag_modal.erb +27 -13
  48. data/app/cells/decidim/report_button_cell.rb +9 -2
  49. data/app/cells/decidim/resource_history/show.erb +20 -0
  50. data/app/cells/decidim/resource_history_cell.rb +66 -0
  51. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  52. data/app/cells/decidim/resource_types_filter_cell.rb +6 -6
  53. data/app/cells/decidim/share_button_cell.rb +0 -4
  54. data/app/cells/decidim/share_widget/modal.erb +26 -0
  55. data/app/cells/decidim/share_widget/show.erb +2 -0
  56. data/app/cells/decidim/share_widget_cell.rb +20 -0
  57. data/app/cells/decidim/tags/show.erb +7 -4
  58. data/app/cells/decidim/tags_cell.rb +11 -72
  59. data/app/cells/decidim/user_activity/show.erb +1 -1
  60. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  61. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  62. data/app/commands/decidim/create_omniauth_registration.rb +21 -17
  63. data/app/commands/decidim/create_report.rb +8 -11
  64. data/app/commands/decidim/create_user_group.rb +6 -2
  65. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  66. data/app/commands/decidim/invite_user.rb +1 -1
  67. data/app/commands/decidim/search.rb +0 -14
  68. data/app/commands/decidim/update_account.rb +11 -3
  69. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  70. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  71. data/app/commands/decidim/update_user_group.rb +7 -1
  72. data/app/constraints/decidim/current_component.rb +1 -1
  73. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  74. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  75. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  76. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  77. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  78. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  79. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  80. data/app/controllers/concerns/decidim/headers/browser_feature_permissions.rb +50 -0
  81. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  82. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  83. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  84. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  85. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  86. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -4
  87. data/app/controllers/decidim/application_controller.rb +10 -0
  88. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  89. data/app/controllers/decidim/components/base_controller.rb +3 -7
  90. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  91. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  92. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  93. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  94. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  95. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  96. data/app/controllers/decidim/follows_controller.rb +1 -1
  97. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  98. data/app/controllers/decidim/homepage_controller.rb +0 -1
  99. data/app/controllers/decidim/open_data_controller.rb +33 -8
  100. data/app/controllers/decidim/profiles_controller.rb +2 -2
  101. data/app/controllers/decidim/reports_controller.rb +2 -7
  102. data/app/controllers/decidim/user_activities_controller.rb +1 -1
  103. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  104. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  105. data/app/forms/decidim/account_form.rb +2 -5
  106. data/app/forms/decidim/amendable/form.rb +4 -2
  107. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  108. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  109. data/app/forms/decidim/omniauth_registration_form.rb +15 -2
  110. data/app/forms/decidim/registration_form.rb +1 -1
  111. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  112. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  113. data/app/helpers/decidim/amendments_helper.rb +0 -9
  114. data/app/helpers/decidim/application_helper.rb +6 -2
  115. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  116. data/app/helpers/decidim/cache_helper.rb +1 -1
  117. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  118. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  119. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  120. data/app/helpers/decidim/layout_helper.rb +6 -0
  121. data/app/helpers/decidim/menu_helper.rb +2 -2
  122. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  123. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  124. data/app/helpers/decidim/modal_helper.rb +23 -0
  125. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  126. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  127. data/app/helpers/decidim/orders_helper.rb +1 -2
  128. data/app/helpers/decidim/paginate_helper.rb +1 -1
  129. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  130. data/app/helpers/decidim/passwords_helper.rb +2 -2
  131. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  132. data/app/helpers/decidim/tooltip_helper.rb +1 -4
  133. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  134. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  135. data/app/jobs/decidim/export_job.rb +5 -1
  136. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  137. data/app/jobs/decidim/open_data_job.rb +4 -4
  138. data/app/mailers/decidim/export_mailer.rb +7 -12
  139. data/app/mailers/decidim/notifications_digest_mailer.rb +1 -7
  140. data/app/mailers/decidim/reported_mailer.rb +2 -18
  141. data/app/models/decidim/action_log.rb +20 -1
  142. data/app/models/decidim/category.rb +4 -0
  143. data/app/models/decidim/component.rb +25 -3
  144. data/app/models/decidim/metric.rb +2 -1
  145. data/app/models/decidim/moderation.rb +16 -0
  146. data/app/models/decidim/newsletter.rb +12 -8
  147. data/app/models/decidim/organization.rb +7 -3
  148. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  149. data/app/models/decidim/private_export.rb +24 -0
  150. data/app/models/decidim/push_notification_message.rb +1 -1
  151. data/app/models/decidim/report.rb +1 -1
  152. data/app/models/decidim/scope.rb +4 -0
  153. data/app/models/decidim/share_token.rb +36 -10
  154. data/app/models/decidim/taxonomization.rb +23 -0
  155. data/app/models/decidim/taxonomy.rb +139 -0
  156. data/app/models/decidim/taxonomy_filter.rb +130 -0
  157. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  158. data/app/models/decidim/user.rb +13 -23
  159. data/app/models/decidim/user_base_entity.rb +12 -4
  160. data/app/models/decidim/user_moderation.rb +9 -0
  161. data/app/models/decidim/user_report.rb +4 -0
  162. data/app/packs/entrypoints/decidim_core.js +1 -0
  163. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  164. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  165. data/app/packs/images/decidim/brands/google.svg +7 -1
  166. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  167. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  168. data/app/packs/src/decidim/clipboard.js +18 -9
  169. data/app/packs/src/decidim/confirm.js +79 -59
  170. data/app/packs/src/decidim/datepicker/datepicker_functions.js +3 -3
  171. data/app/packs/src/decidim/decidim_application.js +1 -0
  172. data/app/packs/src/decidim/form_remote.js +1 -1
  173. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  174. data/app/packs/src/decidim/impersonation.js +1 -1
  175. data/app/packs/src/decidim/index.js +13 -5
  176. data/app/packs/src/decidim/input_character_counter.js +1 -1
  177. data/app/packs/src/decidim/map/provider/here.js +1 -1
  178. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  179. data/app/packs/src/decidim/session_timeouter.js +1 -1
  180. data/app/packs/src/decidim/sticky_footer.js +29 -0
  181. data/app/packs/src/decidim/sticky_header.js +6 -31
  182. data/app/packs/src/decidim/user_registrations.js +13 -0
  183. data/app/packs/src/decidim/utilities/dom.js +148 -0
  184. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +212 -0
  185. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  186. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  187. data/app/packs/stylesheets/decidim/_cards.scss +1 -1
  188. data/app/packs/stylesheets/decidim/_content_blocks.scss +0 -4
  189. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  190. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  191. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  192. data/app/packs/stylesheets/decidim/_header.scss +37 -60
  193. data/app/packs/stylesheets/decidim/_layout.scss +32 -2
  194. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  195. data/app/packs/stylesheets/decidim/_modal.scss +42 -0
  196. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  197. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  198. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  199. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  200. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  201. data/app/packs/stylesheets/decidim/application.scss +1 -1
  202. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  203. data/app/packs/stylesheets/decidim/map.scss +7 -10
  204. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  205. data/app/permissions/decidim/default_permissions.rb +0 -2
  206. data/app/permissions/decidim/permissions.rb +8 -2
  207. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  208. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  209. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  210. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  211. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  212. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  213. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  214. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  215. data/app/presenters/decidim/log/user_presenter.rb +0 -1
  216. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  217. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  218. data/app/presenters/decidim/notification_to_mailer_presenter.rb +3 -7
  219. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  220. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  221. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  222. data/app/presenters/decidim/user_presenter.rb +1 -1
  223. data/app/queries/decidim/last_activity.rb +0 -25
  224. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  225. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  226. data/app/queries/decidim/public_activities.rb +1 -12
  227. data/app/queries/decidim/stats_users_count.rb +2 -2
  228. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  229. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  230. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  231. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  232. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  233. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  234. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  235. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  236. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  237. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  238. data/app/services/decidim/action_authorizer.rb +32 -3
  239. data/app/services/decidim/base_diff_renderer.rb +1 -3
  240. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  241. data/app/services/decidim/onboarding_manager.rb +272 -0
  242. data/app/services/decidim/open_data_exporter.rb +139 -13
  243. data/app/services/decidim/static_map_generator.rb +1 -1
  244. data/app/services/decidim/traceability.rb +13 -0
  245. data/app/uploaders/decidim/application_uploader.rb +1 -1
  246. data/app/validators/etiquette_validator.rb +9 -2
  247. data/app/validators/passthru_validator.rb +1 -1
  248. data/app/validators/translated_etiquette_validator.rb +32 -0
  249. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  250. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  251. data/app/views/decidim/application/_collection.html.erb +30 -18
  252. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  253. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  254. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  255. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  256. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  257. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  258. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  259. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  260. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  261. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  262. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  263. data/app/views/decidim/last_activities/index.html.erb +1 -1
  264. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +2 -1
  265. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  266. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  267. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  268. data/app/views/decidim/open_data/index.html.erb +108 -0
  269. data/app/views/decidim/pages/show.html.erb +2 -1
  270. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  271. data/app/views/decidim/reported_mailer/hide.html.erb +9 -0
  272. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  273. data/app/views/decidim/searches/_count.html.erb +1 -1
  274. data/app/views/decidim/searches/_filters.html.erb +38 -40
  275. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  276. data/app/views/decidim/shared/_orders.html.erb +2 -2
  277. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  278. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  279. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  280. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  281. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  282. data/app/views/kaminari/decidim/_page.html.erb +1 -1
  283. data/app/views/kaminari/decidim/_paginator.html.erb +1 -1
  284. data/app/views/layouts/decidim/_application.html.erb +0 -1
  285. data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
  286. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  287. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  288. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  289. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  290. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  291. data/app/views/layouts/decidim/footer/_main_legal.html.erb +1 -1
  292. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  293. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  294. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  295. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  296. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +11 -5
  297. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +5 -5
  298. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  299. data/config/assets.rb +2 -1
  300. data/config/locales/ar.yml +35 -74
  301. data/config/locales/bg.yml +33 -74
  302. data/config/locales/bs-BA.yml +0 -2
  303. data/config/locales/ca.yml +370 -102
  304. data/config/locales/cs.yml +374 -102
  305. data/config/locales/de.yml +350 -88
  306. data/config/locales/el.yml +22 -58
  307. data/config/locales/en.yml +350 -82
  308. data/config/locales/eo.yml +0 -4
  309. data/config/locales/es-MX.yml +364 -99
  310. data/config/locales/es-PY.yml +369 -104
  311. data/config/locales/es.yml +370 -102
  312. data/config/locales/eu.yml +426 -156
  313. data/config/locales/fi-plain.yml +366 -76
  314. data/config/locales/fi.yml +370 -77
  315. data/config/locales/fr-CA.yml +176 -97
  316. data/config/locales/fr.yml +176 -94
  317. data/config/locales/ga-IE.yml +4 -25
  318. data/config/locales/gl.yml +20 -58
  319. data/config/locales/hu.yml +30 -62
  320. data/config/locales/id-ID.yml +21 -57
  321. data/config/locales/is-IS.yml +5 -25
  322. data/config/locales/it.yml +36 -94
  323. data/config/locales/ja.yml +231 -112
  324. data/config/locales/lb.yml +28 -76
  325. data/config/locales/lt.yml +24 -64
  326. data/config/locales/lv.yml +21 -58
  327. data/config/locales/nl.yml +23 -75
  328. data/config/locales/no.yml +23 -70
  329. data/config/locales/pl.yml +30 -72
  330. data/config/locales/pt-BR.yml +41 -63
  331. data/config/locales/pt.yml +23 -70
  332. data/config/locales/ro-RO.yml +115 -184
  333. data/config/locales/ru.yml +13 -43
  334. data/config/locales/sk.yml +24 -70
  335. data/config/locales/sl.yml +0 -4
  336. data/config/locales/sr-CS.yml +0 -2
  337. data/config/locales/sv.yml +138 -106
  338. data/config/locales/tr-TR.yml +29 -75
  339. data/config/locales/uk.yml +6 -29
  340. data/config/locales/zh-CN.yml +21 -68
  341. data/config/locales/zh-TW.yml +23 -62
  342. data/config/routes.rb +4 -10
  343. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  344. data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
  345. data/db/migrate/20180706104107_add_nickname_to_managed_users.rb +1 -1
  346. data/db/migrate/20181001124950_move_users_groups_to_users_table.rb +1 -1
  347. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  348. data/db/migrate/20190412131728_fix_user_names.rb +1 -1
  349. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  350. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  351. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  352. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  353. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  354. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  355. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  356. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  357. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  358. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  359. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  360. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  361. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  362. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  363. data/decidim-core.gemspec +14 -17
  364. data/lib/decidim/action_authorization.rb +3 -2
  365. data/lib/decidim/amendable.rb +1 -1
  366. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  367. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  368. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  369. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  370. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  371. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  372. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  373. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  374. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  375. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  376. data/lib/decidim/api/types/amendment_type.rb +5 -7
  377. data/lib/decidim/api/types/area_api_type.rb +3 -3
  378. data/lib/decidim/api/types/attachment_type.rb +3 -3
  379. data/lib/decidim/api/types/category_type.rb +2 -2
  380. data/lib/decidim/api/types/decidim_type.rb +5 -1
  381. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  382. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  383. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  384. data/lib/decidim/api/types/metric_type.rb +1 -1
  385. data/lib/decidim/api/types/organization_type.rb +5 -0
  386. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  387. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  388. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  389. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  390. data/lib/decidim/api/types/session_type.rb +1 -2
  391. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  392. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  393. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  394. data/lib/decidim/api/types/user_group_type.rb +7 -20
  395. data/lib/decidim/api/types/user_type.rb +7 -20
  396. data/lib/decidim/asset_router/storage.rb +6 -11
  397. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +2 -1
  398. data/lib/decidim/attachment_attributes.rb +1 -1
  399. data/lib/decidim/attribute_encryptor.rb +1 -1
  400. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  401. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  402. data/lib/decidim/attributes/time_with_zone.rb +1 -5
  403. data/lib/decidim/attributes.rb +2 -0
  404. data/lib/decidim/authorization_form_builder.rb +0 -7
  405. data/lib/decidim/coauthorable.rb +1 -1
  406. data/lib/decidim/command.rb +3 -3
  407. data/lib/decidim/commands/destroy_resource.rb +5 -1
  408. data/lib/decidim/commands/resource_handler.rb +2 -2
  409. data/lib/decidim/commands/restore_resource.rb +45 -0
  410. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  411. data/lib/decidim/component_manifest.rb +7 -0
  412. data/lib/decidim/content_parsers/blob_parser.rb +8 -10
  413. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  414. data/lib/decidim/core/api.rb +2 -0
  415. data/lib/decidim/core/engine.rb +21 -7
  416. data/lib/decidim/core/menu.rb +0 -5
  417. data/lib/decidim/core/seeds.rb +42 -2
  418. data/lib/decidim/core/test/factories.rb +105 -2
  419. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  420. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  421. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  422. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  423. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  424. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  425. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  426. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  427. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  428. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  429. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  430. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  431. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  432. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  433. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  434. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  435. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  436. data/lib/decidim/core/test/shared_examples/reports_examples.rb +15 -53
  437. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  438. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  439. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  440. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  441. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +7 -14
  442. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  443. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  444. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  445. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  446. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  447. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  448. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +0 -26
  449. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -28
  450. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  451. data/lib/decidim/core/test.rb +9 -5
  452. data/lib/decidim/core/version.rb +1 -1
  453. data/lib/decidim/core.rb +58 -0
  454. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  455. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  456. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  457. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  458. data/lib/decidim/download_your_data_serializers.rb +19 -0
  459. data/lib/decidim/exporters/csv.rb +6 -0
  460. data/lib/decidim/exporters/export_manifest.rb +14 -0
  461. data/lib/decidim/exporters/pdf.rb +26 -22
  462. data/lib/decidim/filter_form_builder.rb +12 -15
  463. data/lib/decidim/form_builder.rb +6 -129
  464. data/lib/decidim/has_category.rb +5 -1
  465. data/lib/decidim/has_private_users.rb +4 -0
  466. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  467. data/lib/decidim/has_upload_validations.rb +1 -1
  468. data/lib/decidim/legacy_form_builder.rb +118 -0
  469. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  470. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  471. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  472. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  473. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  474. data/lib/decidim/maintenance/import_models/category.rb +107 -0
  475. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  476. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  477. data/lib/decidim/maintenance/import_models.rb +19 -0
  478. data/lib/decidim/maintenance/taxonomy_importer.rb +132 -0
  479. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  480. data/lib/decidim/maintenance.rb +12 -0
  481. data/lib/decidim/map/autocomplete.rb +52 -8
  482. data/lib/decidim/map/dynamic_map.rb +1 -1
  483. data/lib/decidim/map/provider/dynamic_map/here.rb +40 -1
  484. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  485. data/lib/decidim/map/provider/static_map/here.rb +0 -34
  486. data/lib/decidim/map.rb +3 -6
  487. data/lib/decidim/moderation_tools.rb +16 -19
  488. data/lib/decidim/newsletter_encryptor.rb +1 -1
  489. data/lib/decidim/nicknamizable.rb +9 -6
  490. data/lib/decidim/paddable.rb +1 -1
  491. data/lib/decidim/participable.rb +10 -10
  492. data/lib/decidim/participatory_space_user.rb +10 -0
  493. data/lib/decidim/private_download_helper.rb +15 -0
  494. data/lib/decidim/record_encryptor.rb +51 -46
  495. data/lib/decidim/reportable.rb +2 -6
  496. data/lib/decidim/resourceable.rb +16 -0
  497. data/lib/decidim/seeds.rb +18 -20
  498. data/lib/decidim/settings_manifest.rb +34 -1
  499. data/lib/decidim/soft_deletable.rb +17 -0
  500. data/lib/decidim/taxonomizable.rb +72 -0
  501. data/lib/decidim/translatable_attributes.rb +1 -5
  502. data/lib/decidim/view_model.rb +0 -1
  503. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  504. data/lib/tasks/decidim_procfile.rake +6 -0
  505. data/lib/tasks/decidim_tasks.rake +1 -0
  506. data/lib/tasks/decidim_taxonomies.rake +155 -0
  507. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  508. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  509. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +20 -23
  510. data/lib/tasks/upgrade/migrations.rake +91 -0
  511. metadata +203 -112
  512. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  513. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  514. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  515. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  516. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  517. data/app/cells/decidim/report_user_button/already_reported_modal.erb +0 -11
  518. data/app/cells/decidim/report_user_button/flag_modal.erb +0 -46
  519. data/app/cells/decidim/report_user_button/show.erb +0 -2
  520. data/app/cells/decidim/report_user_button_cell.rb +0 -59
  521. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  522. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  523. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  524. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  525. data/app/commands/decidim/update_user_interests.rb +0 -41
  526. data/app/controllers/decidim/scopes_controller.rb +0 -84
  527. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  528. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  529. data/app/forms/decidim/user_interests_form.rb +0 -17
  530. data/app/helpers/decidim/categories_helper.rb +0 -26
  531. data/app/helpers/decidim/scopes_helper.rb +0 -105
  532. data/app/jobs/decidim/hide_child_resources_job.rb +0 -24
  533. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  534. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  535. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  536. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  537. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  538. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  539. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  540. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  541. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  542. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  543. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  544. data/app/views/decidim/reported_mailer/hidden_automatically.html.erb +0 -25
  545. data/app/views/decidim/reported_mailer/hidden_manually.html.erb +0 -25
  546. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  547. data/app/views/decidim/scopes/picker.html.erb +0 -53
  548. data/app/views/decidim/shared/_comments.html.erb +0 -0
  549. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  550. data/app/views/decidim/shared/_tags.html.erb +0 -1
  551. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  552. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  553. data/app/views/decidim/user_interests/show.html.erb +0 -22
  554. data/config/initializers/foundation_rails_helper.rb +0 -4
  555. data/config/locales/ca-IT.yml +0 -2122
  556. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  557. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  558. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  559. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  560. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  561. data/lib/decidim/seven_zip_wrapper.rb +0 -29
  562. data/lib/tasks/upgrade/clean_hidden_resources.rake +0 -33
@@ -9,6 +9,7 @@ module Decidim
9
9
  # used in filters that uses checkboxes trees
10
10
  def check_boxes_tree_options(value, label, **options)
11
11
  parent_id = options.delete(:parent_id) || ""
12
+ object = options.delete(:object)
12
13
  checkbox_options = {
13
14
  value:,
14
15
  label:,
@@ -16,10 +17,16 @@ module Decidim
16
17
  include_hidden: false,
17
18
  label_options: {
18
19
  "data-children-checkbox": parent_id,
19
- value:
20
+ value:,
21
+ for: "#{options[:namespace]}_#{options[:id]}"
20
22
  }
21
23
  }
22
24
  options.merge!(checkbox_options)
25
+ # as taxonomies work with a nested array of values, we need to manually check if the value is checked
26
+ matches = options[:id]&.match(/^with_any_taxonomies_([0-9]+)__taxonomy-([0-9_]+)/)
27
+ if matches.present? && object.respond_to?(:with_any_taxonomies) && object.with_any_taxonomies&.dig(matches[1]).is_a?(Array)
28
+ options[:checked] = object.with_any_taxonomies[matches[1]].include?(value.to_s)
29
+ end
23
30
 
24
31
  if options.delete(:is_root_check_box) == true
25
32
  options[:label_options].merge!("data-global-checkbox": "")
@@ -37,10 +44,14 @@ module Decidim
37
44
  end
38
45
 
39
46
  # struct for leafs of checkboxes trees
40
- TreePoint = Struct.new(:value, :label) do
47
+ TreePoint = Struct.new(:value, :label, :root) do
41
48
  def tree_node?
42
49
  is_a?(TreeNode)
43
50
  end
51
+
52
+ def root?
53
+ root.present? || value.blank?
54
+ end
44
55
  end
45
56
 
46
57
  # Overwrite this method in your component helper to define
@@ -49,52 +60,29 @@ module Decidim
49
60
  raise StandardError, "Not implemented"
50
61
  end
51
62
 
52
- def filter_categories_values
53
- sorted_main_categories = current_participatory_space.categories.first_class.includes(:subcategories).sort_by do |category|
54
- [category.weight, decidim_escape_translated(category.name)]
55
- end
56
-
57
- categories_values = sorted_main_categories.flat_map do |category|
58
- sorted_descendant_categories = category.descendants.includes(:subcategories).sort_by do |subcategory|
59
- [subcategory.weight, decidim_escape_translated(subcategory.name)]
60
- end
61
-
62
- subcategories = sorted_descendant_categories.flat_map do |subcategory|
63
- TreePoint.new(subcategory.id.to_s, decidim_escape_translated(subcategory.name))
64
- end
65
-
66
- TreeNode.new(
67
- TreePoint.new(category.id.to_s, decidim_escape_translated(category.name)),
68
- subcategories
69
- )
70
- end
71
-
63
+ def filter_taxonomy_values_for(taxonomy_filter)
64
+ taxonomies = filter_taxonomy_values_children(taxonomy_filter.taxonomies)
72
65
  TreeNode.new(
73
- TreePoint.new("", t("decidim.core.application_helper.filter_category_values.all")),
74
- categories_values
66
+ TreePoint.new(taxonomy_filter.root_taxonomy_id, t("decidim.core.application_helper.filter_taxonomy_values.all"), true),
67
+ taxonomies
75
68
  )
76
69
  end
77
70
 
78
- def resource_filter_scope_values(resource)
79
- if resource.is_a?(Scope)
80
- filter_scopes_values_from([resource], current_participatory_space)
81
- else
82
- filter_scopes_values
71
+ def filter_taxonomy_values_children(children)
72
+ children.map do |id, hash|
73
+ TreeNode.new(
74
+ TreePoint.new(id, decidim_escape_translated(hash[:taxonomy].name).html_safe),
75
+ filter_taxonomy_values_children(hash[:children])
76
+ )
83
77
  end
84
78
  end
85
79
 
86
- def filter_scopes_values
87
- return filter_scopes_values_from_parent(current_component.scope) if current_component.scope.present?
88
-
89
- main_scopes = current_participatory_space.scopes.top_level
90
- .includes(:scope_type, :children)
91
- filter_scopes_values_from(main_scopes, current_participatory_space)
92
- end
93
-
80
+ # pending initiatives removal
94
81
  def filter_global_scopes_values
95
82
  filter_scopes_values_from(current_organization.scopes.top_level)
96
83
  end
97
84
 
85
+ # pending initiatives removal
98
86
  def filter_areas_values
99
87
  areas_or_types = areas_for_select(current_organization)
100
88
 
@@ -135,22 +123,6 @@ module Decidim
135
123
 
136
124
  private
137
125
 
138
- def filter_scopes_values_from_parent(scope)
139
- scopes_values = []
140
- scope.children.each do |child|
141
- unless child.children
142
- scopes_values << TreePoint.new(child.id.to_s, translated_attribute(child.name, current_participatory_space.organization))
143
- next
144
- end
145
- scopes_values << TreeNode.new(
146
- TreePoint.new(child.id.to_s, translated_attribute(child.name, current_participatory_space.organization)),
147
- scope_children_to_tree(child, current_participatory_space)
148
- )
149
- end
150
-
151
- filter_tree_from(scopes_values)
152
- end
153
-
154
126
  def filter_scopes_values_from(scopes, participatory_space = nil)
155
127
  scopes_values = scopes.compact.flat_map do |scope|
156
128
  TreeNode.new(
@@ -62,35 +62,6 @@ module Decidim
62
62
  end
63
63
  end
64
64
 
65
- # A custom helper to include a scope picker field without requiring a form
66
- # object
67
- #
68
- # name - The input name
69
- # value - The input value as a scope id
70
- # options - The set of options to send to the field
71
- # :id - The id to generate for the element (optional)
72
- #
73
- # Returns a scopes picker tag to be included in an html template.
74
- def scopes_picker_field_tag(name, value, id: nil)
75
- picker_options = {
76
- id: id || sanitize_to_id(name),
77
- class: "picker-single",
78
- name:
79
- }
80
-
81
- prompt_params = yield(nil)
82
- selected_scopes = value ? Decidim::Scope.where(id: value) : []
83
- scopes = selected_scopes.map { |scope| [scope, yield(scope)] }
84
-
85
- template = ""
86
- template += render("decidim/scopes/scopes_picker_input",
87
- picker_options:,
88
- prompt_params:,
89
- scopes:,
90
- values_on_top: true)
91
- template.html_safe
92
- end
93
-
94
65
  # A custom helper to include a translated field without requiring a form object.
95
66
  #
96
67
  # type - The type of the translated input field.
@@ -220,20 +191,5 @@ module Decidim
220
191
 
221
192
  organization.area_types
222
193
  end
223
-
224
- def ordered_scopes_descendants(root = nil)
225
- root = try(:current_participatory_space)&.scope if root == false
226
- if root.present?
227
- root.descendants
228
- else
229
- current_organization.scopes
230
- end.sort { |a, b| a.part_of.reverse <=> b.part_of.reverse }
231
- end
232
-
233
- def ordered_scopes_descendants_for_select(root = nil)
234
- ordered_scopes_descendants(root).map do |scope|
235
- [" #{"&nbsp;" * 4 * (scope.part_of.count - 1)} #{translated_attribute(scope.name)}".html_safe, scope&.id]
236
- end
237
- end
238
194
  end
239
195
  end
@@ -3,16 +3,6 @@
3
3
  module Decidim
4
4
  # A Helper for views with Endorsable resources.
5
5
  module EndorsableHelper
6
- # Invokes the decidim/endorsement_buttons cell.
7
- def endorsement_buttons_cell(resource)
8
- cell("decidim/endorsement_block", resource)
9
- end
10
-
11
- # Invokes the decidim/endorsers_list cell.
12
- def endorsers_list_cell(resource)
13
- cell("decidim/endorsers_list", resource)
14
- end
15
-
16
6
  #
17
7
  # Public: Checks if the given resource has been endorsed by all identities of the user.
18
8
  #
@@ -154,6 +154,12 @@ module Decidim
154
154
  "#{request.base_url}#{"?#{params.to_query}" unless params.empty?}"
155
155
  end
156
156
 
157
+ def root_url
158
+ return onboarding_manager.root_path if current_user&.ephemeral?
159
+
160
+ decidim.root_url(host: current_organization.host)
161
+ end
162
+
157
163
  private
158
164
 
159
165
  def each_decidim_engine
@@ -39,7 +39,7 @@ module Decidim
39
39
  @breadcrumb_root_menu ||= ::Decidim::BreadcrumbRootMenuPresenter.new(
40
40
  :menu,
41
41
  self,
42
- container_options: { class: "menu-bar__dropdown-menu" }
42
+ container_options: { class: "menu-bar__main-dropdown__menu" }
43
43
  )
44
44
  end
45
45
 
@@ -47,7 +47,7 @@ module Decidim
47
47
  @mobile_breadcrumb_root_menu ||= ::Decidim::BreadcrumbRootMenuPresenter.new(
48
48
  :mobile_menu,
49
49
  self,
50
- container_options: { class: "menu-bar__main-dropdown__top-menu" }
50
+ container_options: { class: "menu-bar__main-dropdown__menu" }
51
51
  )
52
52
  end
53
53
 
@@ -29,10 +29,9 @@ module Decidim
29
29
  # Generates a visualization of users for listing conversations threads
30
30
  #
31
31
  def username_list(users, shorten: false)
32
- content_tags = []
33
32
  first_users = shorten ? users.first(3) : users
34
- first_users.each do |u|
35
- content_tags.push(u.deleted? ? t("decidim.profile.deleted") : u.name)
33
+ content_tags = first_users.map do |u|
34
+ u.deleted? ? t("decidim.profile.deleted") : u.name
36
35
  end
37
36
 
38
37
  return content_tags.join(", ") unless shorten
@@ -8,6 +8,7 @@ module Decidim
8
8
  # the other methods to see how they work.
9
9
  #
10
10
  # @param [Hash] tags - A Hash containing the meta tag name as keys and its content as values.
11
+ # @param [Object, nil] resource - The resource object that may contain the image.
11
12
  #
12
13
  # @return [nil]
13
14
  def add_decidim_meta_tags(tags)
@@ -15,33 +16,31 @@ module Decidim
15
16
  add_decidim_meta_description(tags[:description])
16
17
  add_decidim_meta_url(tags[:url])
17
18
  add_decidim_meta_twitter_handler(tags[:twitter_handler])
18
- add_decidim_meta_image_url(add_base_url_to(tags[:image_url]))
19
+ image_url = tags[:image_url].presence || resolve_meta_image_url(tags[:resource])
20
+ add_decidim_meta_image_url(add_base_url_to(image_url)) if image_url.present?
19
21
  end
20
22
 
21
- # Add base url to path if path does not include host.
23
+ # Adds base URL to the given path if it does not include a host.
22
24
  #
23
- # @parma [String] path - A String containing path (e.g. "/proposals/1" )
25
+ # @param [String] path - A String containing the path (e.g. "/proposals/1").
24
26
  #
25
- # @return [String] - a String of URL including base URL and path, or path if it is blank.
27
+ # @return [String] - A String with the base URL and path, or the original path if it already includes a host.
26
28
  def add_base_url_to(path)
27
- return path if path.blank?
28
- return path if URI.parse(path).host.present?
29
+ return path if path.blank? || URI.parse(path).host.present?
29
30
 
30
31
  "#{resolve_base_url}#{path}"
31
32
  end
32
33
 
33
- # Resolve base url (example: https://www.decidim.org) without url params
34
+ # Resolves the base URL (example: https://www.decidim.org) without URL parameters.
34
35
  #
35
- # @return [String] - a String of base URL
36
+ # @return [String] - A String of the base URL.
36
37
  def resolve_base_url
37
38
  return request.base_url if respond_to?(:request) && request&.base_url.present?
38
39
 
39
40
  uri = URI.parse(decidim.root_url(host: current_organization.host))
40
- if uri.port.blank? || [80, 443].include?(uri.port)
41
- "#{uri.scheme}://#{uri.host}"
42
- else
43
- "#{uri.scheme}://#{uri.host}:#{uri.port}"
44
- end
41
+ port = uri.port.present? && [80, 443].exclude?(uri.port) ? ":#{uri.port}" : ""
42
+
43
+ "#{uri.scheme}://#{uri.host}#{port}"
45
44
  end
46
45
 
47
46
  # Accumulates the given `title` so that they can be chained. Since Rails views
@@ -60,22 +59,20 @@ module Decidim
60
59
  # @return [Array<String>]
61
60
  def add_decidim_page_title(title)
62
61
  @decidim_page_title ||= []
63
- return @decidim_page_title if title.blank?
64
-
65
- @decidim_page_title << title
62
+ @decidim_page_title << title if title.present?
63
+ @decidim_page_title
66
64
  end
67
65
 
68
66
  # Renders the title for a page. Use the `add_decidim_page_title` method to
69
67
  # accumulate elements for the title. Basically, it joins the elements of the title
70
68
  # array with `" - "`.
71
69
  #
72
- # @return [String]
70
+ # @return [String] - The concatenated title.
73
71
  def decidim_page_title
74
72
  (@decidim_page_title || []).join(" - ")
75
73
  end
76
74
 
77
- attr_reader :decidim_meta_description, :decidim_meta_url, :decidim_meta_image_url,
78
- :decidim_meta_twitter_handler
75
+ attr_reader :decidim_meta_description, :decidim_meta_url, :decidim_meta_image_url, :decidim_meta_twitter_handler
79
76
 
80
77
  # Sets the meta description for the current page. We want to keep the most specific
81
78
  # one, so you cannot replace the description if it is set by a view that has already
@@ -83,7 +80,7 @@ module Decidim
83
80
  # is the last one to be rendered. You can put there a basic content and override it
84
81
  # in other layers.
85
82
  #
86
- # @param [String] description - The String to be set as description
83
+ # @param [String] description - The String to be set as description.
87
84
  #
88
85
  # @return [nil]
89
86
  def add_decidim_meta_description(description)
@@ -96,7 +93,7 @@ module Decidim
96
93
  # is the last one to be rendered. You can put there a basic content and override it
97
94
  # in other layers.
98
95
  #
99
- # @param [String] twitter_handler - The String to be set as Twitter handler
96
+ # @param [String] twitter_handler - The String to be set as Twitter handler.
100
97
  #
101
98
  # @return [nil]
102
99
  def add_decidim_meta_twitter_handler(twitter_handler)
@@ -109,7 +106,7 @@ module Decidim
109
106
  # is the last one to be rendered. You can put there a basic content and override it
110
107
  # in other layers.
111
108
  #
112
- # @param [String] url - The String to be set as URL
109
+ # @param [String] url - The String to be set as URL.
113
110
  #
114
111
  # @return [nil]
115
112
  def add_decidim_meta_url(url)
@@ -122,11 +119,23 @@ module Decidim
122
119
  # is the last one to be rendered. You can put there a basic content and override it
123
120
  # in other layers.
124
121
  #
125
- # @param [String] image_url - The String to be set as image URL
122
+ # @param [String] image_url - The String to be set as image URL.
126
123
  #
127
124
  # @return [nil]
128
125
  def add_decidim_meta_image_url(image_url)
129
126
  @decidim_meta_image_url ||= image_url
130
127
  end
128
+
129
+ # Resolves the image URL to be used for meta tags.
130
+ # This method creates a new instance of MetaImageUrlResolver,
131
+ # which handles the logic for determining the most appropriate image URL.
132
+ #
133
+ # @param [Object, nil] resource - The resource object that may contain the image.
134
+ #
135
+ # @return [String, nil] - The resolved image URL, or nil if no appropriate image URL is found.
136
+ def resolve_meta_image_url(resource)
137
+ url = MetaImageUrlResolver.new(resource, current_organization).resolve
138
+ add_base_url_to(url) if url.present?
139
+ end
131
140
  end
132
141
  end
@@ -34,5 +34,28 @@ module Decidim
34
34
  end
35
35
  end
36
36
  end
37
+
38
+ def decidim_drawer(opts = {}, &)
39
+ opts[:closable] = true unless opts.has_key?(:closable)
40
+
41
+ button = if opts[:closable] == false
42
+ ""
43
+ else
44
+ content_tag(
45
+ :button,
46
+ "&times".html_safe,
47
+ type: :button,
48
+ data: { dialog_close: opts[:id] || "", dialog_closable: "" },
49
+ "aria-label": t("close_modal", scope: "decidim.shared.confirm_modal")
50
+ )
51
+ end
52
+
53
+ content = opts[:remote].nil? ? button + capture(&).html_safe : button + icon("loader-3-line")
54
+ content_tag(:div, id: opts[:id], data: { dialog: opts[:id] || "", drawer: true }.merge(opts[:data] || {})) do
55
+ content_tag(:div, id: "#{opts[:id]}-content", class: opts[:class]) do
56
+ content
57
+ end
58
+ end
59
+ end
37
60
  end
38
61
  end
@@ -13,17 +13,17 @@ module Decidim
13
13
 
14
14
  # Public: icon for omniauth buttons
15
15
  def oauth_icon(provider)
16
- info = current_organization.enabled_omniauth_providers[provider.to_sym]
16
+ provider_info = current_organization.enabled_omniauth_providers[provider.to_sym]
17
17
 
18
18
  name = normalize_provider_name(provider)
19
19
  name = "twitter-x" if provider == :twitter
20
20
  name = "#{name}-fill"
21
21
 
22
- if info
23
- icon_path = info[:icon_path]
24
- return external_icon(icon_path) if icon_path
22
+ if provider_info
23
+ icon_path = provider_info[:icon_path] || Rails.application.secrets.omniauth[provider][:icon_path].presence
24
+ return external_icon(icon_path) if icon_path.present?
25
25
 
26
- name = info[:icon] if info[:icon]
26
+ name = provider_info[:icon] if provider_info[:icon]
27
27
  end
28
28
 
29
29
  icon(name)
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A helper to display onboarding action message
5
+ module OnboardingActionHelper
6
+ def display_onboarding_action_message(user)
7
+ return if user.blank?
8
+ return unless pending_onboarding_action?(user)
9
+
10
+ cell("decidim/onboarding_action_message", user)
11
+ end
12
+ end
13
+ end
@@ -13,8 +13,7 @@ module Decidim
13
13
  def order_selector(orders, options = {})
14
14
  render partial: "decidim/shared/orders", locals: {
15
15
  orders:,
16
- i18n_scope: options[:i18n_scope],
17
- css_class: options[:css_class]
16
+ i18n_scope: options[:i18n_scope]
18
17
  }
19
18
  end
20
19
 
@@ -13,7 +13,7 @@ module Decidim
13
13
 
14
14
  per_page = (params[:per_page] || paginate_params[:per_page] || Decidim::Paginable::OPTIONS.first).to_i
15
15
 
16
- content_tag :div, class: "flex flex-col-reverse md:flex-row items-center justify-between gap-1 py-8 md:py-16 md:flex-wrap", data: { pagination: "" } do
16
+ content_tag :div, class: "flex flex-col-reverse md:flex-row items-center justify-between gap-1 py-8 md:py-16", data: { pagination: "" } do
17
17
  template = ""
18
18
  template += render(partial: "decidim/shared/results_per_page", locals: { per_page: }, formats: [:html]) if collection.total_pages.positive?
19
19
  template += paginate collection, window: 2, outer_window: 1, theme: "decidim", params: paginate_params
@@ -28,7 +28,7 @@ module Decidim
28
28
  end
29
29
 
30
30
  def participatory_space_floating_help
31
- return if help_section.blank? || strip_tags(translated_attribute(help_section).html_safe).blank?
31
+ return if help_section.blank?
32
32
 
33
33
  floating_help(help_id) { translated_attribute(help_section).html_safe }
34
34
  end
@@ -30,7 +30,7 @@ module Decidim
30
30
  value: @account&.password,
31
31
  minlength: min_length,
32
32
  maxlength: ::PasswordValidator::MAX_LENGTH,
33
- placeholder: "••••••"
33
+ placeholder: "**********"
34
34
  }
35
35
  end
36
36
 
@@ -42,7 +42,7 @@ module Decidim
42
42
  required: true,
43
43
  label: false,
44
44
  help_text:,
45
- placeholder: "••••••"
45
+ placeholder: "**********"
46
46
  }
47
47
  end
48
48
 
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A Helper to render taxonomies for forms.
5
+ module TaxonomiesHelper
6
+ include DecidimFormHelper
7
+ include TranslatableAttributes
8
+
9
+ def filter_taxonomy_items_select_field(form, name, filter, options = {})
10
+ label = decidim_sanitize_translated(filter.name)
11
+ options = options.merge(include_blank: I18n.t("decidim.taxonomies.prompt")) unless options.has_key?(:include_blank)
12
+ options = options.merge(label:) unless options.has_key?(:label)
13
+ form.select(
14
+ name,
15
+ taxonomy_items_options_for_filter(filter),
16
+ options,
17
+ { name: "#{form.object_name}[#{name}][]", id: "#{name}-#{filter.id}" }
18
+ )
19
+ end
20
+
21
+ def taxonomy_items_options_for_filter(filter)
22
+ @taxonomy_items_options_for_filter ||= {}
23
+ @taxonomy_items_options_for_filter[filter.id] ||= begin
24
+ min_parent_count = filter.taxonomies.values.min_by { |item| item[:taxonomy].parent_ids.count }
25
+ first_parent_level = (min_parent_count && min_parent_count[:taxonomy].parent_ids.count) || 1
26
+ taxonomy_items_options_for_taxonomies_tree(filter.taxonomies, first_parent_level)
27
+ end
28
+ end
29
+
30
+ def taxonomy_items_options_for_taxonomies_tree(taxonomies_tree, first_parent_level = 1)
31
+ options = []
32
+ taxonomies_tree.each do |id, item|
33
+ name = " #{"&nbsp;" * 4 * (item[:taxonomy].parent_ids.count - first_parent_level)} #{decidim_sanitize_translated(item[:taxonomy].name)}".html_safe
34
+ options.append([name, id])
35
+ options.concat(taxonomy_items_options_for_taxonomies_tree(item[:children], first_parent_level)) if item[:children].any?
36
+ end
37
+ options
38
+ end
39
+ end
40
+ end
@@ -5,10 +5,7 @@ module Decidim
5
5
  # on the layout.
6
6
  module TooltipHelper
7
7
  def with_tooltip(title, opts = {}, &)
8
- content_tag(:p,
9
- title:,
10
- class: "inline-block",
11
- data: { tooltip: content_tag(:p, title, id: opts[:id], class: opts[:class] || "bottom", role: "tooltip", "aria-hidden": "true") }) do
8
+ content_tag(:span, title:, data: { tooltip: content_tag(:div, title, id: opts[:id], class: opts[:class] || "bottom", role: "tooltip", "aria-hidden": "true") }) do
12
9
  capture(&).html_safe
13
10
  end
14
11
  end
@@ -5,25 +5,8 @@ module Decidim
5
5
  queue_as :default
6
6
 
7
7
  def perform(user, export_format = ::Decidim::DownloadYourDataExporter::DEFAULT_EXPORT_FORMAT)
8
- filename = "#{SecureRandom.urlsafe_base64}.zip"
9
- path = Rails.root.join("tmp/#{filename}")
10
- password = SecureRandom.urlsafe_base64
11
-
12
- generate_zip_file(user, path, password, export_format)
13
- save_or_upload_file(user, path)
14
- # Deletes temporary file
15
- File.delete(path)
16
- ExportMailer.download_your_data_export(user, filename, password).deliver_later
17
- end
18
-
19
- private
20
-
21
- def generate_zip_file(user, path, password, export_format)
22
- DownloadYourDataExporter.new(user, path, password, export_format).export
23
- end
24
-
25
- def save_or_upload_file(user, path)
26
- user.download_your_data_file.attach(io: File.open(path, "rb"), filename: File.basename(path))
8
+ @export = DownloadYourDataExporter.new(user, "download_your_data", export_format).export
9
+ ExportMailer.download_your_data_export(user, @export).deliver_later
27
10
  end
28
11
  end
29
12
  end
@@ -4,21 +4,26 @@ module Decidim
4
4
  class EventPublisherJob < ApplicationJob
5
5
  queue_as :events
6
6
 
7
- attr_reader :resource
7
+ attr_reader :resource, :data
8
8
 
9
9
  def perform(event_name, data)
10
10
  @resource = data[:resource]
11
+ @data = data
11
12
 
12
13
  return unless data[:force_send] || notifiable?
13
14
 
14
- EmailNotificationGeneratorJob.perform_later(
15
- event_name,
16
- data[:event_class],
17
- data[:resource],
18
- data[:followers],
19
- data[:affected_users],
20
- data[:extra]
21
- )
15
+ if event_type.include?(:email)
16
+ EmailNotificationGeneratorJob.perform_later(
17
+ event_name,
18
+ data[:event_class],
19
+ data[:resource],
20
+ data[:followers],
21
+ data[:affected_users],
22
+ data[:extra]
23
+ )
24
+ end
25
+
26
+ return unless event_type.include?(:notification)
22
27
 
23
28
  NotificationGeneratorJob.perform_later(
24
29
  event_name,
@@ -32,6 +37,10 @@ module Decidim
32
37
 
33
38
  private
34
39
 
40
+ def event_type
41
+ (data[:event_class].presence && data[:event_class].safe_constantize&.types) || []
42
+ end
43
+
35
44
  # Whether this event should be notified or not. Useful when you want the
36
45
  # event to decide based on the params.
37
46
  #
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  class ExportJob < ApplicationJob
5
+ include Decidim::PrivateDownloadHelper
6
+
5
7
  queue_as :exports
6
8
 
7
9
  # rubocop:disable Metrics/ParameterLists
@@ -16,7 +18,9 @@ module Decidim
16
18
 
17
19
  export_data = Decidim::Exporters.find_exporter(format).new(collection, serializer).export
18
20
 
19
- ExportMailer.export(user, name, export_data).deliver_now
21
+ private_export = attach_archive(export_data, name, user)
22
+
23
+ ExportMailer.export(user, private_export).deliver_later
20
24
  end
21
25
  # rubocop:enable Metrics/ParameterLists
22
26
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  class ExportParticipatorySpaceJob < ApplicationJob
5
+ include Decidim::PrivateDownloadHelper
6
+
5
7
  queue_as :exports
6
8
 
7
9
  def perform(user, participatory_space, name, format)
@@ -14,7 +16,8 @@ module Decidim
14
16
 
15
17
  export_data = Decidim::Exporters.find_exporter(format).new(collection, serializer).export
16
18
 
17
- Decidim::ExportMailer.export(user, name, export_data).deliver_now
19
+ private_export = attach_archive(export_data, name, user)
20
+ ExportMailer.export(user, private_export).deliver_later
18
21
  end
19
22
  end
20
23
  end