decidim-core 0.31.8 → 0.32.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 (551) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -13
  3. data/app/cells/decidim/amendable/amend_button_card/show.erb +2 -2
  4. data/app/cells/decidim/amendable/amend_button_card_cell.rb +1 -1
  5. data/app/cells/decidim/author_cell.rb +4 -0
  6. data/app/cells/decidim/card_metadata_cell.rb +1 -1
  7. data/app/cells/decidim/comments_button_cell.rb +1 -9
  8. data/app/cells/decidim/content_blocks/announcement_settings_form/show.erb +5 -0
  9. data/app/cells/decidim/content_blocks/announcement_settings_form_cell.rb +17 -0
  10. data/app/cells/decidim/content_blocks/cta_settings_form/show.erb +1 -1
  11. data/app/cells/decidim/content_blocks/hero_settings_form/show.erb +2 -2
  12. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +1 -1
  13. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form/show.erb +1 -1
  14. data/app/cells/decidim/content_blocks/highlighted_participatory_spaces_cell.rb +1 -1
  15. data/app/cells/decidim/content_blocks/how_to_participate/show.erb +1 -1
  16. data/app/cells/decidim/content_blocks/html_cell.rb +1 -1
  17. data/app/cells/decidim/content_blocks/participatory_space_announcement_cell.rb +1 -3
  18. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +1 -5
  19. data/app/cells/decidim/content_blocks/participatory_space_hero_settings_form/show.erb +1 -1
  20. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +14 -1
  21. data/app/cells/decidim/content_blocks/static_page/section_cell.rb +1 -1
  22. data/app/cells/decidim/content_blocks/static_page/section_settings_form/show.erb +1 -3
  23. data/app/cells/decidim/content_blocks/static_page/summary_cell.rb +1 -1
  24. data/app/cells/decidim/content_blocks/static_page/summary_settings_form/show.erb +1 -3
  25. data/app/cells/decidim/content_blocks/static_page/two_pane_section_cell.rb +2 -2
  26. data/app/cells/decidim/content_blocks/static_page/two_pane_section_settings_form/show.erb +2 -4
  27. data/app/cells/decidim/data_consent/category.erb +38 -25
  28. data/app/cells/decidim/following_cell.rb +1 -1
  29. data/app/cells/decidim/footer_topics/show.erb +8 -5
  30. data/app/cells/decidim/{participatory_space_private_user → member}/show.erb +1 -1
  31. data/app/cells/decidim/{participatory_space_private_user_cell.rb → member_cell.rb} +1 -1
  32. data/app/cells/decidim/nav_links/show.erb +1 -3
  33. data/app/cells/decidim/onboarding_action_message_cell.rb +1 -0
  34. data/app/cells/decidim/profile/details.erb +1 -1
  35. data/app/cells/decidim/profile_cell.rb +1 -0
  36. data/app/cells/decidim/profile_member_of/show.erb +13 -0
  37. data/app/cells/decidim/profile_member_of_cell.rb +35 -0
  38. data/app/cells/decidim/resource_types_filter/show.erb +2 -2
  39. data/app/cells/decidim/share_text_widget/modal.erb +0 -1
  40. data/app/cells/decidim/share_widget/modal.erb +0 -1
  41. data/app/cells/decidim/share_widget/qr_code_modal.erb +4 -2
  42. data/app/cells/decidim/tags_cell.rb +1 -1
  43. data/app/cells/decidim/upload_modal_cell.rb +0 -5
  44. data/app/cells/decidim/versions_list/show.erb +25 -0
  45. data/app/commands/decidim/create_follow.rb +3 -5
  46. data/app/commands/decidim/create_omniauth_registration.rb +2 -17
  47. data/app/commands/decidim/create_user_report.rb +1 -1
  48. data/app/commands/decidim/destroy_account.rb +4 -15
  49. data/app/commands/decidim/gallery_methods.rb +107 -0
  50. data/app/commands/decidim/multiple_attachments_methods.rb +27 -28
  51. data/app/commands/decidim/search.rb +5 -5
  52. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +1 -1
  53. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +0 -4
  54. data/app/controllers/concerns/decidim/devise_controllers.rb +0 -12
  55. data/app/controllers/concerns/decidim/direct_upload.rb +3 -2
  56. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +0 -2
  57. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +1 -1
  58. data/app/controllers/concerns/decidim/filter_resource.rb +0 -2
  59. data/app/controllers/concerns/decidim/force_authentication.rb +10 -1
  60. data/app/controllers/concerns/decidim/impersonate_users.rb +6 -2
  61. data/app/controllers/concerns/decidim/locale_switcher.rb +11 -12
  62. data/app/controllers/concerns/decidim/needs_permission.rb +10 -22
  63. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +1 -1
  64. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +0 -2
  65. data/app/controllers/concerns/decidim/paginable.rb +3 -7
  66. data/app/controllers/concerns/decidim/participatory_space/has_members_page.rb +27 -0
  67. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -5
  68. data/app/controllers/concerns/decidim/payload_info.rb +0 -2
  69. data/app/controllers/concerns/decidim/resource_versions_concern.rb +0 -14
  70. data/app/controllers/decidim/account_controller.rb +1 -1
  71. data/app/controllers/decidim/amendments_controller.rb +5 -4
  72. data/app/controllers/decidim/application_controller.rb +6 -0
  73. data/app/controllers/decidim/authorization_modals_controller.rb +0 -2
  74. data/app/controllers/decidim/components/base_controller.rb +19 -4
  75. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -1
  76. data/app/controllers/decidim/devise/passwords_controller.rb +1 -9
  77. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  78. data/app/controllers/decidim/devise/sessions_controller.rb +1 -1
  79. data/app/controllers/decidim/download_your_data_controller.rb +2 -2
  80. data/app/controllers/decidim/editor_images_controller.rb +1 -1
  81. data/app/controllers/decidim/favicon_controller.rb +0 -9
  82. data/app/controllers/decidim/follows_controller.rb +4 -3
  83. data/app/controllers/decidim/free_resource_authorization_modals_controller.rb +0 -2
  84. data/app/controllers/decidim/gamification/badges_controller.rb +0 -2
  85. data/app/controllers/decidim/geolocation_controller.rb +1 -1
  86. data/app/controllers/decidim/homepage_controller.rb +1 -4
  87. data/app/controllers/decidim/likes_controller.rb +3 -2
  88. data/app/controllers/decidim/links_controller.rb +0 -2
  89. data/app/controllers/decidim/locales_controller.rb +3 -11
  90. data/app/controllers/decidim/manifests_controller.rb +0 -2
  91. data/app/controllers/decidim/messaging/conversations_controller.rb +7 -13
  92. data/app/controllers/decidim/newsletters_controller.rb +1 -5
  93. data/app/controllers/decidim/notifications_settings_controller.rb +1 -1
  94. data/app/controllers/decidim/notifications_subscriptions_controller.rb +0 -12
  95. data/app/controllers/decidim/offline_controller.rb +1 -5
  96. data/app/controllers/decidim/open_data_controller.rb +2 -6
  97. data/app/controllers/decidim/pages_controller.rb +3 -31
  98. data/app/controllers/decidim/profiles_controller.rb +0 -10
  99. data/app/controllers/decidim/qr_controller.rb +1 -3
  100. data/app/controllers/decidim/report_users_controller.rb +2 -2
  101. data/app/controllers/decidim/reports_controller.rb +1 -1
  102. data/app/controllers/decidim/resource_autocomplete_controller.rb +0 -2
  103. data/app/controllers/decidim/searches_controller.rb +0 -2
  104. data/app/controllers/decidim/short_links_controller.rb +0 -4
  105. data/app/controllers/decidim/static_map_controller.rb +0 -2
  106. data/app/controllers/decidim/timeouts_controller.rb +0 -4
  107. data/app/controllers/decidim/tos_controller.rb +0 -2
  108. data/app/controllers/decidim/upload_validations_controller.rb +2 -4
  109. data/app/controllers/decidim/user_activities_controller.rb +1 -4
  110. data/app/events/decidim/amendable/amendment_base_event.rb +1 -7
  111. data/app/events/decidim/welcome_notification_event.rb +1 -1
  112. data/app/forms/decidim/upload_validation_form.rb +11 -17
  113. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +1 -0
  114. data/app/helpers/concerns/decidim/user_role_checker.rb +10 -35
  115. data/app/helpers/decidim/active_link_to_helper.rb +136 -0
  116. data/app/helpers/decidim/amendments_helper.rb +3 -3
  117. data/app/helpers/decidim/check_boxes_tree_helper.rb +2 -2
  118. data/app/helpers/decidim/component_path_helper.rb +9 -4
  119. data/app/helpers/decidim/filters_helper.rb +0 -2
  120. data/app/helpers/decidim/menu_helper.rb +5 -3
  121. data/app/helpers/decidim/meta_tags_helper.rb +0 -2
  122. data/app/helpers/decidim/paginate_helper.rb +14 -1
  123. data/app/helpers/decidim/sanitize_helper.rb +2 -11
  124. data/app/helpers/decidim/short_link_helper.rb +5 -5
  125. data/app/helpers/decidim/translations_helper.rb +4 -4
  126. data/app/jobs/decidim/application_job.rb +0 -4
  127. data/app/jobs/decidim/delete_inactive_participants_job.rb +2 -2
  128. data/app/jobs/decidim/process_inactive_participant_job.rb +7 -0
  129. data/app/mailers/decidim/application_mailer.rb +7 -2
  130. data/app/mailers/decidim/decidim_devise_mailer.rb +1 -0
  131. data/app/mailers/decidim/participants_account_mailer.rb +16 -0
  132. data/app/mailers/decidim/reported_mailer.rb +4 -1
  133. data/app/models/decidim/action_log.rb +1 -1
  134. data/app/models/decidim/attachment.rb +2 -20
  135. data/app/models/decidim/authorization.rb +0 -31
  136. data/app/models/decidim/authorization_transfer.rb +1 -1
  137. data/app/models/decidim/component.rb +6 -9
  138. data/app/models/decidim/content_block.rb +3 -3
  139. data/app/models/decidim/moderation.rb +1 -1
  140. data/app/models/decidim/newsletter.rb +2 -2
  141. data/app/models/decidim/oauth_application.rb +0 -1
  142. data/app/models/decidim/participatory_space/member.rb +55 -0
  143. data/app/models/decidim/private_export.rb +0 -6
  144. data/app/models/decidim/resource_link.rb +1 -1
  145. data/app/models/decidim/short_link.rb +1 -1
  146. data/app/models/decidim/user.rb +2 -3
  147. data/app/models/decidim/user_base_entity.rb +3 -18
  148. data/app/models/decidim/user_moderation.rb +1 -1
  149. data/app/packs/src/decidim/callout.js +0 -10
  150. data/app/packs/src/decidim/controllers/accordion/accordion.test.js +42 -260
  151. data/app/packs/src/decidim/controllers/accordion/controller.js +17 -136
  152. data/app/packs/src/decidim/controllers/assign_role/assign_role.test.js +80 -0
  153. data/app/packs/src/decidim/controllers/assign_role/controller.js +27 -0
  154. data/app/packs/src/decidim/controllers/dropdown/controller.js +0 -6
  155. data/app/packs/src/decidim/controllers/dropdown/dropdown.test.js +0 -28
  156. data/app/packs/src/decidim/controllers/form_validator/form_validator.js +6 -6
  157. data/app/packs/src/decidim/controllers/form_validator/form_validator.test.js +1 -23
  158. data/app/packs/src/decidim/controllers/main_menu/controller.js +115 -0
  159. data/app/packs/src/decidim/controllers/main_menu/main_menu.test.js +185 -0
  160. data/app/packs/src/decidim/controllers/mention/controller.js +140 -296
  161. data/app/packs/src/decidim/controllers/mention/input_mentions.test.js +457 -120
  162. data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +32 -68
  163. data/app/packs/src/decidim/controllers/multiple_mentions/input_multiple_mentions.test.js +23 -30
  164. data/app/packs/src/decidim/controllers/password_toggler/controller.js +1 -22
  165. data/app/packs/src/decidim/controllers/password_toggler/password_toggler.test.js +20 -11
  166. data/app/packs/src/decidim/datepicker/datepicker_functions.js +23 -34
  167. data/app/packs/src/decidim/datepicker/generate_datepicker.js +5 -17
  168. data/app/packs/src/decidim/datepicker/test/time.test.js +24 -39
  169. data/app/packs/src/decidim/direct_uploads/upload_field.js +4 -4
  170. data/app/packs/src/decidim/direct_uploads/upload_modal.js +7 -12
  171. data/app/packs/src/decidim/editor/common/suggestion.js +1 -1
  172. data/app/packs/src/decidim/editor/extensions/decidim_kit/index.js +4 -1
  173. data/app/packs/src/decidim/editor/extensions/image/index.js +8 -5
  174. data/app/packs/src/decidim/editor/extensions/link/index.js +8 -0
  175. data/app/packs/src/decidim/editor/extensions/mention/index.js +18 -5
  176. data/app/packs/src/decidim/editor/extensions/mention_resource/index.js +16 -7
  177. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +13 -4
  178. data/app/packs/src/decidim/editor/test/extensions/heading.test.js +1 -1
  179. data/app/packs/src/decidim/editor/test/extensions/image.test.js +26 -28
  180. data/app/packs/src/decidim/editor/test/extensions/mention.test.js +6 -2
  181. data/app/packs/src/decidim/editor/test/extensions/video_embed.test.js +27 -15
  182. data/app/packs/src/decidim/editor/test/helpers.js +8 -10
  183. data/app/packs/src/decidim/editor/test/toolbar/full.test.js +15 -4
  184. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_block.js +8 -4
  185. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_formatting.js +5 -1
  186. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_indent.js +9 -5
  187. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_link.js +5 -1
  188. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_list.js +8 -4
  189. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_styling.js +13 -9
  190. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_content_styling.js +6 -2
  191. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +5 -15
  192. data/app/packs/src/decidim/index.js +3 -5
  193. data/app/packs/src/decidim/map/controller.js +1 -10
  194. data/app/packs/src/decidim/refactor/moved/focus_guard.js +12 -12
  195. data/app/packs/src/decidim/sw/push-permissions.js +13 -48
  196. data/app/packs/src/decidim/sw/sw.js +1 -1
  197. data/app/packs/src/decidim/utilities/dom.js +2 -2
  198. data/app/packs/src/decidim/utilities/text.js +6 -6
  199. data/app/packs/src/decidim/vendor/tribute.js +1890 -0
  200. data/app/packs/stylesheets/decidim/_cards.scss +3 -2
  201. data/app/packs/stylesheets/decidim/_content_blocks.scss +10 -4
  202. data/app/packs/stylesheets/decidim/_conversations.scss +0 -6
  203. data/app/packs/stylesheets/decidim/_cookies.scss +5 -13
  204. data/app/packs/stylesheets/decidim/_datepicker.scss +0 -8
  205. data/app/packs/stylesheets/decidim/_documents.scss +1 -1
  206. data/app/packs/stylesheets/decidim/_dropdown.scss +21 -31
  207. data/app/packs/stylesheets/decidim/_floating_help.scss +1 -1
  208. data/app/packs/stylesheets/decidim/_footer.scss +1 -69
  209. data/app/packs/stylesheets/decidim/_forms.scss +5 -1
  210. data/app/packs/stylesheets/decidim/_header.scss +148 -46
  211. data/app/packs/stylesheets/decidim/_language_chooser.scss +79 -0
  212. data/app/packs/stylesheets/decidim/_modal.scss +8 -16
  213. data/app/packs/stylesheets/decidim/_modal_share.scss +22 -0
  214. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +2 -12
  215. data/app/packs/stylesheets/decidim/_rich_text.scss +9 -12
  216. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  217. data/app/packs/stylesheets/decidim/_typography.scss +2 -5
  218. data/app/packs/stylesheets/decidim/application.scss +1 -2
  219. data/app/packs/stylesheets/decidim/editor.scss +33 -2
  220. data/app/packs/stylesheets/decidim/geocoding_addons.scss +2 -10
  221. data/app/packs/stylesheets/decidim/legacy/email.scss +5 -0
  222. data/app/permissions/decidim/permissions.rb +0 -20
  223. data/app/presenters/decidim/admin_log/component_presenter.rb +1 -1
  224. data/app/presenters/decidim/admin_log/participatory_space/member_presenter.rb +40 -0
  225. data/app/presenters/decidim/admin_log/static_page_resource_presenter.rb +1 -1
  226. data/app/presenters/decidim/authorization_transfer_presenter.rb +1 -1
  227. data/app/presenters/decidim/breadcrumb_root_menu_item_presenter.rb +3 -3
  228. data/app/presenters/decidim/footer_menu_presenter.rb +4 -2
  229. data/app/presenters/decidim/log/base_presenter.rb +1 -10
  230. data/app/presenters/decidim/log/user_presenter.rb +3 -2
  231. data/app/presenters/decidim/log/value_types/access_mode_presenter.rb +45 -0
  232. data/app/presenters/decidim/menu_item_presenter.rb +3 -9
  233. data/app/presenters/decidim/participatory_space/member_presenter.rb +48 -0
  234. data/app/presenters/decidim/resource_locator_presenter.rb +22 -3
  235. data/app/presenters/decidim/stats_presenter.rb +1 -1
  236. data/app/queries/decidim/last_activity.rb +1 -1
  237. data/app/resolvers/decidim/meta_image_url_resolver.rb +0 -7
  238. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +2 -11
  239. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +1 -25
  240. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +15 -1
  241. data/app/services/decidim/email_notification_generator.rb +2 -0
  242. data/app/services/decidim/notification_generator.rb +4 -0
  243. data/app/services/decidim/notifications_subscriptions_persistor.rb +0 -6
  244. data/app/services/decidim/send_push_notification.rb +1 -5
  245. data/app/uploaders/decidim/application_uploader.rb +2 -2
  246. data/app/uploaders/decidim/image_uploader.rb +1 -1
  247. data/app/uploaders/decidim/organization_favicon_uploader.rb +4 -9
  248. data/app/validators/uploader_image_dimensions_validator.rb +13 -11
  249. data/app/views/decidim/application/_radio_accordion.html.erb +5 -1
  250. data/app/views/decidim/gamification/badges/index.html.erb +1 -1
  251. data/app/views/decidim/homepage/show.html.erb +2 -2
  252. data/app/views/decidim/last_activities/index.html.erb +1 -1
  253. data/app/views/decidim/messaging/conversations/_error_modal.html.erb +19 -11
  254. data/app/views/decidim/messaging/conversations/_new_conversation_button.html.erb +1 -1
  255. data/app/views/decidim/messaging/conversations/_reply.html.erb +1 -1
  256. data/app/views/decidim/messaging/conversations/create.js.erb +3 -1
  257. data/app/views/decidim/messaging/conversations/error.js.erb +7 -12
  258. data/app/views/decidim/messaging/conversations/new.html.erb +1 -1
  259. data/app/views/decidim/messaging/conversations/show.html.erb +2 -2
  260. data/app/views/decidim/newsletters/unsubscribe.html.erb +1 -1
  261. data/app/views/decidim/notifications_settings/show.html.erb +5 -5
  262. data/app/views/decidim/offline/show.html.erb +1 -1
  263. data/app/views/decidim/pages/index.html.erb +1 -1
  264. data/app/views/decidim/participants_account_mailer/removal_notification.html.erb +11 -0
  265. data/app/views/decidim/participatory_space/members/_member.html.erb +1 -0
  266. data/app/views/decidim/profiles/show.html.erb +1 -1
  267. data/app/views/decidim/searches/_filters.html.erb +1 -1
  268. data/app/views/decidim/shared/_login_modal.html.erb +14 -12
  269. data/app/views/decidim/shared/_resource_actions.html.erb +4 -4
  270. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  271. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -1
  272. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +4 -3
  273. data/app/views/decidim/user_activities/index.html.erb +1 -1
  274. data/app/views/devise/mailer/{invite_private_user.html.erb → invite_member.html.erb} +2 -2
  275. data/app/views/devise/mailer/{invite_private_user.text.erb → invite_member.text.erb} +2 -2
  276. data/app/views/layouts/decidim/_head.html.erb +2 -2
  277. data/app/views/layouts/decidim/_mailer_logo.html.erb +1 -1
  278. data/app/views/layouts/decidim/_wrapper.html.erb +3 -3
  279. data/app/views/layouts/decidim/footer/_focus_mode_main.html.erb +0 -1
  280. data/app/views/layouts/decidim/footer/_main.html.erb +1 -2
  281. data/app/views/layouts/decidim/footer/_main_links.html.erb +28 -56
  282. data/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +4 -1
  283. data/app/views/layouts/decidim/header/_main.html.erb +17 -8
  284. data/app/views/layouts/decidim/header/_main_language_chooser.html.erb +24 -0
  285. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +56 -56
  286. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +2 -2
  287. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +3 -1
  288. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +18 -5
  289. data/app/views/layouts/decidim/header/_main_search.html.erb +3 -3
  290. data/app/views/layouts/decidim/header/_menu.html.erb +5 -5
  291. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +13 -12
  292. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile.html.erb +28 -0
  293. data/app/views/layouts/decidim/shared/_layout_center.html.erb +1 -1
  294. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  295. data/app/views/layouts/decidim/shared/_layout_two_col.html.erb +1 -1
  296. data/config/initializers/invisible_captcha.rb +1 -0
  297. data/config/initializers/rack_attack.rb +0 -10
  298. data/config/locales/ar.yml +29 -12
  299. data/config/locales/bg.yml +32 -14
  300. data/config/locales/bs-BA.yml +0 -1
  301. data/config/locales/ca-IT.yml +69 -63
  302. data/config/locales/ca.yml +69 -63
  303. data/config/locales/cs.yml +57 -44
  304. data/config/locales/da.yml +0 -1
  305. data/config/locales/de.yml +57 -84
  306. data/config/locales/el.yml +26 -9
  307. data/config/locales/en.yml +65 -58
  308. data/config/locales/eo.yml +0 -1
  309. data/config/locales/es-MX.yml +68 -62
  310. data/config/locales/es-PY.yml +68 -62
  311. data/config/locales/es.yml +68 -62
  312. data/config/locales/et.yml +0 -1
  313. data/config/locales/eu.yml +245 -234
  314. data/config/locales/fa-IR.yml +0 -1
  315. data/config/locales/fi-plain.yml +64 -61
  316. data/config/locales/fi.yml +66 -63
  317. data/config/locales/fr-CA.yml +64 -42
  318. data/config/locales/fr.yml +64 -42
  319. data/config/locales/ga-IE.yml +3 -2
  320. data/config/locales/gl.yml +55 -1446
  321. data/config/locales/gn-PY.yml +0 -1
  322. data/config/locales/hr.yml +0 -1
  323. data/config/locales/hu.yml +27 -12
  324. data/config/locales/id-ID.yml +25 -9
  325. data/config/locales/is-IS.yml +7 -2
  326. data/config/locales/it.yml +24 -23
  327. data/config/locales/ja.yml +66 -76
  328. data/config/locales/ka-GE.yml +0 -1
  329. data/config/locales/kaa.yml +0 -1
  330. data/config/locales/ko.yml +0 -1
  331. data/config/locales/lb.yml +27 -10
  332. data/config/locales/lt.yml +28 -12
  333. data/config/locales/lv.yml +25 -9
  334. data/config/locales/mt.yml +0 -1
  335. data/config/locales/nl.yml +27 -10
  336. data/config/locales/no.yml +27 -10
  337. data/config/locales/oc-FR.yml +0 -1
  338. data/config/locales/pl.yml +34 -18
  339. data/config/locales/pt-BR.yml +62 -26
  340. data/config/locales/pt.yml +27 -10
  341. data/config/locales/ro-RO.yml +44 -21
  342. data/config/locales/ru.yml +8 -7
  343. data/config/locales/sk.yml +25 -1410
  344. data/config/locales/sl.yml +0 -1
  345. data/config/locales/sr-CS.yml +0 -1
  346. data/config/locales/sv.yml +71 -66
  347. data/config/locales/tr-TR.yml +30 -10
  348. data/config/locales/uk.yml +6 -4
  349. data/config/locales/vi.yml +0 -1
  350. data/config/locales/zh-CN.yml +25 -9
  351. data/config/locales/zh-TW.yml +28 -10
  352. data/config/routes.rb +138 -77
  353. data/db/data/20251213075429_rename_members_in_action_log.rb +22 -0
  354. data/db/data/20260319145808_rename_send_to_members_in_newsletter.rb +27 -0
  355. data/db/migrate/20200730142511_add_file_upload_settings_to_decidim_organizations.rb +13 -15
  356. data/db/migrate/20250217192438_convert_user_groups_into_users.rb +2 -3
  357. data/db/migrate/20250523104311_move_cta_to_hero_content_block.rb +1 -1
  358. data/db/migrate/20250527122040_move_highlighted_content_banner_settings_to_content_block.rb +1 -1
  359. data/db/migrate/20250819110800_convert_private_exports_id_to_uuid.rb +2 -2
  360. data/db/migrate/20251112132305_remove_legacy_images_from_core_module.rb +27 -0
  361. data/db/migrate/20251205122428_rename_participatory_space_private_users_to_members.rb +9 -0
  362. data/db/migrate/20251216185133_rename_privatable_to_to_participatory_space_in_members.rb +10 -0
  363. data/db/migrate/20260208201405_remove_user_group_core.rb +21 -0
  364. data/db/migrate/20260208201406_remove_user_group_memberships.rb +30 -0
  365. data/db/migrate/20260208201407_remove_user_group_organizations.rb +11 -0
  366. data/db/migrate/20260217152425_remove_enable_participatory_space_filters_from_decidim_organizations.rb +7 -0
  367. data/db/migrate/20260314081619_add_index_on_decidim_members.rb +25 -0
  368. data/decidim-core.gemspec +25 -31
  369. data/lib/decidim/acts_as_tree.rb +12 -12
  370. data/lib/decidim/admin_filters_registry.rb +1 -1
  371. data/lib/decidim/amendable.rb +5 -1
  372. data/lib/decidim/api/functions/category_list.rb +1 -0
  373. data/lib/decidim/api/functions/component_finder_base.rb +1 -1
  374. data/lib/decidim/api/functions/component_list.rb +3 -1
  375. data/lib/decidim/api/functions/component_list_base.rb +1 -0
  376. data/lib/decidim/api/functions/participatory_space_finder_base.rb +1 -1
  377. data/lib/decidim/api/functions/participatory_space_list_base.rb +1 -0
  378. data/lib/decidim/api/functions/user_entity_list.rb +0 -3
  379. data/lib/decidim/api/interfaces/amendable_entity_interface.rb +1 -0
  380. data/lib/decidim/api/interfaces/amendable_interface.rb +1 -0
  381. data/lib/decidim/api/interfaces/attachable_collection_interface.rb +1 -0
  382. data/lib/decidim/api/interfaces/attachable_interface.rb +1 -0
  383. data/lib/decidim/api/interfaces/author_interface.rb +2 -1
  384. data/lib/decidim/api/interfaces/authorable_interface.rb +1 -0
  385. data/lib/decidim/api/interfaces/categories_container_interface.rb +1 -0
  386. data/lib/decidim/api/interfaces/categorizable_interface.rb +1 -0
  387. data/lib/decidim/api/interfaces/coauthorable_interface.rb +1 -0
  388. data/lib/decidim/api/interfaces/component_interface.rb +9 -8
  389. data/lib/decidim/api/interfaces/fingerprint_interface.rb +1 -0
  390. data/lib/decidim/api/interfaces/followable_interface.rb +2 -0
  391. data/lib/decidim/api/interfaces/likeable_interface.rb +2 -2
  392. data/lib/decidim/api/interfaces/localizable_interface.rb +1 -0
  393. data/lib/decidim/api/interfaces/participatory_space_interface.rb +1 -0
  394. data/lib/decidim/api/interfaces/referable_interface.rb +1 -0
  395. data/lib/decidim/api/interfaces/scopable_interface.rb +1 -0
  396. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +1 -0
  397. data/lib/decidim/api/interfaces/timestamps_interface.rb +1 -0
  398. data/lib/decidim/api/interfaces/traceable_interface.rb +1 -0
  399. data/lib/decidim/api/types/attachment_collection_type.rb +5 -3
  400. data/lib/decidim/api/types/attachment_type.rb +11 -4
  401. data/lib/decidim/api/types/badge_score_type.rb +28 -0
  402. data/lib/decidim/api/types/moderation_type.rb +25 -0
  403. data/lib/decidim/api/types/participant_details_type.rb +17 -0
  404. data/lib/decidim/api/types/reportable_type.rb +18 -0
  405. data/lib/decidim/api/types/reportable_user_type.rb +17 -0
  406. data/lib/decidim/api/types/static_page_topic_type.rb +16 -0
  407. data/lib/decidim/api/types/static_page_type.rb +22 -0
  408. data/lib/decidim/api/types/taxonomy_type.rb +2 -0
  409. data/lib/decidim/api/types/user_moderation_type.rb +36 -0
  410. data/lib/decidim/api/types/user_type.rb +13 -0
  411. data/lib/decidim/asset_router/pipeline.rb +1 -1
  412. data/lib/decidim/asset_router/storage.rb +9 -9
  413. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +3 -0
  414. data/lib/decidim/attachment_attributes.rb +9 -58
  415. data/lib/decidim/attribute_encryptor.rb +51 -10
  416. data/lib/decidim/attribute_object/model.rb +0 -5
  417. data/lib/decidim/block_registry.rb +1 -1
  418. data/lib/decidim/coauthorable.rb +2 -1
  419. data/lib/decidim/command.rb +2 -1
  420. data/lib/decidim/content_processor.rb +1 -1
  421. data/lib/decidim/content_renderers/base_renderer.rb +0 -112
  422. data/lib/decidim/content_renderers/blob_renderer.rb +7 -4
  423. data/lib/decidim/content_renderers/mention_resource_renderer.rb +6 -10
  424. data/lib/decidim/content_renderers/resource_renderer.rb +7 -16
  425. data/lib/decidim/content_renderers/user_renderer.rb +9 -11
  426. data/lib/decidim/core/api.rb +8 -0
  427. data/lib/decidim/core/content_blocks/registry_manager.rb +4 -10
  428. data/lib/decidim/core/engine.rb +2 -42
  429. data/lib/decidim/core/menu.rb +0 -26
  430. data/lib/decidim/core/test/factories.rb +29 -21
  431. data/lib/decidim/core/test/shared_examples/access_mode_restricted_participatory_spaces.rb +172 -0
  432. data/lib/decidim/core/test/shared_examples/access_mode_transparent_participatory_spaces.rb +241 -0
  433. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +10 -10
  434. data/lib/decidim/core/test/shared_examples/amendable/amendment_event_examples.rb +2 -2
  435. data/lib/decidim/core/test/shared_examples/amendable/amendment_promoted_event_examples.rb +3 -3
  436. data/lib/decidim/core/test/shared_examples/comments_examples.rb +121 -143
  437. data/lib/decidim/core/test/shared_examples/fingerprint_examples.rb +2 -0
  438. data/lib/decidim/core/test/shared_examples/has_members.rb +63 -0
  439. data/lib/decidim/core/test/shared_examples/has_space_in_mcell_examples.rb +1 -2
  440. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +1 -1
  441. data/lib/decidim/core/test/shared_examples/map_examples.rb +1 -1
  442. data/lib/decidim/core/test/shared_examples/participant_details_examples.rb +16 -0
  443. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +9 -86
  444. data/lib/decidim/core/test/shared_examples/participatory_space_members_shared_examples.rb +6 -85
  445. data/lib/decidim/core/test/shared_examples/resource_liked_event_examples.rb +3 -3
  446. data/lib/decidim/core/test/shared_examples/resource_locator_presenter_examples.rb +7 -7
  447. data/lib/decidim/core/test/shared_examples/searchable_participatory_space_examples.rb +3 -3
  448. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +2 -2
  449. data/lib/decidim/core/test/shared_examples/simple_event.rb +1 -0
  450. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +2 -2
  451. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -24
  452. data/lib/decidim/core/test.rb +2 -1
  453. data/lib/decidim/core/version.rb +1 -1
  454. data/lib/decidim/core.rb +222 -344
  455. data/lib/decidim/download_your_data_serializers/{download_your_data_participatory_space_private_user_serializer.rb → download_your_data_member_serializer.rb} +6 -6
  456. data/lib/decidim/download_your_data_serializers.rb +2 -2
  457. data/lib/decidim/engine_router.rb +31 -6
  458. data/lib/decidim/exporters/csv.rb +1 -1
  459. data/lib/decidim/filter_form_builder.rb +1 -1
  460. data/{app/controllers/concerns → lib}/decidim/form_factory.rb +11 -1
  461. data/lib/decidim/has_settings.rb +2 -2
  462. data/lib/decidim/has_upload_validations.rb +0 -1
  463. data/lib/decidim/legacy_form_builder.rb +1 -4
  464. data/lib/decidim/locale_router_detector.rb +41 -0
  465. data/lib/decidim/maintenance/import_models/scope.rb +1 -1
  466. data/lib/decidim/maintenance/import_models.rb +0 -2
  467. data/lib/decidim/map/autocomplete.rb +3 -4
  468. data/lib/decidim/map/dynamic_map.rb +1 -3
  469. data/lib/decidim/map/frontend.rb +1 -1
  470. data/lib/decidim/map/geocoding.rb +2 -2
  471. data/lib/decidim/map/static_map.rb +10 -22
  472. data/lib/decidim/map/utility.rb +3 -6
  473. data/lib/decidim/map.rb +2 -2
  474. data/lib/decidim/menu.rb +1 -1
  475. data/lib/decidim/menu_item.rb +1 -0
  476. data/lib/decidim/menu_registry.rb +1 -1
  477. data/lib/decidim/moderation_tools.rb +1 -1
  478. data/lib/decidim/newsletter_encryptor.rb +5 -8
  479. data/lib/decidim/organization_settings.rb +2 -2
  480. data/lib/decidim/participable.rb +1 -0
  481. data/lib/decidim/participatory_space/has_members.rb +61 -0
  482. data/lib/decidim/participatory_space_manifest.rb +0 -4
  483. data/lib/decidim/participatory_space_resourceable.rb +10 -1
  484. data/lib/decidim/routes/locale_redirects.rb +47 -0
  485. data/lib/decidim/routes.rb +7 -0
  486. data/lib/decidim/search_resource_fields_mapper.rb +3 -4
  487. data/lib/decidim/searchable.rb +0 -5
  488. data/lib/decidim/seeds.rb +17 -0
  489. data/lib/decidim/shakapacker/runner.rb +4 -4
  490. data/lib/decidim/shakapacker/shakapacker.yml +28 -3
  491. data/lib/decidim/taxonomizable.rb +1 -1
  492. data/lib/decidim/translatable_attributes.rb +9 -3
  493. data/lib/decidim/view_model.rb +5 -1
  494. data/lib/devise/models/decidim_newsletterable.rb +1 -1
  495. data/lib/tasks/decidim_mailers_tasks.rake +9 -31
  496. data/lib/tasks/decidim_procfile.rake +1 -1
  497. data/lib/tasks/decidim_tasks.rake +0 -1
  498. data/lib/tasks/decidim_taxonomies.rake +1 -1
  499. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +0 -1
  500. data/lib/tasks/upgrade/decidim_encryption.rake +12 -0
  501. data/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake +0 -1
  502. data/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake +1 -1
  503. data/lib/tasks/upgrade/{fix_deleted_private_follows.rake → fix_deleted_members_follows.rake} +5 -5
  504. data/lib/tasks/upgrade/migrations.rake +0 -1
  505. data/lib/tasks/upgrade/user_groups_migration.rake +0 -1
  506. metadata +206 -159
  507. data/app/cells/decidim/content_blocks/global_menu/show.erb +0 -11
  508. data/app/cells/decidim/content_blocks/global_menu_cell.rb +0 -35
  509. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity/show.erb +0 -10
  510. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity_cell.rb +0 -49
  511. data/app/cells/decidim/participatory_space_dropdown_metadata/links.erb +0 -9
  512. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +0 -1
  513. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +0 -11
  514. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +0 -26
  515. data/app/controllers/concerns/decidim/has_members_page.rb +0 -25
  516. data/app/controllers/decidim/private_downloads_controller.rb +0 -31
  517. data/app/jobs/decidim/newsletters_opt_in_job.rb +0 -11
  518. data/app/jobs/decidim/user_report_job.rb +0 -11
  519. data/app/mailers/decidim/delete_user_mailer.rb +0 -14
  520. data/app/models/decidim/participatory_space_private_user.rb +0 -51
  521. data/app/models/decidim/private_download.rb +0 -61
  522. data/app/packs/src/decidim/callout.test.js +0 -32
  523. data/app/packs/src/decidim/controllers/sticky_header/controller.js +0 -116
  524. data/app/packs/src/decidim/controllers/sticky_header/sticky_header.test.js +0 -320
  525. data/app/packs/src/decidim/dropdown_menu.js +0 -18
  526. data/app/packs/src/decidim/geocoding/reverse_geocoding.test.js +0 -197
  527. data/app/packs/src/decidim/identity_selector_dialog.js +0 -33
  528. data/app/packs/src/decidim/refactor/moved/focus_guard.test.js +0 -136
  529. data/app/packs/stylesheets/decidim/_editor_suggestions.scss +0 -49
  530. data/app/packs/stylesheets/decidim/_tom_select.scss +0 -23
  531. data/app/presenters/decidim/admin_log/participatory_space_private_user_presenter.rb +0 -38
  532. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +0 -46
  533. data/app/services/decidim/push_subscription_endpoint_validator.rb +0 -34
  534. data/app/services/decidim/svg_content_validator.rb +0 -554
  535. data/app/validators/uploader_image_content_validator.rb +0 -278
  536. data/app/views/decidim/delete_user_mailer/delete.html.erb +0 -6
  537. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +0 -1
  538. data/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +0 -26
  539. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +0 -34
  540. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +0 -10
  541. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_mobile.html.erb +0 -17
  542. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_top_left.html.erb +0 -2
  543. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +0 -33
  544. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +0 -25
  545. data/db/migrate/20260909000000_add_failed_attempts_and_locked_at_to_decidim_authorizations.rb +0 -8
  546. data/lib/decidim/core/test/shared_examples/has_private_users.rb +0 -63
  547. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +0 -81
  548. data/lib/decidim/has_private_users.rb +0 -57
  549. data/lib/decidim/maintenance/import_models/assembly_type.rb +0 -49
  550. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +0 -21
  551. data/lib/decidim/query_extensions.rb +0 -66
@@ -1,3 +1,28 @@
1
1
  <% reverse_ordered_versions.each_with_index do |version, index| %>
2
2
  <%= cell("decidim/versions_list_item", version, index:, versioned_resource:, version_path:, i18n_scope:, total:) %>
3
3
  <% end %>
4
+
5
+ <% if versioned_resource.class.include?(Decidim::Fingerprintable) %>
6
+ <% fingerprint_id = dom_id(versioned_resource, :fingerprint_dialog) %>
7
+ <section class="mt-4 ml-2">
8
+ <%= content_tag :button, t("decidim.fingerprint.check"), class: "button button__lg button__text-secondary font-normal text-sm underline", data: { dialog_open: fingerprint_id } %>
9
+ </section>
10
+ <%= decidim_modal id: fingerprint_id, class: "fingerprint-modal" do %>
11
+ <div data-dialog-container>
12
+ <%= icon "fingerprint-line" %>
13
+ <h2 id="dialog-title-<%= fingerprint_id %>" tabindex="-1" data-dialog-title><%= t "decidim.fingerprint.title" %></h2>
14
+ <div class="fingerprint-modal__container">
15
+ <p id="dialog-desc-<%= fingerprint_id %>"><%= t "decidim.fingerprint.explanation" %></p>
16
+ <div>
17
+ <span class="fingerprint-modal__span"><%= t "decidim.fingerprint.value" %>:</span>
18
+ <code class="fingerprint-modal__code"><%= decidim_html_escape versioned_resource.fingerprint.value %></code>
19
+ </div>
20
+ <div>
21
+ <span class="fingerprint-modal__span"><%= t "decidim.fingerprint.source" %>:</span>
22
+ <code class="fingerprint-modal__code"><%= decidim_html_escape versioned_resource.fingerprint.source %></code>
23
+ </div>
24
+ <p><%= t("decidim.fingerprint.replicate_help", online_calculator_link: link_to(t("decidim.fingerprint.online_calculator_name"), "https://www.md5calc.com/sha256", target: "_blank", rel: "noopener")).html_safe %></p>
25
+ </div>
26
+ </div>
27
+ <% end %>
28
+ <% end %>
@@ -20,6 +20,7 @@ module Decidim
20
20
  # Returns nothing.
21
21
  def call
22
22
  return broadcast(:invalid) if form.invalid?
23
+ return broadcast(:invalid) unless current_user.is_a?(Decidim::User)
23
24
 
24
25
  create_follow!
25
26
  increment_score
@@ -32,13 +33,10 @@ module Decidim
32
33
  attr_reader :follow, :form
33
34
 
34
35
  def create_follow!
35
- @follow = Follow.find_by(
36
+ @follow = Follow.where(
36
37
  followable: form.followable,
37
38
  user: current_user
38
- ) || Follow.create!(
39
- followable: form.followable,
40
- user: current_user
41
- )
39
+ ).first_or_create!
42
40
  end
43
41
 
44
42
  def increment_score
@@ -30,9 +30,9 @@ module Decidim
30
30
  end
31
31
  return broadcast(:invalid) if form.invalid?
32
32
 
33
- initialize_user
34
33
  transaction do
35
- @identity = existing_identity || create_identity
34
+ create_or_find_user
35
+ @identity = create_identity
36
36
  end
37
37
  trigger_omniauth_event
38
38
 
@@ -50,21 +50,6 @@ module Decidim
50
50
 
51
51
  REGEXP_SANITIZER = /[<>?%&\^*#@()\[\]=+:;"{}\\|]/
52
52
 
53
- def initialize_user
54
- create_or_find_user
55
- rescue ActiveRecord::RecordNotUnique
56
- @create_retries ||= 0
57
-
58
- # This may happen if the callback endpoint is called several times in a
59
- # row which some Omniauth providers may allow (e.g. through a double
60
- # click). This should ensure that the user will not get an error even if
61
- # the authentication service sent the callback request several times.
62
- raise if @create_retries >= 2
63
-
64
- @create_retries += 1
65
- retry
66
- end
67
-
68
53
  def create_or_find_user
69
54
  @user = User.find_or_initialize_by(
70
55
  email: verified_email,
@@ -58,7 +58,7 @@ module Decidim
58
58
  current_user.organization.admins.each do |admin|
59
59
  next unless admin.email_on_moderations
60
60
 
61
- Decidim::UserReportJob.perform_later(admin, report)
61
+ UserReportMailer.notify(admin, report).deliver_later
62
62
  end
63
63
  end
64
64
 
@@ -15,7 +15,7 @@ module Decidim
15
15
  def call
16
16
  return broadcast(:invalid) unless @form.valid?
17
17
 
18
- with_events(with_transaction: true) do
18
+ Decidim::User.transaction do
19
19
  destroy_user_account!
20
20
  destroy_user_identities
21
21
  destroy_follows
@@ -28,7 +28,7 @@ module Decidim
28
28
  destroy_user_badges
29
29
  destroy_user_likes
30
30
  destroy_user_reports
31
- destroy_participatory_space_private_user
31
+ destroy_member
32
32
  delegate_destroy_to_participatory_spaces
33
33
  end
34
34
 
@@ -101,8 +101,8 @@ module Decidim
101
101
  Decidim::Follow.where(user: current_user).find_each(&:destroy)
102
102
  end
103
103
 
104
- def destroy_participatory_space_private_user
105
- Decidim::ParticipatorySpacePrivateUser.where(user: current_user).find_each(&:destroy)
104
+ def destroy_member
105
+ Decidim::ParticipatorySpace::Member.where(user: current_user).find_each(&:destroy)
106
106
  end
107
107
 
108
108
  def delegate_destroy_to_participatory_spaces
@@ -110,16 +110,5 @@ module Decidim
110
110
  space_manifest.invoke_on_destroy_account(current_user)
111
111
  end
112
112
  end
113
-
114
- # We use memoization in this particular email, as we want to have the data available before the actual anonymization
115
- def event_arguments
116
- @event_arguments ||= {
117
- user_id: current_user.id,
118
- user_email: current_user.email,
119
- user_name: current_user.name,
120
- locale: current_user.locale,
121
- organization: current_user.organization
122
- }
123
- end
124
113
  end
125
114
  end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A module with all the gallery common methods
5
+ # Allows to create several image attachments at once
6
+ module GalleryMethods
7
+ private
8
+
9
+ def build_gallery(attached_to = nil)
10
+ @gallery = []
11
+ @form.add_photos.compact_blank.each do |photo|
12
+ if photo.is_a?(Hash) && photo.has_key?(:id)
13
+ update_attachment_title_for(photo)
14
+ next
15
+ end
16
+
17
+ @gallery << Attachment.new(
18
+ title: photos_title(photo),
19
+ attached_to: attached_to || gallery_attached_to,
20
+ file: photos_signed_id(photo), # Define attached_to before this
21
+ content_type: photos_content_type(photo)
22
+ )
23
+ end
24
+ end
25
+
26
+ def update_attachment_title_for(photo)
27
+ Decidim::Attachment.find(photo[:id]).update(title: photos_title(photo))
28
+ end
29
+
30
+ def image?(signed_id)
31
+ blob(signed_id).content_type.start_with? "image"
32
+ end
33
+
34
+ def gallery_invalid?
35
+ @gallery.each do |photo|
36
+ if photo.invalid? && photo.errors.has_key?(:file)
37
+ @form.errors.add(:add_photos, photo.errors[:file])
38
+ return true
39
+ end
40
+ end
41
+ false
42
+ end
43
+
44
+ def create_gallery(first_weight: 0)
45
+ weight = first_weight
46
+ # Add the weights first to the old photos
47
+ @form.photos.each do |photo|
48
+ photo.update!(weight:)
49
+ weight += 1
50
+ end
51
+ @gallery.map! do |photo|
52
+ photo.weight = weight
53
+ photo.attached_to = gallery_attached_to
54
+ photo.save!
55
+ weight += 1
56
+ @form.photos << photo
57
+ end
58
+ end
59
+
60
+ def photo_cleanup!
61
+ gallery_attached_to.photos.each do |photo|
62
+ next unless @form.photos.map(&:id).exclude?(photo.id)
63
+
64
+ photo.destroy! if (@form.respond_to?(:documents) && @form.documents.map(&:id).exclude?(photo.id)) || !@form.respond_to?(:documents)
65
+ end
66
+ # manually reset cached photos
67
+ gallery_attached_to.reload
68
+ gallery_attached_to.instance_variable_set(:@photos, nil)
69
+ end
70
+
71
+ # maybe a custom settings options would be nice
72
+ def gallery_allowed?
73
+ true
74
+ end
75
+
76
+ def process_gallery?
77
+ gallery_allowed? && @form.add_photos.any?
78
+ end
79
+
80
+ def gallery_attached_to
81
+ return @attached_to if @attached_to.present?
82
+ return form.current_organization if form.respond_to?(:current_organization)
83
+
84
+ form.current_component.organization if form.respond_to?(:current_component)
85
+ end
86
+
87
+ def photos_signed_id(photo)
88
+ return photo[:file] if photo.is_a?(Hash)
89
+
90
+ photo
91
+ end
92
+
93
+ def photos_title(photo)
94
+ return { I18n.locale => photo[:title] } if photo.is_a?(Hash) && photo.has_key?(:title)
95
+
96
+ { I18n.locale => "" }
97
+ end
98
+
99
+ def photos_content_type(photo)
100
+ blob(photos_signed_id(photo)).content_type
101
+ end
102
+
103
+ def blob(signed_id)
104
+ ActiveStorage::Blob.find_signed(signed_id)
105
+ end
106
+ end
107
+ end
@@ -5,16 +5,16 @@ module Decidim
5
5
  private
6
6
 
7
7
  def build_attachments
8
- @attachments = []
9
- @form.add_attachments.compact_blank.each do |attachment|
8
+ @documents = []
9
+ @form.add_documents.compact_blank.each do |attachment|
10
10
  if attachment.is_a?(Hash) && attachment.has_key?(:id)
11
11
  update_attachment_title_for(attachment)
12
12
  next
13
13
  end
14
14
 
15
- @attachments << Attachment.new(
15
+ @documents << Attachment.new(
16
16
  title: title_for(attachment),
17
- attached_to: @attached_to || attachments_attached_to,
17
+ attached_to: @attached_to || documents_attached_to,
18
18
  file: signed_id_for(attachment),
19
19
  content_type: content_type_for(attachment)
20
20
  )
@@ -26,11 +26,11 @@ module Decidim
26
26
  end
27
27
 
28
28
  def attachments_invalid?
29
- @attachments.each do |attachment|
30
- next if attachment.valid? || !attachment.errors.has_key?(:file)
29
+ @documents.each do |document|
30
+ next if document.valid? || !document.errors.has_key?(:file)
31
31
 
32
- attachment.errors[:file].each do |error|
33
- @form.errors.add(:add_attachments, error)
32
+ document.errors[:file].each do |error|
33
+ @form.errors.add(:add_documents, error)
34
34
  end
35
35
 
36
36
  return true
@@ -41,38 +41,37 @@ module Decidim
41
41
 
42
42
  def create_attachments(first_weight: 0)
43
43
  weight = first_weight
44
- # Add the weights first to the old attachments
45
- attachment_ids = keep_ids
46
- Decidim::Attachment.where(id: attachment_ids).each do |attachment|
47
- attachment.update!(weight:)
44
+ # Add the weights first to the old documents
45
+ document_ids = keep_ids
46
+ Decidim::Attachment.where(id: document_ids).each do |document|
47
+ document.update!(weight:)
48
48
  weight += 1
49
49
  end
50
- @attachments.map! do |attachment|
51
- attachment.weight = weight
52
- attachment.attached_to = attachments_attached_to
53
- attachment.save!
50
+ @documents.map! do |document|
51
+ document.weight = weight
52
+ document.attached_to = documents_attached_to
53
+ document.save!
54
54
  weight += 1
55
- @form.attachments << attachment
55
+ @form.documents << document
56
56
  end
57
57
  end
58
58
 
59
- def attachment_cleanup!(include_all_attachments: false)
60
- attachments = include_all_attachments ? attachments_attached_to.attachments.with_attached_file : attachments_attached_to.attachments
59
+ def document_cleanup!(include_all_attachments: false)
60
+ documents = include_all_attachments ? documents_attached_to.attachments.with_attached_file : documents_attached_to.documents
61
61
 
62
- attachments.each do |attachment|
63
- attachment.destroy! unless keep_ids.include?(attachment.id)
62
+ documents.each do |document|
63
+ document.destroy! unless keep_ids.include?(document.id)
64
64
  end
65
65
 
66
- attachments_attached_to.reload
67
- attachments_attached_to.instance_variable_set(:@attachments, nil)
68
- attachments_attached_to.instance_variable_set(:@photos, nil)
66
+ documents_attached_to.reload
67
+ documents_attached_to.instance_variable_set(:@documents, nil)
69
68
  end
70
69
 
71
70
  def process_attachments?
72
- @form.add_attachments.any?
71
+ @form.add_documents.any?
73
72
  end
74
73
 
75
- def attachments_attached_to
74
+ def documents_attached_to
76
75
  return @attached_to if @attached_to.present?
77
76
  return form.current_organization if form.respond_to?(:current_organization)
78
77
 
@@ -102,8 +101,8 @@ module Decidim
102
101
  end
103
102
 
104
103
  def keep_ids
105
- attachments_array = Array(@form.attachments)
106
- attachments_array.map do |doc|
104
+ documents_array = Array(@form.documents)
105
+ documents_array.map do |doc|
107
106
  case doc
108
107
  when Decidim::Attachment
109
108
  doc.id
@@ -7,10 +7,10 @@ module Decidim
7
7
 
8
8
  # Public: Initializes the command.
9
9
  #
10
- # @param term: The term to search for.
11
- # @param organization: The Organization to which the results are constrained.
12
- # @param filters: (optional) A Hash of SearchableResource attributes to filter for.
13
- # @param page_params: (optional) A Hash with `page` and `per_page` options to paginate.
10
+ # @param term [String] - The term to search for.
11
+ # @param organization [Decidim::Organization] - The Organization to which the results are constrained.
12
+ # @param filters [Hash] - (optional) A Hash of SearchableResource attributes to filter for.
13
+ # @param page_params [Hash] - (optional) A Hash with `page` and `per_page` options to paginate.
14
14
  def initialize(term, organization, filters = {}, page_params = {})
15
15
  @term = term
16
16
  @organization = organization
@@ -91,7 +91,7 @@ module Decidim
91
91
  query = query.where(decidim_participatory_space: spaces)
92
92
  end
93
93
 
94
- query = query.order("datetime DESC")
94
+ query = query.order(datetime: :desc)
95
95
  query = query.global_search(I18n.transliterate(term)) if term.present?
96
96
  query
97
97
  end
@@ -15,7 +15,7 @@ module Decidim
15
15
  def ajax_user_has_no_permission
16
16
  return user_has_no_permission unless request.xhr?
17
17
 
18
- render json: { message: I18n.t("actions.unauthorized", scope: "decidim.core") }, status: :unprocessable_entity
18
+ render json: { message: I18n.t("actions.unauthorized", scope: "decidim.core") }, status: :unprocessable_content
19
19
  end
20
20
  end
21
21
  end
@@ -9,8 +9,6 @@ module Decidim
9
9
  include Decidim::OnboardingActionMethods
10
10
 
11
11
  included do
12
- protected
13
-
14
12
  def after_sign_in_path_for(user)
15
13
  if user.present? && user.blocked?
16
14
  check_user_block_status(user)
@@ -23,8 +21,6 @@ module Decidim
23
21
  end
24
22
  end
25
23
 
26
- private
27
-
28
24
  # Calling the `stored_location_for` method removes the key, so in order
29
25
  # to check if there is any pending redirect after login I need to call
30
26
  # this method and use the value to set a pending redirect. This is the
@@ -41,16 +41,10 @@ module Decidim
41
41
 
42
42
  layout "layouts/decidim/application"
43
43
 
44
- # Ensure locale is set before Devise's own prepended callbacks and reset
45
- # after the request finishes.
46
- prepend_around_action :set_current_locale
47
-
48
44
  # Saves the location before loading each page so we can return to the
49
45
  # right page.
50
46
  before_action :store_current_location
51
47
 
52
- protected
53
-
54
48
  def permission_class_chain
55
49
  PermissionsRegistry.chain_for(DeviseControllers)
56
50
  end
@@ -64,12 +58,6 @@ module Decidim
64
58
 
65
59
  store_location_for(:user, redirect_url)
66
60
  end
67
-
68
- def set_current_locale(&)
69
- locale = detect_locale
70
- locale = default_locale unless available_locales.include?(locale)
71
- I18n.with_locale(locale, &)
72
- end
73
61
  end
74
62
  end
75
63
  end
@@ -6,6 +6,7 @@ module Decidim
6
6
 
7
7
  included do
8
8
  include Decidim::NeedsOrganization
9
+
9
10
  skip_before_action :verify_organization
10
11
 
11
12
  before_action :check_organization!,
@@ -18,14 +19,14 @@ module Decidim
18
19
  # We skip the validation if we are in system panel. `current_admin` refers to the main system admin user.
19
20
  return if current_admin.present?
20
21
 
21
- head :unprocessable_entity unless [
22
+ head :unprocessable_content unless [
22
23
  maximum_allowed_size.try(:to_i) >= blob_args[:byte_size].try(:to_i),
23
24
  content_types.any? { |pattern| pattern.match?(blob_args[:content_type]) },
24
25
  content_types.any? { |pattern| pattern.match?(MiniMime.lookup_by_extension(extension)&.content_type) },
25
26
  allowed_extensions.any? { |pattern| pattern.match?(extension) }
26
27
  ].all?
27
28
  rescue NoMethodError
28
- head :unprocessable_entity
29
+ head :unprocessable_content
29
30
  end
30
31
 
31
32
  def extension
@@ -7,8 +7,6 @@ module Decidim
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- private
11
-
12
10
  def redirect_back(fallback_location:, allow_other_host: true, **args) # rubocop:disable Lint/UnusedMethodArgument
13
11
  super(fallback_location:, allow_other_host: Decidim.allow_open_redirects, **args)
14
12
  end
@@ -78,7 +78,7 @@ module Decidim
78
78
  end
79
79
  paths_list.prepend(
80
80
  pending_authorizations_path,
81
- decidim.page_path(terms_of_service_page)
81
+ decidim.page_path(terms_of_service_page, locale: current_locale)
82
82
  )
83
83
 
84
84
  paths_list.find { |el| /\A#{URI.parse(el).path}/.match?(request.path) }
@@ -11,8 +11,6 @@ module Decidim
11
11
  # this way we can use Rails' form helpers and have automatically checked checkboxes and
12
12
  # radio buttons in the view, for example.
13
13
  class Filter
14
- private
15
-
16
14
  def initialize(filter)
17
15
  @filter = filter
18
16
  end
@@ -38,12 +38,21 @@ module Decidim
38
38
  default_unauthorized_paths + Decidim::StaticPage.where(
39
39
  organization: current_organization,
40
40
  allow_public_access: true
41
- ).pluck(Arel.sql("CONCAT('/pages/', slug)"))
41
+ ).pluck(
42
+ Arel::Nodes::Concat.new(
43
+ Arel::Nodes.build_quoted("/#{current_locale}/pages/"),
44
+ Arel::Table.new(Decidim::StaticPage.table_name)[:slug]
45
+ )
46
+ )
42
47
  end
43
48
 
44
49
  def default_unauthorized_paths
45
50
  # /locale is for changing the locale and /manifest.webmanifest to request PWA manifest
46
51
  %w(/locale /manifest.webmanifest)
47
52
  end
53
+
54
+ def current_locale
55
+ @current_locale ||= I18n.locale.to_s
56
+ end
48
57
  end
49
58
  end
@@ -26,8 +26,6 @@ module Decidim
26
26
  @current_user ||= managed_user || real_user
27
27
  end
28
28
 
29
- private
30
-
31
29
  # Clear the `@real_user` instance variable because otherwise that would be
32
30
  # the return value for any `current_user` calls after the user has already
33
31
  # signed out.
@@ -49,6 +47,8 @@ module Decidim
49
47
  ((impersonation_session_ends_at - Time.current) / 60).round
50
48
  end
51
49
 
50
+ private
51
+
52
52
  def current_user_impersonated?
53
53
  current_user && impersonation_log.present?
54
54
  end
@@ -71,6 +71,10 @@ module Decidim
71
71
  # Prevent redirect on non-HTML responses, because we want redirect AFTER impersonation.js inits a reload.
72
72
  return if request && request.negotiate_mime([Mime[:html]]).blank?
73
73
  return unless can_impersonate_users?
74
+
75
+ # Keep the expiration check in sync with the active impersonation log so
76
+ # the redirect happens in the same request when the session just expired.
77
+ impersonation_log&.ensure_not_expired!
74
78
  return unless expired_log
75
79
 
76
80
  expired_log.update!(ended_at: Time.current)
@@ -21,9 +21,20 @@ module Decidim
21
21
  else
22
22
  locale = default_locale
23
23
  end
24
+
24
25
  I18n.with_locale(locale, &)
25
26
  end
26
27
 
28
+ # Adds the current locale to all the URLs generated by url_for so users
29
+ # experience a consistent behaviour if they copy or share links.
30
+ #
31
+ # Returns a Hash.
32
+ def default_url_options
33
+ return {} if locale_in_script_name?
34
+
35
+ { locale: current_locale }
36
+ end
37
+
27
38
  # The current locale for the user. Available as a helper for the views.
28
39
  #
29
40
  # Returns a String.
@@ -131,18 +142,6 @@ module Decidim
131
142
  uri.to_s
132
143
  end
133
144
 
134
- private
135
-
136
- # Adds the current locale to all the URLs generated by url_for so users
137
- # experience a consistent behaviour if they copy or share links.
138
- #
139
- # Returns a Hash.
140
- def default_url_options
141
- return {} if current_locale == default_locale.to_s
142
-
143
- { locale: current_locale }
144
- end
145
-
146
145
  def locale_in_script_name?
147
146
  script_name = request&.script_name.to_s
148
147
  return false if script_name.blank?
@@ -41,11 +41,19 @@ module Decidim
41
41
  component_settings: try(:component_settings),
42
42
  current_organization: try(:current_organization),
43
43
  current_component: try(:current_component),
44
- share_token: store_share_token
44
+ share_token: try(:store_share_token)
45
45
  }
46
46
  end
47
47
 
48
- public
48
+ def enforce_permission_to(action, subject, extra_context = {})
49
+ if Rails.env.development?
50
+ Rails.logger.debug "==========="
51
+ Rails.logger.debug [permission_scope, action, subject, permission_class_chain].map(&:inspect).join("\n")
52
+ Rails.logger.debug "==========="
53
+ end
54
+
55
+ raise Decidim::ActionForbidden unless allowed_to?(action, subject, extra_context)
56
+ end
49
57
 
50
58
  # rubocop:disable Metrics/ParameterLists
51
59
  def allowed_to?(action, subject, extra_context = {}, chain = permission_class_chain, user = current_user, scope = nil)
@@ -68,18 +76,6 @@ module Decidim
68
76
  allowed_to?(action, subject, extra_context, chain, user, :admin)
69
77
  end
70
78
 
71
- protected
72
-
73
- def enforce_permission_to(action, subject, extra_context = {})
74
- if Rails.env.development?
75
- Rails.logger.debug "==========="
76
- Rails.logger.debug [permission_scope, action, subject, permission_class_chain].map(&:inspect).join("\n")
77
- Rails.logger.debug "==========="
78
- end
79
-
80
- raise Decidim::ActionForbidden unless allowed_to?(action, subject, extra_context)
81
- end
82
-
83
79
  def permission_class_chain
84
80
  raise "Please, make this method return an array of permission classes"
85
81
  end
@@ -87,14 +83,6 @@ module Decidim
87
83
  def permission_scope
88
84
  raise "Please, make this method return a symbol"
89
85
  end
90
-
91
- private
92
-
93
- def store_share_token
94
- session[:share_token] = params[:share_token] if params.has_key?(:share_token)
95
-
96
- session[:share_token].presence
97
- end
98
86
  end
99
87
  end
100
88
  end
@@ -43,7 +43,7 @@ module Decidim
43
43
  end
44
44
 
45
45
  def tos_path
46
- decidim.page_path terms_of_service_page
46
+ decidim.page_path terms_of_service_page, locale: current_locale
47
47
  end
48
48
 
49
49
  def redirect_to_tos
@@ -21,8 +21,6 @@ module Decidim
21
21
  OnboardingManager.new(user).pending_action?
22
22
  end
23
23
 
24
- private
25
-
26
24
  def store_onboarding_cookie_data!(user)
27
25
  data = onboarding_cookie_data
28
26
  return if data.nil?