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
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A form object used to handle upload validations, this is used when user is
5
+ # adding files to dropzone in upload modal.
6
+ class UploadValidationForm < Decidim::Form
7
+ include Decidim::HasUploadValidations
8
+
9
+ attribute :resource_class, String
10
+ # Property is named as attribute in upload modal and passthru validator, but it
11
+ # cannot be named as attribute here.
12
+ attribute :property, String
13
+ attribute :blob, String
14
+ attribute :form_class, String
15
+
16
+ validates :resource_class, presence: true
17
+ validates :property, presence: true
18
+ validates :blob, presence: true
19
+ validate :file, if: ->(form) { form.resource_class.present? && form.property.present? && form.blob.present? }
20
+
21
+ def file
22
+ org = organization
23
+ PassthruValidator.new(
24
+ attributes: [property],
25
+ to: resource_class.constantize,
26
+ with: lambda { |record|
27
+ validate_with.tap do |hash|
28
+ hash.merge!(organization: record.try(:organization) || org) if !hash[:organization] && record.respond_to?(:organization=)
29
+ end
30
+ }
31
+ ).validate_each(self, property.to_sym, blob)
32
+ end
33
+
34
+ private
35
+
36
+ def validate_with
37
+ if form_object_class && form_object_class._validators[property.to_sym].is_a?(Array) && form_object_class._validators[property.to_sym].size.positive?
38
+ passthru = form_object_class._validators[property.to_sym].find { |v| v.is_a?(PassthruValidator) }
39
+ return passthru.options[:with] if passthru && passthru.options[:with].present?
40
+ end
41
+ {}
42
+ end
43
+
44
+ def form_object_class
45
+ @form_object_class ||= begin
46
+ form_class.constantize if form_class.present?
47
+ rescue NameError
48
+ nil
49
+ end
50
+ end
51
+
52
+ alias organization current_organization
53
+ end
54
+ end
@@ -16,7 +16,7 @@ module Decidim
16
16
  attribute :phone
17
17
 
18
18
  validates :name, presence: true
19
- validates :email, presence: true, 'valid_email_2/email': { disposable: true }
19
+ validates :email, presence: true, "valid_email_2/email": { disposable: true }
20
20
  validates :nickname, presence: true
21
21
 
22
22
  validates :nickname, length: { maximum: Decidim::User.nickname_max_length, allow_blank: true }
@@ -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
- # interests in her profile page.
5
+ # interests in their profile page.
6
6
  class UserInterestScopeForm < Form
7
7
  mimic :scope
8
8
 
@@ -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
- # interests in her profile page.
5
+ # interests in their profile page.
6
6
  class UserInterestsForm < Form
7
7
  mimic :user
8
8
 
@@ -9,7 +9,7 @@
9
9
  # object (or the `default_locale` of the form's organization) for the given field.
10
10
  class TranslatablePresenceValidator < ActiveModel::EachValidator
11
11
  def validate_each(record, attribute, _value)
12
- translated_attr = "#{attribute}_#{default_locale_for(record)}"
12
+ translated_attr = "#{attribute}_#{default_locale_for(record)}".gsub("-", "__")
13
13
  record.errors.add(translated_attr, :blank) if record.send(translated_attr).blank?
14
14
  end
15
15
 
@@ -22,7 +22,7 @@ class TranslatablePresenceValidator < ActiveModel::EachValidator
22
22
  record.current_organization.default_locale
23
23
  else
24
24
  record.errors.add(:current_organization, :blank)
25
- []
25
+ Decidim.default_locale
26
26
  end
27
27
  end
28
28
  end
@@ -6,7 +6,7 @@
6
6
  #
7
7
  class UrlValidator < ActiveModel::EachValidator
8
8
  def validate_each(record, attribute, value)
9
- record.errors[attribute] << (options[:message] || "must be a valid URL") unless url_valid?(value)
9
+ record.errors.add attribute, (options[:message] || "must be a valid URL") unless url_valid?(value)
10
10
  end
11
11
 
12
12
  # a URL may be technically well-formed but may
@@ -114,9 +114,9 @@ module Decidim
114
114
  base_url, params = decidim_participatory_processes.participatory_process_path(process).split("?")
115
115
 
116
116
  if params.present?
117
- [base_url, "/", process.active_step.cta_path, "?", params].join("")
117
+ [base_url, "/", process.active_step.cta_path, "?", params].join
118
118
  else
119
- [base_url, "/", process.active_step.cta_path].join("")
119
+ [base_url, "/", process.active_step.cta_path].join
120
120
  end
121
121
  end
122
122
 
@@ -10,7 +10,7 @@ module Decidim
10
10
  #
11
11
  # Returns nothing.
12
12
  def attachments_for(attached_to)
13
- render partial: "decidim/application/attachments.html", locals: { attached_to: attached_to }
13
+ render partial: "decidim/application/attachments", locals: { attached_to: attached_to }
14
14
  end
15
15
 
16
16
  # Renders the attachment's title.
@@ -8,7 +8,7 @@ module Decidim
8
8
  include Cell::ViewModel::Partial
9
9
  include Decidim::PaginateHelper
10
10
 
11
- def paginate(scope, options = {}, &block)
11
+ def paginate(scope, **options, &block)
12
12
  options = options.reverse_merge(views_prefix: "../views/")
13
13
  super
14
14
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # Helper that provides a single method to create datalist select.
5
+ module DatalistSelectHelper
6
+ # Public: Creates HTML for datalist select so that you can use seperate ids and labels.
7
+ #
8
+ # items - Items in datalist, item should have id and name.
9
+ # options - a Hash with options
10
+ # :id - id of wrapper
11
+ # :class - wrapper css classes
12
+ # :data - wrapper data attributes
13
+ # :label - label for input
14
+ # :name - name of input
15
+ # :autocomplete - enable or disable autocomplete provided by browser.
16
+ # :list - id of datalist
17
+ # yield - additional html (e.g. hidden input)
18
+ #
19
+ # Returns a HTML String div containing following children: label, input and datalist elements.
20
+ def datalist_select(items, options = {})
21
+ default_options = {
22
+ list: "datalist-list",
23
+ autocomplete: "off"
24
+ }
25
+ options = default_options.merge(options)
26
+ tag.div(id: options[:id], class: options[:class], data: options[:data]) do
27
+ html = ""
28
+ html += yield if block_given?
29
+ html += tag.label(options[:label], for: options[:name])
30
+ html += tag.input(type: "text", name: options[:name], list: options[:list], autocomplete: options[:autocomplete], placeholder: options[:placeholder])
31
+ html += tag.datalist(id: options[:list]) do
32
+ items.map do |item|
33
+ tag.option(translated_attribute(item.name), data: { value: item.id })
34
+ end.join.html_safe
35
+ end
36
+ html.html_safe
37
+ end
38
+ end
39
+ end
40
+ end
@@ -190,7 +190,7 @@ module Decidim
190
190
  request.protocol,
191
191
  request.host_with_port,
192
192
  prepend_slug_path
193
- ].join("").html_safe +
193
+ ].join.html_safe +
194
194
  content_tag(:span, value, class: "slug-url-value")
195
195
  end
196
196
  end
@@ -5,7 +5,7 @@ module Decidim
5
5
  module FollowableHelper
6
6
  # Invokes the decidim/shared/follow_button partial.
7
7
  def follow_button_for(model, large = nil)
8
- render partial: "decidim/shared/follow_button.html", locals: { followable: model, large: large }
8
+ controller.view_context.render partial: "decidim/shared/follow_button", locals: { followable: model, large: large }
9
9
  end
10
10
  end
11
11
  end
@@ -40,7 +40,7 @@ module Decidim
40
40
  #
41
41
  # Returns an HTML tag with the icon.
42
42
  def resource_icon(resource, options = {})
43
- if resource.class.name == "Decidim::Comments::Comment"
43
+ if resource.instance_of?(Decidim::Comments::Comment)
44
44
  icon "comment-square", options
45
45
  elsif resource.respond_to?(:component)
46
46
  component_icon(resource.component, options)
@@ -15,6 +15,20 @@ module Decidim
15
15
  end)
16
16
  end
17
17
 
18
+ def apple_favicon
19
+ icon_image = current_organization.attached_uploader(:favicon).variant_url(:medium, host: current_organization.host)
20
+ return unless icon_image
21
+
22
+ favicon_link_tag(icon_image, rel: "apple-touch-icon", type: "image/png")
23
+ end
24
+
25
+ def legacy_favicon
26
+ icon_image = current_organization.attached_uploader(:favicon).variant_url(:small, host: current_organization.host)
27
+ return unless icon_image
28
+
29
+ favicon_link_tag(icon_image.gsub(".png", ".ico"), rel: "icon", sizes: "any", type: nil)
30
+ end
31
+
18
32
  # Outputs an SVG-based icon.
19
33
  #
20
34
  # name - The String with the icon name.
@@ -107,7 +121,7 @@ module Decidim
107
121
  extra_items = items.slice((max_items + 1)..-1) || []
108
122
  active_item = items.find { |item| item[:active] }
109
123
 
110
- render partial: "decidim/shared/extended_navigation_bar.html", locals: {
124
+ controller.view_context.render partial: "decidim/shared/extended_navigation_bar", locals: {
111
125
  items: items,
112
126
  extra_items: extra_items,
113
127
  active_item: active_item,
@@ -45,12 +45,14 @@ module Decidim
45
45
  link: map_url
46
46
  }.merge(options))
47
47
 
48
- unless snippets.any?(:map)
49
- snippets.add(:map, builder.stylesheet_snippets)
50
- snippets.add(:map, builder.javascript_snippets)
48
+ unless snippets.any?(:map_styles) || snippets.any?(:map_scripts)
49
+ snippets.add(:map_styles, builder.stylesheet_snippets)
50
+ snippets.add(:map_scripts, builder.javascript_snippets)
51
51
 
52
52
  # This will display the snippets in the <head> part of the page.
53
- snippets.add(:head, snippets.for(:map))
53
+ snippets.add(:head, snippets.for(:map_styles))
54
+ # This will display the snippets in the bottom part of the page.
55
+ snippets.add(:foot, snippets.for(:map_scripts))
54
56
  end
55
57
 
56
58
  builder.map_element(
@@ -84,12 +86,14 @@ module Decidim
84
86
  # Ideally we would use Rails' native content_for here (which is exactly
85
87
  # for this purpose) but unfortunately it does not work in the cells which
86
88
  # also need to display maps.
87
- unless snippets.any?(:map)
88
- snippets.add(:map, builder.stylesheet_snippets)
89
- snippets.add(:map, builder.javascript_snippets)
89
+ unless snippets.any?(:map_styles) || snippets.any?(:map_scripts)
90
+ snippets.add(:map_styles, builder.stylesheet_snippets)
91
+ snippets.add(:map_scripts, builder.javascript_snippets)
90
92
 
91
93
  # This will display the snippets in the <head> part of the page.
92
- snippets.add(:head, snippets.for(:map))
94
+ snippets.add(:head, snippets.for(:map_styles))
95
+ # This will display the snippets in the bottom part of the page.
96
+ snippets.add(:foot, snippets.for(:map_scripts))
93
97
  end
94
98
 
95
99
  map_html_options = { id: "map", class: "google-map" }.merge(html_options)
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Naming/MemoizedInstanceVariableName
4
3
  module Decidim
5
4
  # Helper that provides convenient methods to deal with the page meta tags.
6
5
  module MetaTagsHelper
@@ -128,4 +127,3 @@ module Decidim
128
127
  end
129
128
  end
130
129
  end
131
- # rubocop:enable Naming/MemoizedInstanceVariableName
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # Helper that provides methods to render the notifications settings form
5
+ module NotificationsSettingsHelper
6
+ def frequencies_collection
7
+ {
8
+ none: t("decidim.notifications_settings.show.notifications_sending_frequencies.none"),
9
+ real_time: t("decidim.notifications_settings.show.notifications_sending_frequencies.real_time"),
10
+ daily: t("decidim.notifications_settings.show.notifications_sending_frequencies.daily"),
11
+ weekly: t("decidim.notifications_settings.show.notifications_sending_frequencies.weekly")
12
+ }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module PasswordsHelper
5
+ def password_field_options_for(user)
6
+ user =
7
+ case user
8
+ when :user
9
+ Decidim::User.new
10
+ when :admin
11
+ Decidim::User.new(admin: true)
12
+ when String
13
+ Decidim::User.with_reset_password_token(user)
14
+ else
15
+ user
16
+ end
17
+ min_length = ::PasswordValidator.minimum_length_for(user)
18
+ help_text =
19
+ if needs_admin_password?(user)
20
+ t("devise.passwords.edit.password_help_admin", minimun_characters: min_length)
21
+ else
22
+ t("devise.passwords.edit.password_help", minimun_characters: min_length)
23
+ end
24
+
25
+ {
26
+ autocomplete: "new-password",
27
+ required: true,
28
+ help_text: help_text,
29
+ minlength: min_length,
30
+ maxlength: ::PasswordValidator::MAX_LENGTH
31
+ }
32
+ end
33
+
34
+ def needs_admin_password?(user)
35
+ return false unless user&.admin?
36
+ return false unless Decidim.config.admin_password_strong
37
+
38
+ true
39
+ end
40
+ end
41
+ end
@@ -32,6 +32,7 @@ module Decidim
32
32
  end
33
33
 
34
34
  def decidim_sanitize_editor(html, options = {})
35
+ html = Decidim::IframeDisabler.new(html, options).perform
35
36
  content_tag(:div, decidim_sanitize(html, options), class: %w(ql-editor ql-reset-decidim))
36
37
  end
37
38
 
@@ -27,12 +27,12 @@ module Decidim
27
27
  new_params = {
28
28
  utf8: params[:utf8],
29
29
  filter: {
30
- decidim_scope_id: params.dig(:filter, :decidim_scope_id),
30
+ with_scope: params.dig(:filter, :with_scope),
31
31
  term: params[:term] || params.dig(:filter, :term)
32
32
  }
33
33
  }
34
- new_params[:filter][:resource_type] = resource_type if resource_type.present?
35
- new_params[:filter][:space_state] = space_state if space_state.present?
34
+ new_params[:filter][:with_resource_type] = resource_type if resource_type.present?
35
+ new_params[:filter][:with_space_state] = space_state if space_state.present?
36
36
  decidim.search_path(new_params)
37
37
  end
38
38
 
@@ -44,14 +44,14 @@ module Decidim
44
44
 
45
45
  # Generates the path to filter by resource type, considering the other filters.
46
46
  def search_path_by_resource_type(resource_type)
47
- search_path_by(space_state: params.dig(:filter, :space_state), resource_type: resource_type)
47
+ search_path_by(space_state: params.dig(:filter, :with_space_state), resource_type: resource_type)
48
48
  end
49
49
 
50
50
  # Generates the path and link to filter by space state, taking into account
51
51
  # the other filters applied.
52
52
  def search_path_by_state_link(state)
53
- path = search_path_by(resource_type: params.dig(:filter, :resource_type), space_state: state)
54
- is_active = params.dig(:filter, :space_state).to_s == state.to_s
53
+ path = search_path_by(resource_type: params.dig(:filter, :with_resource_type), space_state: state)
54
+ is_active = params.dig(:filter, :with_space_state).to_s == state.to_s
55
55
 
56
56
  link_to path, class: "order-by__tab#{" is-active" if is_active}" do
57
57
  content_tag(:strong, t(state || :all, scope: "decidim.searches.filters.state"))
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This helper includes some methods to help with generating short links within
5
+ # the Decidim engine views.
6
+ module ShortLinkHelper
7
+ # A helper method to get a short URL in the current context where this
8
+ # method is called from. This helper automatically fetches the "target" for
9
+ # the short link, such as the component or the participatory process. This
10
+ # also resolves the current mounted route name to make it possible to refer
11
+ # to the same context when redirecting the short URL to correct full URL.
12
+ #
13
+ # @option kwargs [Boolean] :route_name the route name to which the short
14
+ # link should link to
15
+ # @option kwargs [Float] :params the URL query parameters that should be
16
+ # included in the URL where the short link redirects to
17
+ # @return [String] The short URL
18
+ def short_url(**kwargs)
19
+ target = respond_to?(:current_component) && current_component
20
+ target ||= respond_to?(:current_participatory_space) && current_participatory_space
21
+ target ||= respond_to?(:current_organization) && current_organization
22
+ target ||= Rails.application
23
+
24
+ mounted_engine = EngineResolver.new(_routes).mounted_name
25
+ ShortLink.to(target, mounted_engine, **kwargs).short_url
26
+ end
27
+ end
28
+ end
@@ -14,10 +14,10 @@ module Decidim
14
14
  # options - Any other option to delegate to the individual I18n.t calls
15
15
  #
16
16
  # Returns a Hash with the locales as keys and the translations as values.
17
- def multi_translation(key, locales = Decidim.available_locales, *options)
17
+ def multi_translation(key, locales = Decidim.available_locales, **options)
18
18
  locales.each_with_object({}) do |locale, result|
19
19
  I18n.with_locale(locale) do
20
- result[locale.to_sym] = I18n.t(key, *options)
20
+ result[locale.to_sym] = I18n.t(key, **options)
21
21
  end
22
22
  end
23
23
  end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Decidim
4
- class DataPortabilityExportJob < ApplicationJob
4
+ class DownloadYourDataExportJob < ApplicationJob
5
5
  queue_as :default
6
6
 
7
- def perform(user, export_format = ::Decidim::DataPortabilityExporter::DEFAULT_EXPORT_FORMAT)
7
+ def perform(user, export_format = ::Decidim::DownloadYourDataExporter::DEFAULT_EXPORT_FORMAT)
8
8
  filename = "#{SecureRandom.urlsafe_base64}.zip"
9
9
  path = Rails.root.join("tmp/#{filename}")
10
10
  password = SecureRandom.urlsafe_base64
@@ -12,17 +12,17 @@ module Decidim
12
12
  generate_zip_file(user, path, password, export_format)
13
13
  save_or_upload_file(user, path)
14
14
 
15
- ExportMailer.data_portability_export(user, filename, password).deliver_later
15
+ ExportMailer.download_your_data_export(user, filename, password).deliver_later
16
16
  end
17
17
 
18
18
  private
19
19
 
20
20
  def generate_zip_file(user, path, password, export_format)
21
- DataPortabilityExporter.new(user, path, password, export_format).export
21
+ DownloadYourDataExporter.new(user, path, password, export_format).export
22
22
  end
23
23
 
24
24
  def save_or_upload_file(user, path)
25
- user.data_portability_file.attach(io: File.open(path, "rb"), filename: File.basename(path))
25
+ user.download_your_data_file.attach(io: File.open(path, "rb"), filename: File.basename(path))
26
26
  end
27
27
  end
28
28
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class EmailNotificationsDigestGeneratorJob < ApplicationJob
5
+ queue_as :mailers
6
+
7
+ def perform(user_id, frequency, time: Time.now.utc, force: false)
8
+ user = Decidim::User.find_by(id: user_id)
9
+ return if user.blank?
10
+
11
+ should_notify = force || NotificationsDigestSendingDecider.must_notify?(user, time: time)
12
+ return unless should_notify
13
+
14
+ notification_ids = user.notifications.try(frequency, time: time).pluck(:id)
15
+ return if notification_ids.blank?
16
+
17
+ NotificationsDigestMailer.digest_mail(user, notification_ids).deliver_later
18
+ user.update(digest_sent_at: time)
19
+ end
20
+ end
21
+ end
@@ -6,9 +6,11 @@ module Decidim
6
6
 
7
7
  def perform(event, event_class_name, resource, recipient, user_role, extra) # rubocop:disable Metrics/ParameterLists
8
8
  event_class = event_class_name.constantize
9
- NotificationGeneratorForRecipient
10
- .new(event, event_class, resource, recipient, user_role, extra)
11
- .generate
9
+ notification = NotificationGeneratorForRecipient
10
+ .new(event, event_class, resource, recipient, user_role, extra)
11
+ .generate
12
+
13
+ SendPushNotification.new.perform(notification) if notification
12
14
  end
13
15
  end
14
16
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class ReminderGeneratorJob < ApplicationJob
5
+ queue_as :reminders
6
+
7
+ def perform(generator_class_name)
8
+ generator = generator_class_name.constantize.new
9
+ generator.generate
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class ResendConfirmationInstructionsJob < ApplicationJob
5
+ queue_as :default
6
+
7
+ def perform(user)
8
+ user.send_reconfirmation_instructions
9
+ end
10
+ end
11
+ end
@@ -4,8 +4,8 @@ module Decidim
4
4
  class UserReportJob < ApplicationJob
5
5
  queue_as :user_report
6
6
 
7
- def perform(admin, token, reason, user)
8
- UserReportMailer.notify(admin, token, reason, user).deliver_now
7
+ def perform(admin, report)
8
+ UserReportMailer.notify(admin, report).deliver_now
9
9
  end
10
10
  end
11
11
  end
@@ -18,15 +18,23 @@ module Decidim
18
18
  def set_asset_host
19
19
  return if Rails.application.config.action_mailer.asset_host.present?
20
20
 
21
- self.asset_host = ->(_mail) { "#{protocol}://#{@organization.host}" }
21
+ self.asset_host = ->(_mail) { "#{protocol}://#{@organization.host}#{port_fragment}" }
22
22
  end
23
23
 
24
24
  private
25
25
 
26
26
  def protocol
27
- return "https" if Decidim.force_ssl
27
+ asset_url_options.protocol
28
+ end
29
+
30
+ def port_fragment
31
+ return if asset_url_options.default_port?
32
+
33
+ ":#{asset_url_options.port}"
34
+ end
28
35
 
29
- "http"
36
+ def asset_url_options
37
+ @asset_url_options ||= UrlOptionResolver.new
30
38
  end
31
39
  end
32
40
  end
@@ -23,7 +23,7 @@ module Decidim
23
23
  port: @organization.smtp_settings["port"],
24
24
  user_name: @organization.smtp_settings["user_name"],
25
25
  password: Decidim::AttributeEncryptor.decrypt(@organization.smtp_settings["encrypted_password"])
26
- ) { |_k, o, v| v.presence || o }.reject! { |_k, v| v.blank? }
26
+ ) { |_k, o, v| v.presence || o }.compact_blank!
27
27
  end
28
28
  end
29
29
  end
@@ -5,17 +5,18 @@ module Decidim
5
5
  # when their account was blocked
6
6
  class BlockUserMailer < ApplicationMailer
7
7
  def notify(user, justification)
8
- @user = user
9
- @organization = user.organization
10
- @justification = justification
11
- mail(
12
- to: user.email,
13
- subject: I18n.t(
8
+ with_user(user) do
9
+ @user = user
10
+ @organization = user.organization
11
+ @justification = justification
12
+ subject = I18n.t(
14
13
  "decidim.block_user_mailer.notify.subject",
15
14
  organization_name: @organization.name,
16
15
  justification: @justification
17
16
  )
18
- )
17
+
18
+ mail(to: user.email, subject: subject)
19
+ end
19
20
  end
20
21
  end
21
22
  end
@@ -27,12 +27,12 @@ module Decidim
27
27
  end
28
28
 
29
29
  # Public: Sends a notification email with a link to retrieve
30
- # the result of a data_portability export in a zipped file.
30
+ # the result of a download_your_data export in a zipped file.
31
31
  #
32
32
  # user - The user to be notified.
33
33
  #
34
34
  # Returns nothing.
35
- def data_portability_export(user, filename, password)
35
+ def download_your_data_export(user, filename, password)
36
36
  @user = user
37
37
  @organization = user.organization
38
38
  @filename = filename
@@ -3,12 +3,12 @@
3
3
  module Decidim
4
4
  class NewsletterMailer < ApplicationMailer
5
5
  helper Decidim::SanitizeHelper
6
+ helper Decidim::TranslationsHelper
7
+
6
8
  include Decidim::NewslettersHelper
7
9
 
8
10
  layout "decidim/newsletter_base"
9
11
 
10
- add_template_helper Decidim::TranslationsHelper
11
-
12
12
  helper_method :cell
13
13
 
14
14
  def newsletter(user, newsletter)