decidim-core 0.26.2 → 0.27.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 (543) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/cells/decidim/amendable/announcement_cell.rb +3 -8
  4. data/app/cells/decidim/announcement_cell.rb +1 -1
  5. data/app/cells/decidim/author_cell.rb +1 -1
  6. data/app/cells/decidim/content_blocks/footer_sub_hero/show.erb +1 -1
  7. data/app/cells/decidim/content_blocks/hero/show.erb +1 -1
  8. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +3 -3
  9. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +1 -1
  10. data/app/cells/decidim/content_blocks/how_to_participate/show.erb +1 -1
  11. data/app/cells/decidim/content_blocks/last_activity/show.erb +1 -1
  12. data/app/cells/decidim/content_blocks/last_activity_cell.rb +3 -3
  13. data/app/cells/decidim/content_blocks/stats_cell.rb +4 -4
  14. data/app/cells/decidim/content_blocks/sub_hero/show.erb +1 -1
  15. data/app/cells/decidim/data_consent/category.erb +64 -0
  16. data/app/cells/decidim/data_consent/dialog.erb +29 -0
  17. data/app/cells/decidim/data_consent/modal.erb +39 -0
  18. data/app/cells/decidim/data_consent/show.erb +3 -0
  19. data/app/cells/decidim/data_consent_cell.rb +21 -0
  20. data/app/cells/decidim/follow_button_cell.rb +5 -7
  21. data/app/cells/decidim/profile_sidebar_cell.rb +1 -1
  22. data/app/cells/decidim/search_results_cell.rb +1 -1
  23. data/app/cells/decidim/tos_page/refuse_btn_modal.erb +1 -1
  24. data/app/cells/decidim/upload_modal/files.erb +52 -0
  25. data/app/cells/decidim/upload_modal/modal.erb +49 -0
  26. data/app/cells/decidim/upload_modal/show.erb +3 -0
  27. data/app/cells/decidim/upload_modal_cell.rb +205 -0
  28. data/app/cells/decidim/user_conversation/reply.erb +1 -1
  29. data/app/cells/decidim/user_conversations/add_conversation_users.erb +5 -3
  30. data/app/cells/decidim/version_cell.rb +2 -13
  31. data/app/cells/decidim/versions_list_cell.rb +2 -13
  32. data/app/cells/decidim/versions_list_item_cell.rb +2 -13
  33. data/app/commands/decidim/accept_group_invitation.rb +1 -1
  34. data/app/commands/decidim/accept_user_group_join_request.rb +1 -1
  35. data/app/commands/decidim/amendable/accept.rb +1 -1
  36. data/app/commands/decidim/amendable/create_draft.rb +1 -1
  37. data/app/commands/decidim/amendable/destroy_draft.rb +1 -1
  38. data/app/commands/decidim/amendable/promote.rb +1 -1
  39. data/app/commands/decidim/amendable/publish_draft.rb +1 -1
  40. data/app/commands/decidim/amendable/reject.rb +1 -1
  41. data/app/commands/decidim/amendable/update_draft.rb +1 -1
  42. data/app/commands/decidim/amendable/withdraw.rb +1 -1
  43. data/app/commands/decidim/attachment_methods.rb +3 -2
  44. data/app/commands/decidim/create_editor_image.rb +1 -1
  45. data/app/commands/decidim/create_follow.rb +1 -1
  46. data/app/commands/decidim/create_omniauth_registration.rb +2 -3
  47. data/app/commands/decidim/create_registration.rb +1 -2
  48. data/app/commands/decidim/create_report.rb +1 -1
  49. data/app/commands/decidim/create_user_group.rb +2 -2
  50. data/app/commands/decidim/create_user_report.rb +5 -3
  51. data/app/commands/decidim/delete_follow.rb +1 -1
  52. data/app/commands/decidim/demote_membership.rb +1 -1
  53. data/app/commands/decidim/destroy_account.rb +1 -1
  54. data/app/commands/decidim/endorse_resource.rb +1 -1
  55. data/app/commands/decidim/gallery_methods.rb +45 -10
  56. data/app/commands/decidim/invite_user.rb +1 -3
  57. data/app/commands/decidim/invite_user_again.rb +1 -1
  58. data/app/commands/decidim/invite_user_to_group.rb +1 -1
  59. data/app/commands/decidim/join_user_group.rb +1 -1
  60. data/app/commands/decidim/leave_user_group.rb +8 -2
  61. data/app/commands/decidim/messaging/reply_to_conversation.rb +2 -2
  62. data/app/commands/decidim/messaging/start_conversation.rb +2 -2
  63. data/app/commands/decidim/multiple_attachments_methods.rb +44 -5
  64. data/app/commands/decidim/promote_membership.rb +1 -1
  65. data/app/commands/decidim/reject_group_invitation.rb +1 -1
  66. data/app/commands/decidim/reject_user_group_join_request.rb +1 -1
  67. data/app/commands/decidim/remove_user_from_group.rb +1 -1
  68. data/app/commands/decidim/resend_confirmation_instructions.rb +18 -0
  69. data/app/commands/decidim/search.rb +10 -9
  70. data/app/commands/decidim/unendorse_resource.rb +1 -1
  71. data/app/commands/decidim/unsubscribe_settings.rb +1 -1
  72. data/app/commands/decidim/update_account.rb +2 -2
  73. data/app/commands/decidim/update_notifications_settings.rb +3 -2
  74. data/app/commands/decidim/update_password.rb +31 -0
  75. data/app/commands/decidim/update_user_group.rb +2 -2
  76. data/app/commands/decidim/update_user_interests.rb +1 -1
  77. data/app/commands/decidim/validate_upload.rb +15 -0
  78. data/app/controllers/concerns/decidim/devise_controllers.rb +0 -1
  79. data/app/controllers/concerns/decidim/filter_resource.rb +23 -24
  80. data/app/controllers/concerns/decidim/force_authentication.rb +1 -2
  81. data/app/controllers/concerns/decidim/http_caching_disabler.rb +1 -1
  82. data/app/controllers/concerns/decidim/needs_password_change.rb +43 -0
  83. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +3 -3
  84. data/app/controllers/concerns/decidim/orderable.rb +1 -1
  85. data/app/controllers/concerns/decidim/participatory_space_context.rb +2 -2
  86. data/app/controllers/decidim/account_controller.rb +45 -0
  87. data/app/controllers/decidim/application_controller.rb +1 -1
  88. data/app/controllers/decidim/devise/invitations_controller.rb +2 -0
  89. data/app/controllers/decidim/devise/passwords_controller.rb +33 -0
  90. data/app/controllers/decidim/devise/registrations_controller.rb +2 -0
  91. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  92. data/app/controllers/decidim/{data_portability_controller.rb → download_your_data_controller.rb} +8 -8
  93. data/app/controllers/decidim/groups_controller.rb +5 -0
  94. data/app/controllers/decidim/last_activities_controller.rb +7 -9
  95. data/app/controllers/decidim/manifests_controller.rb +11 -0
  96. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  97. data/app/controllers/decidim/notifications_subscriptions_controller.rb +16 -0
  98. data/app/controllers/decidim/offline_controller.rb +7 -0
  99. data/app/controllers/decidim/profiles_controller.rb +1 -1
  100. data/app/controllers/decidim/searches_controller.rb +4 -3
  101. data/app/controllers/decidim/short_links_controller.rb +35 -0
  102. data/app/controllers/decidim/upload_validations_controller.rb +44 -0
  103. data/app/controllers/decidim/user_activities_controller.rb +32 -16
  104. data/app/controllers/decidim/user_interests_controller.rb +0 -2
  105. data/app/controllers/decidim/user_timeline_controller.rb +6 -8
  106. data/app/events/decidim/change_nickname_event.rb +21 -0
  107. data/app/forms/decidim/account_form.rb +7 -6
  108. data/app/forms/decidim/form.rb +1 -1
  109. data/app/forms/decidim/messaging/conversation_form.rb +1 -1
  110. data/app/forms/decidim/notifications_settings_form.rb +8 -2
  111. data/app/forms/decidim/password_form.rb +10 -0
  112. data/app/forms/decidim/registration_form.rb +10 -4
  113. data/app/forms/decidim/upload_validation_form.rb +54 -0
  114. data/app/forms/decidim/user_group_form.rb +1 -1
  115. data/app/forms/decidim/user_interest_scope_form.rb +1 -1
  116. data/app/forms/decidim/user_interests_form.rb +1 -1
  117. data/app/forms/translatable_presence_validator.rb +2 -2
  118. data/app/forms/url_validator.rb +1 -1
  119. data/app/helpers/decidim/application_helper.rb +2 -2
  120. data/app/helpers/decidim/attachments_helper.rb +1 -1
  121. data/app/helpers/decidim/cells_paginate_helper.rb +1 -1
  122. data/app/helpers/decidim/datalist_select_helper.rb +40 -0
  123. data/app/helpers/decidim/decidim_form_helper.rb +1 -1
  124. data/app/helpers/decidim/followable_helper.rb +1 -1
  125. data/app/helpers/decidim/icon_helper.rb +1 -1
  126. data/app/helpers/decidim/layout_helper.rb +15 -1
  127. data/app/helpers/decidim/map_helper.rb +12 -8
  128. data/app/helpers/decidim/meta_tags_helper.rb +0 -2
  129. data/app/helpers/decidim/notifications_settings_helper.rb +15 -0
  130. data/app/helpers/decidim/passwords_helper.rb +41 -0
  131. data/app/helpers/decidim/sanitize_helper.rb +1 -0
  132. data/app/helpers/decidim/searches_helper.rb +6 -6
  133. data/app/helpers/decidim/short_link_helper.rb +28 -0
  134. data/app/helpers/decidim/translations_helper.rb +2 -2
  135. data/app/jobs/decidim/{data_portability_export_job.rb → download_your_data_export_job.rb} +5 -5
  136. data/app/jobs/decidim/email_notifications_digest_generator_job.rb +21 -0
  137. data/app/jobs/decidim/notification_generator_for_recipient_job.rb +5 -3
  138. data/app/jobs/decidim/reminder_generator_job.rb +12 -0
  139. data/app/jobs/decidim/resend_confirmation_instructions_job.rb +11 -0
  140. data/app/jobs/decidim/user_report_job.rb +2 -2
  141. data/app/mailers/concerns/decidim/multitenant_asset_host.rb +11 -3
  142. data/app/mailers/decidim/application_mailer.rb +1 -1
  143. data/app/mailers/decidim/block_user_mailer.rb +8 -7
  144. data/app/mailers/decidim/export_mailer.rb +2 -2
  145. data/app/mailers/decidim/newsletter_mailer.rb +2 -2
  146. data/app/mailers/decidim/newsletters_opt_in_mailer.rb +7 -5
  147. data/app/mailers/decidim/notifications_digest_mailer.rb +23 -0
  148. data/app/mailers/decidim/user_report_mailer.rb +10 -11
  149. data/app/models/decidim/action_log.rb +86 -2
  150. data/app/models/decidim/amendment.rb +0 -1
  151. data/app/models/decidim/area.rb +1 -2
  152. data/app/models/decidim/area_type.rb +5 -0
  153. data/app/models/decidim/attachment.rb +6 -0
  154. data/app/models/decidim/attachment_collection.rb +5 -0
  155. data/app/models/decidim/category.rb +9 -4
  156. data/app/models/decidim/coauthorship.rb +0 -2
  157. data/app/models/decidim/contextual_help_section.rb +5 -1
  158. data/app/models/decidim/follow.rb +2 -2
  159. data/app/models/decidim/gamification/badge_score.rb +0 -1
  160. data/app/models/decidim/identity.rb +2 -2
  161. data/app/models/decidim/messaging/conversation.rb +4 -4
  162. data/app/models/decidim/messaging/message.rb +1 -2
  163. data/app/models/decidim/messaging/participation.rb +0 -2
  164. data/app/models/decidim/messaging/receipt.rb +0 -2
  165. data/app/models/decidim/notification.rb +5 -2
  166. data/app/models/decidim/oauth_application.rb +12 -1
  167. data/app/models/decidim/organization.rb +7 -7
  168. data/app/models/decidim/participatory_space_private_user.rb +4 -2
  169. data/app/models/decidim/permission_action.rb +1 -0
  170. data/app/models/decidim/reminder.rb +10 -0
  171. data/app/models/decidim/reminder_delivery.rb +7 -0
  172. data/app/models/decidim/reminder_record.rb +29 -0
  173. data/app/models/decidim/report.rb +2 -2
  174. data/app/models/decidim/scope.rb +3 -4
  175. data/app/models/decidim/scope_type.rb +5 -0
  176. data/app/models/decidim/share_token.rb +0 -2
  177. data/app/models/decidim/short_link.rb +162 -0
  178. data/app/models/decidim/user.rb +34 -6
  179. data/app/models/decidim/user_base_entity.rb +1 -1
  180. data/app/models/decidim/user_group.rb +3 -3
  181. data/app/models/decidim/user_moderation.rb +0 -2
  182. data/app/models/decidim/user_report.rb +2 -2
  183. data/app/packs/entrypoints/decidim_core.js +2 -2
  184. data/app/packs/entrypoints/decidim_sw.js +1 -0
  185. data/app/packs/src/decidim/autocomplete.js +298 -0
  186. data/app/packs/src/decidim/cookie_consent/consent_manager.js +133 -0
  187. data/app/packs/src/decidim/cookie_consent/cookie_consent.js +103 -0
  188. data/app/packs/src/decidim/datalist_select.js +36 -0
  189. data/app/packs/src/decidim/direct_uploads/upload_field.js +117 -0
  190. data/app/packs/src/decidim/direct_uploads/upload_modal.js +264 -0
  191. data/app/packs/src/decidim/direct_uploads/upload_utility.js +49 -0
  192. data/app/packs/src/decidim/direct_uploads/uploader.js +89 -0
  193. data/app/packs/src/decidim/external_domain_warning.js +1 -1
  194. data/app/packs/src/decidim/external_link.js +14 -3
  195. data/app/packs/src/decidim/external_link.test.js +64 -0
  196. data/app/packs/src/decidim/geocoding.js +10 -35
  197. data/app/packs/src/decidim/identity_selector_dialog.js +1 -1
  198. data/app/packs/src/decidim/impersonation.js +3 -3
  199. data/app/packs/src/decidim/input_character_counter.js +177 -7
  200. data/app/packs/src/decidim/input_multiple_mentions.js +87 -187
  201. data/app/packs/src/decidim/map/factory.js +3 -1
  202. data/app/packs/src/decidim/map/icon.js +2 -1
  203. data/app/packs/src/decidim/map/legacy.js +2 -2
  204. data/app/packs/src/decidim/map/svg-icon.js +248 -0
  205. data/app/packs/src/decidim/map.js +2 -2
  206. data/app/packs/src/decidim/security/selfxss_warning.js +5 -1
  207. data/app/packs/src/decidim/session_timeouter.js +15 -15
  208. data/app/packs/src/decidim/sw/a2hs.js +28 -0
  209. data/app/packs/src/decidim/sw/index.js +3 -0
  210. data/app/packs/src/decidim/sw/loader.js +18 -0
  211. data/app/packs/src/decidim/sw/push-permissions.js +87 -0
  212. data/app/packs/src/decidim/sw/sw.js +80 -0
  213. data/app/packs/src/decidim/vizzs/areachart.js +33 -28
  214. data/app/packs/src/decidim/vizzs/{metrics.js → index.js} +0 -0
  215. data/app/packs/src/decidim/vizzs/linechart.js +23 -18
  216. data/app/packs/src/decidim/vizzs/rowchart.js +15 -11
  217. data/app/packs/stylesheets/decidim/email.scss +66 -0
  218. data/app/packs/stylesheets/decidim/layouts/_user.scss +8 -0
  219. data/app/packs/stylesheets/decidim/modules/_autocomplete.scss +99 -0
  220. data/app/packs/stylesheets/decidim/modules/_cookie-consent.scss +115 -0
  221. data/app/packs/stylesheets/decidim/modules/_footer.scss +4 -0
  222. data/app/packs/stylesheets/decidim/modules/_input-multiple-mentions.scss +29 -2
  223. data/app/packs/stylesheets/decidim/modules/_modules.scss +3 -1
  224. data/app/packs/stylesheets/decidim/modules/_reveal.scss +15 -0
  225. data/app/packs/stylesheets/decidim/modules/_upload_modal.scss +143 -0
  226. data/app/packs/stylesheets/decidim/utils/_fontface.scss +3 -0
  227. data/app/permissions/decidim/permissions.rb +2 -4
  228. data/app/presenters/decidim/admin_log/area_type_presenter.rb +34 -0
  229. data/app/presenters/decidim/admin_log/attachment_collection_presenter.rb +35 -0
  230. data/app/presenters/decidim/admin_log/attachment_presenter.rb +27 -0
  231. data/app/presenters/decidim/admin_log/category_presenter.rb +36 -0
  232. data/app/presenters/decidim/admin_log/component_presenter.rb +35 -3
  233. data/app/presenters/decidim/admin_log/contextual_help_section_presenter.rb +33 -0
  234. data/app/presenters/decidim/admin_log/organization_presenter.rb +9 -4
  235. data/app/presenters/decidim/admin_log/scope_type_presenter.rb +34 -0
  236. data/app/presenters/decidim/home_stats_presenter.rb +4 -2
  237. data/app/presenters/decidim/log/base_presenter.rb +1 -1
  238. data/app/presenters/decidim/menu_item_presenter.rb +1 -1
  239. data/app/presenters/decidim/metric_charts_presenter.rb +7 -1
  240. data/app/presenters/decidim/nil_presenter.rb +3 -1
  241. data/app/presenters/decidim/notification_to_mailer_presenter.rb +39 -0
  242. data/app/presenters/decidim/notifications_digest_presenter.rb +42 -0
  243. data/app/presenters/decidim/official_author_presenter.rb +4 -0
  244. data/app/presenters/decidim/organization_presenter.rb +22 -0
  245. data/app/presenters/decidim/push_notification_presenter.rb +24 -0
  246. data/app/presenters/decidim/stats_presenter.rb +1 -1
  247. data/app/presenters/decidim/validation_errors_presenter.rb +1 -1
  248. data/app/queries/decidim/messaging/user_conversations.rb +1 -1
  249. data/app/queries/decidim/metric_manage.rb +1 -1
  250. data/app/queries/decidim/own_activities.rb +11 -0
  251. data/app/queries/decidim/participatory_processes_with_user_role.rb +1 -1
  252. data/app/{services/decidim/activity_search.rb → queries/decidim/public_activities.rb} +35 -77
  253. data/app/queries/decidim/public_components.rb +1 -1
  254. data/app/queries/decidim/similar_emendations.rb +1 -1
  255. data/app/queries/decidim/stats_users_count.rb +1 -1
  256. data/app/queries/decidim/user_groups/accepted_memberships.rb +1 -1
  257. data/app/queries/decidim/user_groups/accepted_user_groups.rb +1 -1
  258. data/app/queries/decidim/user_groups/accepted_users.rb +1 -1
  259. data/app/queries/decidim/user_groups/admin_memberships.rb +1 -1
  260. data/app/queries/decidim/user_groups/invited_memberships.rb +1 -1
  261. data/app/queries/decidim/user_groups/manageable_user_groups.rb +1 -1
  262. data/app/queries/decidim/user_groups/member_memberships.rb +1 -1
  263. data/app/services/decidim/{data_portability_exporter.rb → download_your_data_exporter.rb} +6 -6
  264. data/app/services/decidim/email_notification_generator.rb +2 -2
  265. data/app/services/decidim/engine_resolver.rb +66 -0
  266. data/app/services/decidim/events_manager.rb +1 -1
  267. data/app/services/decidim/iframe_disabler.rb +31 -0
  268. data/app/services/decidim/notification_generator_for_recipient.rb +1 -1
  269. data/app/services/decidim/notifications_digest_sending_decider.rb +18 -0
  270. data/app/services/decidim/notifications_subscriptions_persistor.rb +37 -0
  271. data/app/services/decidim/open_data_exporter.rb +1 -1
  272. data/app/services/decidim/resource_search.rb +17 -164
  273. data/app/services/decidim/send_push_notification.rb +59 -0
  274. data/app/services/decidim/traceability.rb +1 -1
  275. data/app/uploaders/decidim/application_uploader.rb +2 -12
  276. data/app/uploaders/decidim/cw/attachment_uploader.rb +1 -1
  277. data/app/uploaders/decidim/cw/{data_portability_uploader.rb → download_your_data_uploader.rb} +3 -3
  278. data/app/uploaders/decidim/cw/image_uploader.rb +2 -2
  279. data/app/uploaders/decidim/organization_favicon_uploader.rb +3 -2
  280. data/app/validators/passthru_validator.rb +29 -21
  281. data/app/validators/password_validator.rb +25 -4
  282. data/app/validators/uploader_image_dimensions_validator.rb +1 -1
  283. data/app/views/decidim/account/_account_notification.js.erb +20 -0
  284. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  285. data/app/views/decidim/account/cancel_email_change.js.erb +6 -0
  286. data/app/views/decidim/account/resend_confirmation_instructions.erb +1 -0
  287. data/app/views/decidim/account/show.html.erb +19 -6
  288. data/app/views/decidim/application/{_attachments.html.erb → _attachments.erb} +2 -2
  289. data/app/views/decidim/application/_collection.html.erb +1 -1
  290. data/app/views/decidim/application/{_document.html.erb → _document.erb} +0 -0
  291. data/app/views/decidim/application/{_documents.html.erb → _documents.erb} +2 -2
  292. data/app/views/decidim/application/{_photos.html.erb → _photos.erb} +0 -0
  293. data/app/views/decidim/devise/confirmations/new.html.erb +1 -1
  294. data/app/views/decidim/devise/invitations/edit.html.erb +3 -4
  295. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +3 -3
  296. data/app/views/decidim/devise/passwords/edit.html.erb +7 -5
  297. data/app/views/decidim/devise/passwords/new.html.erb +1 -1
  298. data/app/views/decidim/devise/registrations/edit.html.erb +5 -5
  299. data/app/views/decidim/devise/registrations/new.html.erb +5 -5
  300. data/app/views/decidim/devise/sessions/new.html.erb +2 -2
  301. data/app/views/decidim/{data_portability → download_your_data}/export.html.erb +0 -0
  302. data/app/views/decidim/{data_portability → download_your_data}/show.html.erb +2 -2
  303. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +7 -0
  304. data/app/views/decidim/last_activities/index.html.erb +1 -1
  305. data/app/views/decidim/manifests/show.json.erb +31 -0
  306. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +5 -3
  307. data/app/views/decidim/messaging/conversations/_reply.html.erb +1 -1
  308. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -3
  309. data/app/views/decidim/messaging/conversations/create.js.erb +1 -0
  310. data/app/views/decidim/notifications_digest_mailer/_email_content.html.erb +11 -0
  311. data/app/views/decidim/notifications_digest_mailer/digest_mail.erb +27 -0
  312. data/app/views/decidim/notifications_settings/show.html.erb +34 -9
  313. data/app/views/decidim/offline/show.html.erb +9 -0
  314. data/app/views/decidim/pages/_standalone.html.erb +1 -1
  315. data/app/views/decidim/reported_mailer/hide.html.erb +1 -1
  316. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  317. data/app/views/decidim/scopes/picker.html.erb +1 -1
  318. data/app/views/decidim/searches/_filters.html.erb +2 -2
  319. data/app/views/decidim/shared/participatory_space_filters/_filters.html.erb +3 -3
  320. data/app/views/decidim/user_report_mailer/notify.html.erb +10 -3
  321. data/app/views/devise/mailer/confirmation_instructions.html.erb +3 -1
  322. data/app/views/layouts/decidim/_application.html.erb +6 -3
  323. data/app/views/layouts/decidim/_cookie_warning.html.erb +8 -8
  324. data/app/views/layouts/decidim/_decidim_javascript.html.erb +12 -0
  325. data/app/views/layouts/decidim/_head.html.erb +4 -2
  326. data/app/views/layouts/decidim/_js_configuration.html.erb +5 -1
  327. data/app/views/layouts/decidim/_main_footer.html.erb +1 -0
  328. data/app/views/layouts/decidim/_offline_banner.html.erb +11 -0
  329. data/app/views/layouts/decidim/widget.html.erb +2 -2
  330. data/config/assets.rb +1 -0
  331. data/config/locales/am-ET.yml +1 -0
  332. data/config/locales/ar.yml +48 -36
  333. data/config/locales/bg.yml +15 -30
  334. data/config/locales/ca.yml +186 -35
  335. data/config/locales/cs.yml +186 -33
  336. data/config/locales/da.yml +1 -0
  337. data/config/locales/de.yml +25 -36
  338. data/config/locales/el.yml +15 -30
  339. data/config/locales/en.yml +183 -32
  340. data/config/locales/eo.yml +4 -6
  341. data/config/locales/es-MX.yml +185 -34
  342. data/config/locales/es-PY.yml +185 -34
  343. data/config/locales/es.yml +185 -34
  344. data/config/locales/et.yml +1 -0
  345. data/config/locales/eu.yml +15 -36
  346. data/config/locales/fi-plain.yml +184 -33
  347. data/config/locales/fi.yml +184 -33
  348. data/config/locales/fr-CA.yml +170 -33
  349. data/config/locales/fr.yml +170 -33
  350. data/config/locales/ga-IE.yml +5 -7
  351. data/config/locales/gl.yml +47 -30
  352. data/config/locales/hr.yml +1 -0
  353. data/config/locales/hu.yml +65 -35
  354. data/config/locales/id-ID.yml +15 -29
  355. data/config/locales/is-IS.yml +6 -15
  356. data/config/locales/it.yml +22 -38
  357. data/config/locales/ja.yml +173 -34
  358. data/config/locales/ko.yml +1 -0
  359. data/config/locales/lb.yml +16 -32
  360. data/config/locales/lt.yml +1 -0
  361. data/config/locales/lv.yml +15 -28
  362. data/config/locales/mt.yml +1 -0
  363. data/config/locales/nl.yml +25 -33
  364. data/config/locales/no.yml +24 -35
  365. data/config/locales/om-ET.yml +1 -0
  366. data/config/locales/pl.yml +113 -32
  367. data/config/locales/pt-BR.yml +17 -32
  368. data/config/locales/pt.yml +16 -32
  369. data/config/locales/ro-RO.yml +20 -36
  370. data/config/locales/ru.yml +15 -27
  371. data/config/locales/si-LK.yml +1 -0
  372. data/config/locales/sk.yml +15 -30
  373. data/config/locales/sl.yml +1 -0
  374. data/config/locales/so-SO.yml +1 -0
  375. data/config/locales/sr-CS.yml +1 -0
  376. data/config/locales/sv.yml +69 -34
  377. data/config/locales/sw-KE.yml +1 -0
  378. data/config/locales/ti-ER.yml +1 -0
  379. data/config/locales/tr-TR.yml +15 -29
  380. data/config/locales/uk.yml +15 -26
  381. data/config/locales/val-ES.yml +1 -0
  382. data/config/locales/vi.yml +1 -0
  383. data/config/locales/zh-CN.yml +15 -28
  384. data/config/locales/zh-TW.yml +1 -0
  385. data/config/routes.rb +17 -2
  386. data/db/migrate/20180508111710_add_accepted_tos_version_field_to_users.rb +1 -0
  387. data/db/migrate/20181030090144_destroy_deleted_users_follows.rb +1 -0
  388. data/db/migrate/20190412131728_fix_user_names.rb +4 -4
  389. data/db/migrate/20210831181634_add_service_name_to_active_storage_blobs.active_storage.rb +22 -0
  390. data/db/migrate/20210831181635_create_active_storage_variant_records.active_storage.rb +14 -0
  391. data/db/migrate/20211208155453_create_decidim_reminders.rb +11 -0
  392. data/db/migrate/20211209121025_create_decidim_reminder_records.rb +11 -0
  393. data/db/migrate/20211209121040_create_decidim_reminder_deliveries.rb +10 -0
  394. data/db/migrate/20220118121921_change_required_description_categories.rb +7 -0
  395. data/db/migrate/20220127113419_add_notification_settings_to_users.rb +7 -0
  396. data/db/migrate/20220203121137_add_notifications_sending_frequency_to_users.rb +7 -0
  397. data/db/migrate/20220215172439_add_digest_sent_at_to_users.rb +7 -0
  398. data/db/migrate/20220323195258_add_index_to_decidim_users_notifications_sending_frequency.rb +7 -0
  399. data/db/migrate/20220427142214_drop_emails_on_notifications_flag_from_user.rb +15 -0
  400. data/db/migrate/20220518094535_add_previous_passwords_to_users.rb +20 -0
  401. data/db/migrate/20220524195530_create_decidim_short_links.rb +23 -0
  402. data/db/seeds.rb +17 -18
  403. data/lib/decidim/acts_as_tree.rb +47 -0
  404. data/lib/decidim/api/input_sorts/component_input_sort.rb +2 -1
  405. data/lib/decidim/api/interfaces/authorable_interface.rb +6 -5
  406. data/lib/decidim/asset_router.rb +80 -0
  407. data/lib/decidim/attachment_attributes.rb +8 -8
  408. data/lib/decidim/attribute_object/form.rb +174 -0
  409. data/lib/decidim/attribute_object/model.rb +148 -0
  410. data/lib/decidim/attribute_object/nested_validator.rb +22 -0
  411. data/lib/decidim/attribute_object/type_map.rb +14 -0
  412. data/lib/decidim/attribute_object/type_resolver.rb +91 -0
  413. data/lib/decidim/attribute_object.rb +26 -0
  414. data/lib/decidim/attributes/array.rb +62 -0
  415. data/lib/decidim/attributes/blob.rb +20 -0
  416. data/lib/decidim/attributes/clean_string.rb +12 -6
  417. data/lib/decidim/attributes/hash.rb +36 -0
  418. data/lib/decidim/attributes/integer.rb +17 -0
  419. data/lib/decidim/attributes/localized_date.rb +9 -7
  420. data/lib/decidim/attributes/model.rb +24 -0
  421. data/lib/decidim/attributes/object.rb +28 -0
  422. data/lib/decidim/attributes/symbol.rb +23 -0
  423. data/lib/decidim/attributes/time_with_zone.rb +9 -7
  424. data/lib/decidim/attributes.rb +29 -0
  425. data/lib/decidim/authorable.rb +21 -6
  426. data/lib/decidim/authorization_form_builder.rb +9 -11
  427. data/lib/decidim/carrier_wave_migrator_service.rb +15 -15
  428. data/lib/decidim/coauthorable.rb +22 -4
  429. data/lib/decidim/command.rb +44 -0
  430. data/lib/decidim/common_passwords.rb +1 -1
  431. data/lib/decidim/component_manifest.rb +5 -5
  432. data/lib/decidim/component_validator.rb +2 -2
  433. data/lib/decidim/content_block_manifest.rb +1 -1
  434. data/lib/decidim/content_parsers/hashtag_parser.rb +2 -2
  435. data/lib/decidim/content_parsers/resource_parser.rb +1 -1
  436. data/lib/decidim/content_parsers/user_group_parser.rb +1 -1
  437. data/lib/decidim/content_parsers/user_parser.rb +4 -4
  438. data/lib/decidim/content_renderers/hashtag_renderer.rb +1 -1
  439. data/lib/decidim/content_renderers/link_renderer.rb +2 -2
  440. data/lib/decidim/content_renderers/user_group_renderer.rb +1 -1
  441. data/lib/decidim/content_renderers/user_renderer.rb +1 -1
  442. data/lib/decidim/controller_helpers.rb +41 -0
  443. data/lib/decidim/core/engine.rb +29 -18
  444. data/lib/decidim/core/test/factories.rb +48 -8
  445. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +16 -4
  446. data/lib/decidim/core/test/shared_examples/amendable/amendment_form_examples.rb +1 -1
  447. data/lib/decidim/core/test/shared_examples/authorable_interface_examples.rb +15 -2
  448. data/lib/decidim/core/test/shared_examples/coauthorable_interface_examples.rb +2 -2
  449. data/lib/decidim/core/test/shared_examples/comments_examples.rb +203 -0
  450. data/lib/decidim/core/test/shared_examples/localised_email.rb +1 -1
  451. data/lib/decidim/core/test/shared_examples/logo_email.rb +1 -1
  452. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -2
  453. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -6
  454. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +120 -40
  455. data/lib/decidim/core/test/shared_examples/resourceable.rb +0 -6
  456. data/lib/decidim/core/test/shared_examples/searchable_participatory_space_examples.rb +1 -1
  457. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  458. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +3 -3
  459. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +2 -2
  460. data/lib/decidim/core/version.rb +1 -1
  461. data/lib/decidim/core.rb +108 -14
  462. data/lib/decidim/{data_portability.rb → download_your_data.rb} +3 -3
  463. data/lib/decidim/{data_portability_serializers/data_portability_conversation_serializer.rb → download_your_data_serializers/download_your_data_conversation_serializer.rb} +2 -2
  464. data/lib/decidim/{data_portability_serializers/data_portability_follow_serializer.rb → download_your_data_serializers/download_your_data_follow_serializer.rb} +2 -2
  465. data/lib/decidim/{data_portability_serializers/data_portability_identity_serializer.rb → download_your_data_serializers/download_your_data_identity_serializer.rb} +2 -2
  466. data/lib/decidim/{data_portability_serializers/data_portability_notification_serializer.rb → download_your_data_serializers/download_your_data_notification_serializer.rb} +2 -2
  467. data/lib/decidim/{data_portability_serializers/data_portability_participatory_space_private_user_serializer.rb → download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb} +2 -2
  468. data/lib/decidim/{data_portability_serializers/data_portability_report_serializer.rb → download_your_data_serializers/download_your_data_report_serializer.rb} +2 -2
  469. data/lib/decidim/{data_portability_serializers/data_portability_user_group_serializer.rb → download_your_data_serializers/download_your_data_user_group_serializer.rb} +2 -2
  470. data/lib/decidim/{data_portability_serializers/data_portability_user_serializer.rb → download_your_data_serializers/download_your_data_user_serializer.rb} +3 -3
  471. data/lib/decidim/download_your_data_serializers.rb +23 -0
  472. data/lib/decidim/engine_router.rb +7 -1
  473. data/lib/decidim/env.rb +56 -0
  474. data/lib/decidim/event_recorder.rb +25 -0
  475. data/lib/decidim/events/base_event.rb +10 -14
  476. data/lib/decidim/events/simple_event.rb +12 -4
  477. data/lib/decidim/exporters/export_data.rb +1 -1
  478. data/lib/decidim/exporters/export_manifest.rb +2 -1
  479. data/lib/decidim/file_validator_humanizer.rb +24 -1
  480. data/lib/decidim/filterable_resource.rb +55 -0
  481. data/lib/decidim/fingerprint_calculator.rb +2 -4
  482. data/lib/decidim/form_builder.rb +158 -130
  483. data/lib/decidim/gamification/badge.rb +2 -3
  484. data/lib/decidim/gamification/badge_scorer.rb +1 -0
  485. data/lib/decidim/has_area.rb +27 -0
  486. data/lib/decidim/has_attachments.rb +2 -2
  487. data/lib/decidim/has_category.rb +36 -0
  488. data/lib/decidim/importers/import_manifest.rb +3 -21
  489. data/lib/decidim/jsonb_attributes.rb +6 -4
  490. data/lib/decidim/manifest_messages.rb +23 -0
  491. data/lib/decidim/map/autocomplete.rb +6 -4
  492. data/lib/decidim/map/frontend.rb +2 -2
  493. data/lib/decidim/map/provider/geocoding/here.rb +5 -5
  494. data/lib/decidim/map/provider/here.rb +3 -0
  495. data/lib/decidim/map/provider/osm.rb +3 -0
  496. data/lib/decidim/map.rb +4 -4
  497. data/lib/decidim/menu.rb +1 -1
  498. data/lib/decidim/metric_manifest.rb +2 -2
  499. data/lib/decidim/nicknamizable.rb +1 -1
  500. data/lib/decidim/notification_setting_manifest.rb +19 -0
  501. data/lib/decidim/organization_settings.rb +8 -7
  502. data/lib/decidim/participatory_space_context_manifest.rb +2 -2
  503. data/lib/decidim/participatory_space_manifest.rb +2 -2
  504. data/lib/decidim/processes_file_locally.rb +31 -0
  505. data/lib/decidim/query.rb +84 -0
  506. data/lib/decidim/record_encryptor.rb +29 -8
  507. data/lib/decidim/reminder_manifest.rb +75 -0
  508. data/lib/decidim/reminder_registry.rb +67 -0
  509. data/lib/decidim/resource_manifest.rb +1 -1
  510. data/lib/decidim/resourceable.rb +11 -0
  511. data/lib/decidim/scopable.rb +15 -0
  512. data/lib/decidim/settings_manifest.rb +4 -4
  513. data/lib/decidim/spring.rb +16 -0
  514. data/lib/decidim/translatable_attributes.rb +12 -8
  515. data/lib/decidim/url_option_resolver.rb +50 -0
  516. data/lib/decidim/view_hooks.rb +1 -1
  517. data/lib/decidim/view_model.rb +5 -1
  518. data/lib/decidim/webpacker/thread_safe_compiler.rb +30 -0
  519. data/lib/decidim/webpacker/webpack/custom.js +15 -3
  520. data/lib/decidim/webpacker/webpacker.yml +1 -1
  521. data/lib/decidim/webpacker.rb +2 -0
  522. data/lib/devise/models/decidim_validatable.rb +1 -1
  523. data/lib/tasks/decidim_active_storage_migration_tasks.rake +1 -3
  524. data/lib/tasks/{decidim_data_portability_tasks.rake → decidim_download_your_data_tasks.rake} +9 -9
  525. data/lib/tasks/decidim_mailers_tasks.rake +23 -0
  526. data/lib/tasks/decidim_metrics_tasks.rake +1 -1
  527. data/lib/tasks/decidim_pwa_tasks.rake +18 -0
  528. data/lib/tasks/decidim_reminders_tasks.rake +17 -0
  529. data/lib/tasks/decidim_tasks.rake +6 -1
  530. data/lib/tasks/decidim_webpacker_tasks.rake +1 -1
  531. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +51 -0
  532. metadata +184 -83
  533. data/app/controllers/decidim/cookie_policy_controller.rb +0 -24
  534. data/app/helpers/decidim/cookies_helper.rb +0 -11
  535. data/app/packs/src/decidim/vizzs/renders.js +0 -9
  536. data/app/packs/src/decidim/vizzs.js +0 -1
  537. data/app/packs/stylesheets/decidim/modules/_cookie-bar.scss +0 -26
  538. data/app/services/decidim/home_activity_search.rb +0 -80
  539. data/app/services/decidim/participatory_space_search.rb +0 -54
  540. data/app/views/decidim/cookie_policy/accept.js.erb +0 -3
  541. data/app/views/decidim/export_mailer/data_portability_export.html.erb +0 -7
  542. data/lib/decidim/data_portability_serializers.rb +0 -23
  543. data/lib/decidim/middleware/rails_cookies.rb +0 -23
@@ -5,6 +5,8 @@ module Decidim
5
5
  class AccountController < Decidim::ApplicationController
6
6
  include Decidim::UserProfile
7
7
 
8
+ helper Decidim::PasswordsHelper
9
+
8
10
  def show
9
11
  enforce_permission_to :show, :user, current_user: current_user
10
12
  @account = form(AccountForm).from_model(current_user)
@@ -56,8 +58,51 @@ module Decidim
56
58
  redirect_to decidim.root_path
57
59
  end
58
60
 
61
+ def resend_confirmation_instructions
62
+ enforce_permission_to :update, :user, current_user: current_user
63
+
64
+ ResendConfirmationInstructions.call(current_user) do
65
+ on(:ok) do
66
+ respond_to do |format|
67
+ handle_alert(:success, t("resend_successfully", scope: "decidim.account.email_change", unconfirmed_email: current_user.unconfirmed_email))
68
+ format.js
69
+ end
70
+ end
71
+
72
+ on(:invalid) do
73
+ respond_to do |format|
74
+ handle_alert(:alert, t("resend_error", scope: "decidim.account.email_change"))
75
+ format.js
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def cancel_email_change
82
+ enforce_permission_to :update, :user, current_user: current_user
83
+
84
+ if current_user.unconfirmed_email
85
+ current_user.update(unconfirmed_email: nil)
86
+
87
+ respond_to do |format|
88
+ handle_alert(:success, t("cancel_successfully", scope: "decidim.account.email_change"))
89
+ format.js
90
+ end
91
+ else
92
+ respond_to do |format|
93
+ handle_alert(:alert, t("cancel_error", scope: "decidim.account.email_change"))
94
+ format.js
95
+ end
96
+ end
97
+ end
98
+
59
99
  private
60
100
 
101
+ def handle_alert(alert_class, text)
102
+ @alert_class = alert_class
103
+ @text = text
104
+ end
105
+
61
106
  def account_params
62
107
  params[:user].to_unsafe_h
63
108
  end
@@ -20,13 +20,13 @@ module Decidim
20
20
  include NeedsSnippets
21
21
  include UserBlockedChecker
22
22
  include DisableRedirectionToExternalHost
23
+ include NeedsPasswordChange
23
24
 
24
25
  helper Decidim::MetaTagsHelper
25
26
  helper Decidim::DecidimFormHelper
26
27
  helper Decidim::LanguageChooserHelper
27
28
  helper Decidim::ReplaceButtonsHelper
28
29
  helper Decidim::TranslationsHelper
29
- helper Decidim::CookiesHelper
30
30
  helper Decidim::AriaSelectedLinkToHelper
31
31
  helper Decidim::MenuHelper
32
32
  helper Decidim::ComponentPathHelper
@@ -7,6 +7,8 @@ module Decidim
7
7
  include Decidim::DeviseControllers
8
8
  include NeedsTosAccepted
9
9
 
10
+ helper Decidim::PasswordsHelper
11
+
10
12
  before_action :configure_permitted_parameters
11
13
 
12
14
  # We don't users to create invitations, so we just redirect them to the
@@ -6,8 +6,41 @@ module Decidim
6
6
  class PasswordsController < ::Devise::PasswordsController
7
7
  include Decidim::DeviseControllers
8
8
 
9
+ helper Decidim::PasswordsHelper
10
+
11
+ prepend_before_action :require_no_authentication, except: [:change_password, :apply_password]
12
+ skip_before_action :store_current_location
13
+
9
14
  before_action :check_sign_in_enabled
10
15
 
16
+ def change_password
17
+ self.resource = current_user
18
+ @send_path = apply_password_path
19
+
20
+ flash[:secondary] = t("decidim.admin.password_change.notification", days: Decidim.config.admin_password_expiration_days) if flash[:secondary].blank?
21
+ render :edit
22
+ end
23
+
24
+ def apply_password
25
+ self.resource = current_user
26
+ @send_path = apply_password_path
27
+
28
+ @form = Decidim::PasswordForm.from_params(params["user"])
29
+ Decidim::UpdatePassword.call(current_user, @form) do
30
+ on(:ok) do
31
+ flash[:notice] = t("passwords.update.success", scope: "decidim")
32
+ bypass_sign_in(current_user)
33
+ redirect_to after_sign_in_path_for current_user
34
+ end
35
+
36
+ on(:invalid) do
37
+ flash.now[:alert] = t("passwords.update.error", scope: "decidim")
38
+ resource.errors.errors.concat(@form.errors.errors)
39
+ render action: "edit"
40
+ end
41
+ end
42
+ end
43
+
11
44
  private
12
45
 
13
46
  def check_sign_in_enabled
@@ -9,6 +9,8 @@ module Decidim
9
9
  include Decidim::DeviseControllers
10
10
  include NeedsTosAccepted
11
11
 
12
+ helper Decidim::PasswordsHelper
13
+
12
14
  before_action :check_sign_up_enabled
13
15
  before_action :configure_permitted_parameters
14
16
 
@@ -22,6 +22,8 @@ module Decidim
22
22
  def after_sign_in_path_for(user)
23
23
  if user.present? && user.blocked?
24
24
  check_user_block_status(user)
25
+ elsif user.needs_password_update?
26
+ change_password_path
25
27
  elsif first_login_and_not_authorized?(user) && !user.admin? && !pending_redirect?(user)
26
28
  decidim_verifications.first_login_authorizations_path
27
29
  else
@@ -4,7 +4,7 @@ require "zip"
4
4
 
5
5
  module Decidim
6
6
  # The controller to handle the user's download_my_data page.
7
- class DataPortabilityController < Decidim::ApplicationController
7
+ class DownloadYourDataController < Decidim::ApplicationController
8
8
  include Decidim::UserProfile
9
9
 
10
10
  def show
@@ -16,20 +16,20 @@ module Decidim
16
16
  def export
17
17
  enforce_permission_to :export, :user, current_user: current_user
18
18
 
19
- DataPortabilityExportJob.perform_later(current_user)
19
+ DownloadYourDataExportJob.perform_later(current_user)
20
20
 
21
- flash[:notice] = t("decidim.account.data_portability_export.notice")
22
- redirect_back(fallback_location: data_portability_path)
21
+ flash[:notice] = t("decidim.account.download_your_data_export.notice")
22
+ redirect_back(fallback_location: download_your_data_path)
23
23
  end
24
24
 
25
25
  def download_file
26
26
  enforce_permission_to :download, :user, current_user: current_user
27
27
 
28
- if current_user.data_portability_file.attached?
29
- redirect_to Rails.application.routes.url_helpers.rails_blob_url(current_user.data_portability_file.blob, only_path: true)
28
+ if current_user.download_your_data_file.attached?
29
+ redirect_to Rails.application.routes.url_helpers.rails_blob_url(current_user.download_your_data_file.blob, only_path: true)
30
30
  else
31
- flash[:error] = t("decidim.account.data_portability_export.file_no_exists")
32
- redirect_to data_portability_path
31
+ flash[:error] = t("decidim.account.download_your_data_export.file_no_exists")
32
+ redirect_to download_your_data_path
33
33
  end
34
34
  end
35
35
  end
@@ -64,6 +64,11 @@ module Decidim
64
64
  redirect_back fallback_location: profile_path(accepted_user_group.nickname)
65
65
  end
66
66
 
67
+ on(:last_admin) do
68
+ flash[:alert] = t("groups.leave.last_admin", scope: "decidim")
69
+ redirect_back fallback_location: profile_path(accepted_user_group.nickname)
70
+ end
71
+
67
72
  on(:invalid) do
68
73
  flash[:alert] = t("groups.leave.error", scope: "decidim")
69
74
  redirect_back fallback_location: profile_path(accepted_user_group.nickname)
@@ -16,7 +16,7 @@ module Decidim
16
16
  def resource_types
17
17
  return @resource_types if defined?(@resource_types)
18
18
 
19
- @resource_types = search.resource_types.sort_by do |klass|
19
+ @resource_types = ActionLog.public_resource_types.sort_by do |klass|
20
20
  klass.constantize.model_name.human
21
21
  end
22
22
 
@@ -28,19 +28,17 @@ module Decidim
28
28
  end
29
29
 
30
30
  def activities
31
- @activities ||= paginate(search.results)
31
+ @activities ||= paginate(search.result)
32
32
  end
33
33
 
34
- def search_klass
35
- HomeActivitySearch
36
- end
37
-
38
- def context_params
39
- { organization: current_organization }
34
+ def search_collection
35
+ ActionLog
36
+ .where(visibility: %w(public-only all))
37
+ .where(organization: current_organization)
40
38
  end
41
39
 
42
40
  def default_filter_params
43
- { resource_type: "all" }
41
+ { with_resource_type: "all" }
44
42
  end
45
43
  end
46
44
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A controller to serve the manifest file for PWA
5
+ class ManifestsController < Decidim::ApplicationController
6
+ def show
7
+ organization_presenter = OrganizationPresenter.new(current_organization)
8
+ render layout: false, locals: { organization_params: organization_presenter }, content_type: "application/manifest+json"
9
+ end
10
+ end
11
+ end
@@ -26,7 +26,7 @@ module Decidim
26
26
  user = User.find_by(decidim_organization_id: current_organization.id, id: decrypted_string.split("-").first)
27
27
  sent_at_time = Time.zone.at(decrypted_string.split("-").second.to_i)
28
28
 
29
- if sent_at_time > (Time.current - 15.days)
29
+ if sent_at_time > (15.days.ago)
30
30
  UnsubscribeSettings.call(user) do
31
31
  on(:ok) do
32
32
  flash.now[:notice] = t("newsletters.unsubscribe.success", scope: "decidim")
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # The controller to handle the subscriptions to push notifications
5
+ class NotificationsSubscriptionsController < Decidim::ApplicationController
6
+ def create
7
+ Decidim::NotificationsSubscriptionsPersistor.new(current_user).add_subscription(params)
8
+ head :ok
9
+ end
10
+
11
+ def destroy
12
+ Decidim::NotificationsSubscriptionsPersistor.new(current_user).delete_subscription(params[:auth])
13
+ head :ok
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class OfflineController < Decidim::ApplicationController
5
+ def show; end
6
+ end
7
+ end
@@ -83,7 +83,7 @@ module Decidim
83
83
  def profile_holder
84
84
  return if params[:nickname].blank?
85
85
 
86
- @profile_holder ||= Decidim::UserBaseEntity.find_by(nickname: params[:nickname], organization: current_organization)
86
+ @profile_holder ||= Decidim::UserBaseEntity.find_by("LOWER(nickname) = ? AND decidim_organization_id = ?", params[:nickname].downcase, current_organization.id)
87
87
  end
88
88
  end
89
89
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  class SearchesController < Decidim::ApplicationController
5
- include Rectify::ControllerHelpers
5
+ include Decidim::ControllerHelpers
6
6
  include FormFactory
7
7
  include FilterResource
8
8
  include Paginable
@@ -24,8 +24,9 @@ module Decidim
24
24
  def default_filter_params
25
25
  {
26
26
  term: params[:term],
27
- resource_type: nil,
28
- decidim_scope_id: nil
27
+ with_resource_type: nil,
28
+ with_space_state: nil,
29
+ decidim_scope_id_eq: nil
29
30
  }
30
31
  end
31
32
 
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # Redirects users with short links to the correct location on the site.
5
+ class ShortLinksController < Decidim::ApplicationController
6
+ skip_before_action :store_current_location
7
+
8
+ # The index action redirects the user to the application root in case
9
+ # someone tries to request the short link URL without an identifier.
10
+ def index
11
+ redirect_to decidim.root_path, status: :moved_permanently
12
+ end
13
+
14
+ # Redirects the user to the target URL that the short link is set to
15
+ # redirect to. Raises an ActionController::RoutingError in case a short link
16
+ # does not exist with the given identifier.
17
+ #
18
+ # @raise [ActionController::RoutingError] if a short link does not exist
19
+ # with the given identifier
20
+ def show
21
+ raise ActionController::RoutingError, "Not Found" unless link
22
+
23
+ redirect_to link.target_url, status: :moved_permanently
24
+ end
25
+
26
+ private
27
+
28
+ # Fetches the link based on the provided identifier in the parameters.
29
+ #
30
+ # @return [Decidim::ShortLink] The short link matching the identifier
31
+ def link
32
+ @link ||= Decidim::ShortLink.find_by(identifier: params[:id])
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # The controller to handle upload validations
5
+ class UploadValidationsController < Decidim::ApplicationController
6
+ include FormFactory
7
+
8
+ skip_before_action :verify_organization
9
+
10
+ before_action :underscore_params!
11
+
12
+ def create
13
+ @form = form(Decidim::UploadValidationForm).from_params(params)
14
+
15
+ ValidateUpload.call(@form) do
16
+ on(:ok) do
17
+ render json: []
18
+ end
19
+
20
+ on(:invalid) do |errors|
21
+ render json: errors
22
+ end
23
+ end
24
+ end
25
+
26
+ def organization_time_zone
27
+ return Rails.application.config.time_zone unless current_organization
28
+
29
+ super
30
+ end
31
+
32
+ private
33
+
34
+ def ensure_authenticated!
35
+ return true unless current_organization
36
+
37
+ super
38
+ end
39
+
40
+ def underscore_params!
41
+ params.transform_keys!(&:underscore)
42
+ end
43
+ end
44
+ end
@@ -19,34 +19,50 @@ module Decidim
19
19
  private
20
20
 
21
21
  def user
22
- @user ||= current_organization.users.find_by(nickname: params[:nickname])
22
+ return unless params[:nickname]
23
+
24
+ @user ||= current_organization.users.find_by("LOWER(nickname) = ?", params[:nickname].downcase)
23
25
  end
24
26
 
25
27
  def activities
26
28
  @activities ||= paginate(
27
- ActivitySearch.new(
28
- organization: current_organization,
29
- user: user,
30
- current_user: current_user,
31
- resource_type: "all",
32
- resource_name: filter.resource_type
33
- ).run
29
+ if own_activities?
30
+ OwnActivities.new(current_organization, **activity_options).query.with_private_resources
31
+ else
32
+ PublicActivities.new(current_organization, **activity_options).query.with_all_resources
33
+ end
34
34
  )
35
35
  end
36
36
 
37
+ def activity_options
38
+ {
39
+ user: user,
40
+ current_user: current_user,
41
+ resource_name: filter.resource_type
42
+ }
43
+ end
44
+
45
+ def own_activities?
46
+ @own_activities ||= current_user == user
47
+ end
48
+
37
49
  def default_filter_params
38
50
  { resource_type: nil }
39
51
  end
40
52
 
41
53
  def resource_types
42
- @resource_types = %w(Decidim::Proposals::CollaborativeDraft
43
- Decidim::Comments::Comment
44
- Decidim::Debates::Debate
45
- Decidim::Initiative
46
- Decidim::Meetings::Meeting
47
- Decidim::Blogs::Post
48
- Decidim::Proposals::Proposal
49
- Decidim::Consultations::Question)
54
+ @resource_types = begin
55
+ array = %w(Decidim::Proposals::CollaborativeDraft
56
+ Decidim::Comments::Comment
57
+ Decidim::Debates::Debate
58
+ Decidim::Initiative
59
+ Decidim::Meetings::Meeting
60
+ Decidim::Blogs::Post
61
+ Decidim::Proposals::Proposal
62
+ Decidim::Consultations::Question)
63
+ array << "Decidim::Budgets::Order" if own_activities?
64
+ array
65
+ end
50
66
  end
51
67
  end
52
68
  end
@@ -5,8 +5,6 @@ module Decidim
5
5
  class UserInterestsController < Decidim::ApplicationController
6
6
  include Decidim::UserProfile
7
7
 
8
- helper_method :scopes
9
-
10
8
  def show
11
9
  enforce_permission_to :read, :user, current_user: current_user
12
10
  @user_interests = form(UserInterestsForm).from_model(current_user)
@@ -18,21 +18,19 @@ module Decidim
18
18
  private
19
19
 
20
20
  def user
21
- @user ||= Decidim::User.find_by(
22
- organization: current_organization,
23
- nickname: params[:nickname]
24
- )
21
+ return unless params[:nickname]
22
+
23
+ @user ||= current_organization.users.find_by("LOWER(nickname) = ?", params[:nickname].downcase)
25
24
  end
26
25
 
27
26
  def activities
28
27
  @activities ||= paginate(
29
- ActivitySearch.new(
30
- organization: current_organization,
31
- resource_type: "all",
28
+ PublicActivities.new(
29
+ current_organization,
32
30
  scopes: current_user.interested_scopes,
33
31
  follows: follows,
34
32
  resource_name: filter.resource_type
35
- ).run
33
+ ).query.with_resource_type("all")
36
34
  )
37
35
  end
38
36
 
@@ -0,0 +1,21 @@
1
+ # frozen-string_literal: true
2
+
3
+ module Decidim
4
+ class ChangeNicknameEvent < Decidim::Events::SimpleEvent
5
+ include Decidim::Events::NotificationEvent
6
+ delegate :organization, to: :user, prefix: false
7
+ delegate :url_helpers, to: "Decidim::Core::Engine.routes"
8
+
9
+ i18n_attributes :link_to_account_settings
10
+
11
+ def notification_title
12
+ I18n.t("decidim.events.nickname_event.notification_body", **i18n_options).to_s.html_safe
13
+ end
14
+
15
+ def i18n_options
16
+ {
17
+ link_to_account_settings: url_helpers.account_path
18
+ }
19
+ end
20
+ end
21
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # The form object that handles the data behind updating a user's
5
- # account in her profile page.
5
+ # account in their profile page.
6
6
  class AccountForm < Form
7
7
  include Decidim::HasUploadValidations
8
8
 
@@ -20,7 +20,7 @@ module Decidim
20
20
  attribute :about
21
21
 
22
22
  validates :name, presence: true
23
- validates :email, presence: true, 'valid_email_2/email': { disposable: true }
23
+ validates :email, presence: true, "valid_email_2/email": { disposable: true }
24
24
  validates :nickname, presence: true, format: Decidim::User::REGEXP_NICKNAME
25
25
 
26
26
  validates :nickname, length: { maximum: Decidim::User.nickname_max_length, allow_blank: true }
@@ -50,7 +50,7 @@ module Decidim
50
50
  end
51
51
 
52
52
  def unique_email
53
- return true if Decidim::User.where(
53
+ return true if Decidim::UserBaseEntity.where(
54
54
  organization: context.current_organization,
55
55
  email: email
56
56
  ).where.not(id: context.current_user.id).empty?
@@ -60,9 +60,10 @@ module Decidim
60
60
  end
61
61
 
62
62
  def unique_nickname
63
- return true if Decidim::User.where(
64
- organization: context.current_organization,
65
- nickname: nickname
63
+ return true if Decidim::UserBaseEntity.where(
64
+ "decidim_organization_id = ? AND LOWER(nickname) = ? ",
65
+ context.current_organization.id,
66
+ nickname.downcase
66
67
  ).where.not(id: context.current_user.id).empty?
67
68
 
68
69
  errors.add :nickname, :taken
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  # A base form object to hold common logic, like automatically adding as
5
5
  # public method the params sent as context by the `FormFactory` concern.
6
- class Form < Rectify::Form
6
+ class Form < Decidim::AttributeObject::Form
7
7
  delegate :current_organization,
8
8
  :current_user,
9
9
  :current_component,
@@ -7,7 +7,7 @@ module Decidim
7
7
  mimic :conversation
8
8
 
9
9
  attribute :body, Decidim::Attributes::CleanString
10
- attribute :recipient_id, Integer
10
+ attribute :recipient_id, [Integer]
11
11
 
12
12
  validates :body, :recipient, presence: true, length: { maximum: Decidim.config.maximum_conversation_message_length }
13
13
  validate :check_recipient
@@ -2,22 +2,24 @@
2
2
 
3
3
  module Decidim
4
4
  # The form object that handles the data behind updating a user's
5
- # notifications settings in her profile page.
5
+ # notifications settings in their profile page.
6
6
  class NotificationsSettingsForm < Form
7
7
  mimic :user
8
8
 
9
- attribute :email_on_notification, Boolean
10
9
  attribute :email_on_moderations, Boolean
11
10
  attribute :newsletter_notifications, Boolean
12
11
  attribute :notifications_from_followed, Boolean
13
12
  attribute :notifications_from_own_activity, Boolean
14
13
  attribute :allow_public_contact, Boolean
14
+ attribute :notification_settings, Hash
15
+ attribute :notifications_sending_frequency, String
15
16
 
16
17
  def map_model(user)
17
18
  self.newsletter_notifications = user.newsletter_notifications_at.present?
18
19
  self.notifications_from_followed = ["all", "followed-only"].include? user.notification_types
19
20
  self.notifications_from_own_activity = ["all", "own-only"].include? user.notification_types
20
21
  self.allow_public_contact = user.direct_message_types == "all"
22
+ self.notifications_sending_frequency = user.notifications_sending_frequency
21
23
  end
22
24
 
23
25
  def newsletter_notifications_at
@@ -49,5 +51,9 @@ module Decidim
49
51
  end
50
52
  false
51
53
  end
54
+
55
+ def meet_push_notifications_requirements?
56
+ Rails.application.secrets.vapid[:enabled]
57
+ end
52
58
  end
53
59
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class PasswordForm < Form
5
+ attribute :password
6
+ attribute :password_confirmation
7
+
8
+ validates :password, confirmation: true
9
+ end
10
+ end
@@ -15,8 +15,8 @@ module Decidim
15
15
  attribute :current_locale, String
16
16
 
17
17
  validates :name, presence: true
18
- validates :nickname, presence: true, format: /\A[\w\-]+\z/, length: { maximum: Decidim::User.nickname_max_length }
19
- validates :email, presence: true, 'valid_email_2/email': { disposable: true }
18
+ validates :nickname, presence: true, format: Decidim::User::REGEXP_NICKNAME, length: { maximum: Decidim::User.nickname_max_length }
19
+ validates :email, presence: true, "valid_email_2/email": { disposable: true }
20
20
  validates :password, confirmation: true
21
21
  validates :password, password: { name: :name, email: :email, username: :nickname }
22
22
  validates :password_confirmation, presence: true
@@ -35,11 +35,17 @@ module Decidim
35
35
  private
36
36
 
37
37
  def email_unique_in_organization
38
- errors.add :email, :taken if User.no_active_invitation.find_by(email: email, organization: current_organization).present?
38
+ errors.add :email, :taken if valid_users.find_by(email: email, organization: current_organization).present?
39
39
  end
40
40
 
41
41
  def nickname_unique_in_organization
42
- errors.add :nickname, :taken if User.no_active_invitation.find_by(nickname: nickname, organization: current_organization).present?
42
+ return false unless nickname
43
+
44
+ errors.add :nickname, :taken if valid_users.find_by("LOWER(nickname)= ? AND decidim_organization_id = ?", nickname.downcase, current_organization.id).present?
45
+ end
46
+
47
+ def valid_users
48
+ UserBaseEntity.where(invitation_token: nil)
43
49
  end
44
50
 
45
51
  def no_pending_invitations_exist