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,205 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This cell creates the necessary elements for dynamic uploads.
5
+ class UploadModalCell < Decidim::ViewModel
6
+ include Cell::ViewModel::Partial
7
+ include ERB::Util
8
+
9
+ alias form model
10
+
11
+ def show
12
+ return unless resource_name
13
+
14
+ render
15
+ end
16
+
17
+ private
18
+
19
+ def button_id
20
+ prefix = form.object_name.present? ? "#{form.object_name}_" : ""
21
+
22
+ "#{prefix.gsub(/[\[\]]/, "_").gsub(/__+/, "_")}#{attribute}_button"
23
+ end
24
+
25
+ def button_class
26
+ "button small hollow add-field add-file" if has_title?
27
+
28
+ "button small add-file"
29
+ end
30
+
31
+ def label
32
+ options[:label]
33
+ end
34
+
35
+ def button_label
36
+ return button_edit_label if attachments.count.positive?
37
+
38
+ options[:button_label]
39
+ end
40
+
41
+ def button_edit_label
42
+ options[:button_edit_label] || options[:button_label]
43
+ end
44
+
45
+ def max_file_size
46
+ options[:max_file_size]
47
+ end
48
+
49
+ def max_file_size_mb
50
+ return unless max_file_size
51
+
52
+ (((max_file_size / 1024 / 1024) * 100) / 100).round
53
+ end
54
+
55
+ def resource_class
56
+ options[:resource_class].to_s
57
+ end
58
+
59
+ def resource_name
60
+ options[:resource_name]
61
+ end
62
+
63
+ def actions_wrapper_class
64
+ has_title? ? "actions-wrapper titled" : "actions-wrapper"
65
+ end
66
+
67
+ def attribute
68
+ options[:attribute]
69
+ end
70
+
71
+ def multiple
72
+ options[:multiple] || false
73
+ end
74
+
75
+ def optional
76
+ options[:optional]
77
+ end
78
+
79
+ # By default Foundation adds form errors next to input, but since input is in the modal
80
+ # and modal is hidden by default, we need to add an additional validation field to the form.
81
+ # This should only be necessary when file is required by the form.
82
+ def input_validation_field
83
+ object_name = form.object.present? ? "#{form.object.model_name.param_key}[#{add_attribute}_validation]" : "#{add_attribute}_validation"
84
+ input = check_box_tag object_name, 1, attachments.present?, class: "hide", label: false, required: !optional
85
+ message = form.send(:abide_error_element, add_attribute) + form.send(:error_and_help_text, add_attribute)
86
+ input + message
87
+ end
88
+
89
+ def explanation
90
+ return I18n.t("explanation", scope: options[:help_i18n_scope], attribute: attribute) if options[:help_i18n_scope].present?
91
+
92
+ I18n.t("explanation", scope: "decidim.forms.upload_help", attribute: attribute)
93
+ end
94
+
95
+ def add_attribute
96
+ return "add_#{attribute}" if form.object.respond_to? "add_#{attribute}"
97
+
98
+ attribute
99
+ end
100
+
101
+ def has_title?
102
+ options[:titled] == true
103
+ end
104
+
105
+ def with_title
106
+ "with-title" if has_title?
107
+ end
108
+
109
+ def attachment_label
110
+ return I18n.t("current_image", scope: "decidim.forms") if attachments.count.positive? && file_attachment_path(attachments.first).present?
111
+
112
+ I18n.t("default_image", scope: "decidim.forms")
113
+ end
114
+
115
+ def help_messages
116
+ Array(options[:help])
117
+ end
118
+
119
+ def attachments
120
+ @attachments = begin
121
+ attachments = options[:attachments] || form.object.send(attribute)
122
+ attachments = Array(attachments).compact_blank
123
+ attachments.map { |attachment| attachment.is_a?(String) ? ActiveStorage::Blob.find_signed(attachment) : attachment }
124
+ end
125
+ end
126
+
127
+ def id_for(attachment)
128
+ return attachment.id if attachment.respond_to? :id
129
+
130
+ rand(1..10_000)
131
+ end
132
+
133
+ def title_for(attachment)
134
+ return unless has_title?
135
+
136
+ translated_attribute(attachment.title)
137
+ end
138
+
139
+ def truncated_file_name_for(attachment, max_length = 31)
140
+ filename = file_name_for(attachment)
141
+ return filename if filename.length <= max_length
142
+
143
+ name = File.basename(filename, File.extname(filename))
144
+ name.truncate(max_length, omission: "...#{name.last((max_length / 2) - 3)}#{File.extname(filename)}")
145
+ end
146
+
147
+ def file_name_for(attachment)
148
+ filename = determine_filename(attachment)
149
+
150
+ return "(#{filename})" if has_title?
151
+
152
+ filename
153
+ end
154
+
155
+ def determine_filename(attachment)
156
+ return attachment.filename.to_s if attachment.is_a? ActiveStorage::Blob
157
+ return blob(attachment).filename.to_s if blob(attachment).present?
158
+
159
+ attachment.url.split("/").last
160
+ end
161
+
162
+ def file_attachment_path(attachment)
163
+ return unless attachment
164
+ return Rails.application.routes.url_helpers.rails_blob_url(attachment, only_path: true) if attachment.is_a? ActiveStorage::Blob
165
+
166
+ if attachment.try(:attached?)
167
+ attachment_path = Rails.application.routes.url_helpers&.rails_blob_url(attachment.blob, only_path: true)
168
+ return attachment_path if attachment_path.present?
169
+ end
170
+
171
+ uploader_default_image_path(attribute)
172
+ end
173
+
174
+ def uploader_default_image_path(attribute)
175
+ uploader = Decidim::FileValidatorHumanizer.new(form.object, attribute).uploader
176
+ return if uploader.blank?
177
+ return unless uploader.is_a?(Decidim::ImageUploader)
178
+
179
+ uploader.try(:default_url)
180
+ end
181
+
182
+ def blob(attachment)
183
+ return attachment if attachment.is_a? ActiveStorage::Blob
184
+ return ActiveStorage::Blob.find_signed(attachment) if attachment.is_a? String
185
+ return attachment.file.blob if attachment.is_a? Decidim::Attachment
186
+ return attachment.blob if attachment.respond_to? :blob
187
+ end
188
+
189
+ def direct_upload_url
190
+ Rails.application.class.routes.url_helpers.rails_direct_uploads_path
191
+ end
192
+
193
+ def form_object_class
194
+ form.object.class.to_s
195
+ end
196
+
197
+ def modal_id
198
+ @modal_id ||= "upload_#{SecureRandom.uuid}"
199
+ end
200
+
201
+ def current_organization
202
+ controller.current_organization
203
+ end
204
+ end
205
+ end
@@ -9,7 +9,7 @@
9
9
  <%= f.hidden_field :recipient_id, id: nil, name: "conversation[recipient_id][]", value: recipient.id %>
10
10
  <% end %>
11
11
 
12
- <%= f.text_area :body, label: false, rows: 4, required: true, placeholder: t("decidim.user_conversations.reply.placeholder") %>
12
+ <%= f.text_area :body, label: false, rows: 4, required: true, placeholder: t("decidim.user_conversations.reply.placeholder"), data: { input_emoji: true } %>
13
13
 
14
14
  <%= f.submit t("decidim.user_conversations.reply.send"), class: "button secondary light pull-right", data: { disable: true } %>
15
15
  <% end %>
@@ -6,18 +6,20 @@
6
6
  </div>
7
7
  </div>
8
8
  <div class="row">
9
- <div class="row columns mentions__container">
9
+ <div class="row columns multiple-mentions" data-name="recipient_id[]" data-multiple="true">
10
10
  <label for="add_conversation_users"><%= t "decidim.user_conversations.index.add_max_users" %></label>
11
11
  <input id="add_conversation_users" type="text"
12
- class="js-multiple-mentions mentions__container"
12
+ spellcheck="false"
13
+ autocomplete="off"
13
14
  placeholder="<%= t("decidim.user_conversations.index.add_users_placeholder") %>"
14
15
  data-noresults="<%= t("decidim.user_conversations.index.no_results") %>"
15
16
  contenteditable="true"
16
17
  data-direct-messages-disabled="<%= t("decidim.user_conversations.index.participant_with_disabled_message_reception") %>"
18
+ data-selected="multiple-mentions-selected"
17
19
  aria-expanded="false">
18
20
  </div>
19
21
  <div class="columns large-12">
20
- <div class="js-multiple-mentions-recipients"></div>
22
+ <ul class="multiple-mentions-selected"></ul>
21
23
  </div>
22
24
  </div>
23
25
  </div>
@@ -49,19 +49,8 @@ module Decidim
49
49
  i18n("version_created_at")
50
50
  end
51
51
 
52
- def i18n(string, params = {})
53
- t(
54
- string,
55
- params.merge(
56
- scope: i18n_scope,
57
- default: t(
58
- string,
59
- params.merge(
60
- scope: default_i18n_scope
61
- )
62
- )
63
- )
64
- )
52
+ def i18n(string, **params)
53
+ t(string, **params, scope: i18n_scope, default: t(string, **params, scope: default_i18n_scope))
65
54
  end
66
55
 
67
56
  def i18n_scope
@@ -32,19 +32,8 @@ module Decidim
32
32
  i18n("back_to_resource")
33
33
  end
34
34
 
35
- def i18n(string, params = {})
36
- t(
37
- string,
38
- params.merge(
39
- scope: i18n_scope,
40
- default: t(
41
- string,
42
- params.merge(
43
- scope: default_i18n_scope
44
- )
45
- )
46
- )
47
- )
35
+ def i18n(string, **params)
36
+ t(string, **params, scope: i18n_scope, default: t(string, **params, scope: default_i18n_scope))
48
37
  end
49
38
 
50
39
  def i18n_scope
@@ -25,19 +25,8 @@ module Decidim
25
25
  i18n("version_index", index: index)
26
26
  end
27
27
 
28
- def i18n(string, params = {})
29
- t(
30
- string,
31
- params.merge(
32
- scope: i18n_scope,
33
- default: t(
34
- string,
35
- params.merge(
36
- scope: default_i18n_scope
37
- )
38
- )
39
- )
40
- )
28
+ def i18n(string, **params)
29
+ t(string, **params, scope: i18n_scope, default: t(string, **params, scope: default_i18n_scope))
41
30
  end
42
31
 
43
32
  def i18n_scope
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  # A command with all the business logic to accept an invitation to belong to a
5
5
  # group.
6
- class AcceptGroupInvitation < Rectify::Command
6
+ class AcceptGroupInvitation < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # user_group - the UserGroup where the user has been invited
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  # A command with all the business logic to accept a join request to a user
5
5
  # group.
6
- class AcceptUserGroupJoinRequest < Rectify::Command
6
+ class AcceptUserGroupJoinRequest < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # membership - the UserGroupMembership to be accepted.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic to accept an amend.
6
- class Accept < Rectify::Command
6
+ class Accept < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # form - A form object with the params.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic when a user starts amending a resource.
6
- class CreateDraft < Rectify::Command
6
+ class CreateDraft < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # form - A form object with the params.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic when a user starts amending a resource.
6
- class DestroyDraft < Rectify::Command
6
+ class DestroyDraft < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # amendment - The amendment to destroy.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic when a user promotes a rejected emendation.
6
- class Promote < Rectify::Command
6
+ class Promote < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # emendation - The emendation to promote.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic when a user publishes an amendment draft.
6
- class PublishDraft < Rectify::Command
6
+ class PublishDraft < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # form - A form object with the params.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic to reject an amend.
6
- class Reject < Rectify::Command
6
+ class Reject < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # form - A form object with the params.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic when a user updates and amendment draft.
6
- class UpdateDraft < Rectify::Command
6
+ class UpdateDraft < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # form - A form object with the params.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic to withdraw an amendment.
6
- class Withdraw < Rectify::Command
6
+ class Withdraw < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # amendment - The amendment to withdraw.
@@ -18,7 +18,7 @@ module Decidim
18
18
  end
19
19
 
20
20
  def delete_attachment(attachment)
21
- Attachment.find(attachment.id).delete if attachment.id == proposal.documents.first.id
21
+ Attachment.find(attachment.id).delete if attachment.id.to_i == proposal.documents.first.id
22
22
  end
23
23
 
24
24
  def attachment_invalid?
@@ -36,7 +36,8 @@ module Decidim
36
36
  !@form.attachment.file.is_a?(Decidim::ApplicationUploader)
37
37
  end
38
38
 
39
- def create_attachment
39
+ def create_attachment(weight: 0)
40
+ attachment.weight = weight
40
41
  attachment.attached_to = @attached_to
41
42
  attachment.save!
42
43
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # A command with all the business logic to create an editor image.
5
- class CreateEditorImage < Rectify::Command
5
+ class CreateEditorImage < Decidim::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
8
  # form - A form object with the params.
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # A command with all the business logic for when a user starts following a resource.
5
- class CreateFollow < Rectify::Command
5
+ class CreateFollow < Decidim::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
8
  # form - A form object with the params.
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # A command with all the business logic to create a user from omniauth
5
- class CreateOmniauthRegistration < Rectify::Command
5
+ class CreateOmniauthRegistration < Decidim::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
8
  # form - A form object with the params.
@@ -63,13 +63,12 @@ module Decidim
63
63
  @user.name = form.name
64
64
  @user.nickname = form.normalized_nickname
65
65
  @user.newsletter_notifications_at = nil
66
- @user.email_on_notification = true
67
66
  @user.password = generated_password
68
67
  @user.password_confirmation = generated_password
69
68
  if form.avatar_url.present?
70
69
  url = URI.parse(form.avatar_url)
71
70
  filename = File.basename(url.path)
72
- file = URI.open(url)
71
+ file = url.open
73
72
  @user.avatar.attach(io: file, filename: filename)
74
73
  end
75
74
  @user.skip_confirmation! if verified_email
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # A command with all the business logic to create a user through the sign up form.
5
- class CreateRegistration < Rectify::Command
5
+ class CreateRegistration < Decidim::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
8
  # form - A form object with the params.
@@ -44,7 +44,6 @@ module Decidim
44
44
  organization: form.current_organization,
45
45
  tos_agreement: form.tos_agreement,
46
46
  newsletter_notifications_at: form.newsletter_at,
47
- email_on_notification: true,
48
47
  accepted_tos_version: form.current_organization.tos_version,
49
48
  locale: form.current_locale
50
49
  )
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # A command with all the business logic when a user creates a report.
5
- class CreateReport < Rectify::Command
5
+ class CreateReport < Decidim::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
8
  # form - A form object with the params.
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # A command with all the business logic to create a user group.
5
- class CreateUserGroup < Rectify::Command
5
+ class CreateUserGroup < Decidim::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
8
  # form - A form object with the params.
@@ -63,7 +63,7 @@ module Decidim
63
63
  affected_users: Decidim::User.org_admins_except_me(form.current_user)
64
64
  }
65
65
 
66
- Decidim::EventsManager.publish(data)
66
+ Decidim::EventsManager.publish(**data)
67
67
  end
68
68
  end
69
69
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # A command with all the business logic when a user creates a report.
5
- class CreateUserReport < Rectify::Command
5
+ class CreateUserReport < Decidim::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
8
  # form - A form object with the params.
@@ -55,8 +55,10 @@ module Decidim
55
55
  end
56
56
 
57
57
  def send_notification_to_admins!
58
- current_organization.admins.each do |admin|
59
- Decidim::UserReportJob.perform_later(admin, current_user, form.reason, reportable)
58
+ @current_user.organization.admins.each do |admin|
59
+ next unless admin.email_on_moderations
60
+
61
+ Decidim::UserReportJob.perform_later(admin, report)
60
62
  end
61
63
  end
62
64
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # A command with all the business logic for when a user stops following a resource.
5
- class DeleteFollow < Rectify::Command
5
+ class DeleteFollow < Decidim::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
8
  # form - A form object with the params.
@@ -4,7 +4,7 @@ module Decidim
4
4
  # A command with all the business logic to demote an admin. This means
5
5
  # removing their admin righta dn converting them to a basic member. It's the
6
6
  # coutnerpart of `PromoteMembership`.
7
- class DemoteMembership < Rectify::Command
7
+ class DemoteMembership < Decidim::Command
8
8
  # Public: Initializes the command.
9
9
  #
10
10
  # membership - the UserGroupMembership to be demoted.
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # This command destroys the user's account.
5
- class DestroyAccount < Rectify::Command
5
+ class DestroyAccount < Decidim::Command
6
6
  # Destroy a user's account.
7
7
  #
8
8
  # user - The user to be updated.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  # A command with all the business logic related with a user endorsing a resource.
5
5
  # This is a user creates and endorsement.
6
- class EndorseResource < Rectify::Command
6
+ class EndorseResource < Decidim::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # resource - An instance of Decidim::Endorsable.
@@ -8,22 +8,27 @@ module Decidim
8
8
 
9
9
  def build_gallery(attached_to = nil)
10
10
  @gallery = []
11
- @form.add_photos.each do |photo|
12
- next unless image? photo
11
+ @form.add_photos.compact_blank.each do |photo|
12
+ if photo.is_a?(Hash) && photo.has_key?(:id)
13
+ update_attachment_title_for(photo)
14
+ next
15
+ end
13
16
 
14
17
  @gallery << Attachment.new(
15
- title: { I18n.locale => photo.original_filename },
18
+ title: photos_title(photo),
16
19
  attached_to: attached_to || gallery_attached_to,
17
- file: photo, # Define attached_to before this
18
- content_type: photo.content_type
20
+ file: photos_signed_id(photo), # Define attached_to before this
21
+ content_type: photos_content_type(photo)
19
22
  )
20
23
  end
21
24
  end
22
25
 
23
- def image?(image)
24
- return unless image.respond_to? :content_type
26
+ def update_attachment_title_for(photo)
27
+ Decidim::Attachment.find(photo[:id]).update(title: title_for(photo))
28
+ end
25
29
 
26
- image.content_type.start_with? "image"
30
+ def image?(signed_id)
31
+ blob(signed_id).content_type.start_with? "image"
27
32
  end
28
33
 
29
34
  def gallery_invalid?
@@ -36,17 +41,27 @@ module Decidim
36
41
  false
37
42
  end
38
43
 
39
- def create_gallery
44
+ def create_gallery(first_weight: 0)
45
+ weight = first_weight
46
+ # Add the weights first to the old photos
47
+ @form.photos.each do |photo|
48
+ photo.update!(weight: weight)
49
+ weight += 1
50
+ end
40
51
  @gallery.map! do |photo|
52
+ photo.weight = weight
41
53
  photo.attached_to = gallery_attached_to
42
54
  photo.save!
55
+ weight += 1
43
56
  @form.photos << photo
44
57
  end
45
58
  end
46
59
 
47
60
  def photo_cleanup!
48
61
  gallery_attached_to.photos.each do |photo|
49
- photo.destroy! if @form.photos.map(&:id).exclude? photo.id
62
+ next unless @form.photos.map(&:id).exclude?(photo.id)
63
+
64
+ photo.destroy! if (@form.respond_to?(:documents) && @form.documents.map(&:id).exclude?(photo.id)) || !@form.respond_to?(:documents)
50
65
  end
51
66
  # manually reset cached photos
52
67
  gallery_attached_to.reload
@@ -68,5 +83,25 @@ module Decidim
68
83
 
69
84
  form.current_component.organization if form.respond_to?(:current_component)
70
85
  end
86
+
87
+ def photos_signed_id(photo)
88
+ return photo[:file] if photo.is_a?(Hash)
89
+
90
+ photo
91
+ end
92
+
93
+ def photos_title(photo)
94
+ return { I18n.locale => photo[:title] } if photo.is_a?(Hash) && photo.has_key?(:title)
95
+
96
+ { I18n.locale => "" }
97
+ end
98
+
99
+ def photos_content_type(photo)
100
+ blob(photos_signed_id(photo)).content_type
101
+ end
102
+
103
+ def blob(signed_id)
104
+ ActiveStorage::Blob.find_signed(signed_id)
105
+ end
71
106
  end
72
107
  end