decidim-core 0.30.3 → 0.31.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 (784) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -4
  3. data/app/cells/decidim/activity_cell.rb +0 -3
  4. data/app/cells/decidim/address/show.erb +1 -0
  5. data/app/cells/decidim/address_cell.rb +7 -1
  6. data/app/cells/decidim/amendable/amend_button_card/show.erb +2 -2
  7. data/app/cells/decidim/author/likes.erb +4 -0
  8. data/app/cells/decidim/author/show.erb +2 -8
  9. data/app/cells/decidim/author_cell.rb +5 -38
  10. data/app/cells/decidim/badge_cell.rb +1 -7
  11. data/app/cells/decidim/card_cell.rb +2 -12
  12. data/app/cells/decidim/card_metadata_cell.rb +4 -4
  13. data/app/cells/decidim/coauthorships_cell.rb +1 -1
  14. data/app/cells/decidim/collapsible_authors/show.erb +1 -1
  15. data/app/cells/decidim/content_blocks/hero_cell.rb +23 -4
  16. data/app/cells/decidim/content_blocks/hero_settings_form/show.erb +16 -2
  17. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +6 -6
  18. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +28 -1
  19. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form/show.erb +27 -0
  20. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form_cell.rb +13 -0
  21. data/app/cells/decidim/content_blocks/highlighted_elements_for_component_settings_form/show.erb +9 -2
  22. data/app/cells/decidim/content_blocks/html_settings_form/show.erb +3 -1
  23. data/app/cells/decidim/content_blocks/last_activity_cell.rb +1 -1
  24. data/app/cells/decidim/content_blocks/last_activity_settings_form/show.erb +3 -1
  25. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity_cell.rb +1 -1
  26. data/app/cells/decidim/content_blocks/participatory_space_extra_data/recent_users.erb +1 -1
  27. data/app/cells/decidim/content_blocks/participatory_space_hero/show.erb +0 -5
  28. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +1 -13
  29. data/app/cells/decidim/content_blocks/participatory_space_hero_settings_form/show.erb +10 -3
  30. data/app/cells/decidim/content_blocks/participatory_space_last_activity/content.erb +1 -1
  31. data/app/cells/decidim/content_blocks/participatory_space_last_activity/recent_avatars.erb +1 -1
  32. data/app/cells/decidim/content_blocks/participatory_space_last_activity_cell.rb +3 -3
  33. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +17 -5
  34. data/app/cells/decidim/content_blocks/participatory_space_main_data_cell.rb +4 -0
  35. data/app/cells/decidim/content_blocks/stats/show.erb +2 -3
  36. data/app/cells/decidim/data_consent/modal.erb +1 -1
  37. data/app/cells/decidim/like_block/show.erb +3 -0
  38. data/app/cells/decidim/{endorsement_block_cell.rb → like_block_cell.rb} +2 -2
  39. data/app/cells/decidim/like_buttons/button_content.erb +2 -0
  40. data/app/cells/decidim/like_buttons/show.erb +17 -0
  41. data/app/cells/decidim/{endorsement_buttons → like_buttons}/verification_modal.erb +3 -3
  42. data/app/cells/decidim/like_buttons_cell.rb +77 -0
  43. data/app/cells/decidim/likers_list/empty.erb +3 -0
  44. data/app/cells/decidim/{endorsers_list → likers_list}/full.erb +3 -3
  45. data/app/cells/decidim/likers_list/show.erb +20 -0
  46. data/app/cells/decidim/likers_list_cell.rb +64 -0
  47. data/app/cells/decidim/nav_links/show.erb +1 -1
  48. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  49. data/app/cells/decidim/onboarding_action_message_cell.rb +1 -1
  50. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +0 -8
  51. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +0 -8
  52. data/app/cells/decidim/profile/avatar.erb +2 -0
  53. data/app/cells/decidim/profile/badge.erb +3 -3
  54. data/app/cells/decidim/profile/details.erb +2 -3
  55. data/app/cells/decidim/profile/tabs.erb +1 -1
  56. data/app/cells/decidim/profile_actions/show.erb +0 -1
  57. data/app/cells/decidim/profile_actions_cell.rb +5 -91
  58. data/app/cells/decidim/profile_cell.rb +4 -39
  59. data/app/cells/decidim/report_button/content.erb +2 -0
  60. data/app/cells/decidim/report_button/flag_modal.erb +1 -1
  61. data/app/cells/decidim/report_button_cell.rb +1 -1
  62. data/app/cells/decidim/report_user_button/flag_modal.erb +1 -1
  63. data/app/cells/decidim/resource_history_cell.rb +2 -1
  64. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  65. data/app/cells/decidim/share_button_cell.rb +1 -1
  66. data/app/cells/decidim/share_text_widget/modal.erb +16 -0
  67. data/app/cells/decidim/share_text_widget/show.erb +2 -0
  68. data/app/cells/decidim/share_text_widget_cell.rb +27 -0
  69. data/app/cells/decidim/share_widget/modal.erb +19 -8
  70. data/app/cells/decidim/share_widget/qr_code_modal.erb +26 -0
  71. data/app/cells/decidim/share_widget/show.erb +1 -0
  72. data/app/cells/decidim/share_widget_cell.rb +10 -6
  73. data/app/cells/decidim/statistic/show.erb +23 -5
  74. data/app/cells/decidim/statistic_cell.rb +28 -3
  75. data/app/cells/decidim/tab_panels/show.erb +1 -1
  76. data/app/cells/decidim/user_activity_cell.rb +1 -6
  77. data/app/cells/decidim/user_profile/show.erb +1 -1
  78. data/app/cells/decidim/user_profile_cell.rb +1 -9
  79. data/app/cells/decidim/version_author_cell.rb +0 -7
  80. data/app/commands/decidim/amendable/accept.rb +1 -3
  81. data/app/commands/decidim/amendable/create_draft.rb +2 -3
  82. data/app/commands/decidim/amendable/update_draft.rb +2 -3
  83. data/app/commands/decidim/create_ephemeral_user.rb +7 -1
  84. data/app/commands/decidim/create_omniauth_registration.rb +8 -7
  85. data/app/commands/decidim/create_report.rb +9 -1
  86. data/app/commands/decidim/destroy_account.rb +0 -5
  87. data/app/commands/decidim/like_resource.rb +52 -0
  88. data/app/commands/decidim/messaging/reply_to_conversation.rb +2 -21
  89. data/app/commands/decidim/messaging/start_conversation.rb +2 -21
  90. data/app/commands/decidim/unlike_resource.rb +34 -0
  91. data/app/commands/decidim/update_account.rb +1 -1
  92. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +6 -2
  93. data/app/controllers/concerns/decidim/user_profile.rb +0 -1
  94. data/app/controllers/decidim/account_controller.rb +1 -1
  95. data/app/controllers/decidim/amendments_controller.rb +4 -5
  96. data/app/controllers/decidim/application_controller.rb +2 -1
  97. data/app/controllers/decidim/devise/confirmations_controller.rb +0 -5
  98. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -1
  99. data/app/controllers/decidim/devise/passwords_controller.rb +1 -1
  100. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  101. data/app/controllers/decidim/doorkeeper/authorizations_controller.rb +19 -1
  102. data/app/controllers/decidim/download_your_data_controller.rb +2 -2
  103. data/app/controllers/decidim/likes_controller.rb +57 -0
  104. data/app/controllers/decidim/links_controller.rb +1 -0
  105. data/app/controllers/decidim/messaging/conversations_controller.rb +1 -8
  106. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  107. data/app/controllers/decidim/notifications_settings_controller.rb +2 -2
  108. data/app/controllers/decidim/pages_controller.rb +0 -1
  109. data/app/controllers/decidim/profiles_controller.rb +2 -57
  110. data/app/controllers/decidim/qr_controller.rb +73 -0
  111. data/app/controllers/decidim/resource_autocomplete_controller.rb +56 -0
  112. data/app/controllers/decidim/user_activities_controller.rb +0 -1
  113. data/app/events/decidim/resource_liked_event.rb +36 -0
  114. data/app/forms/decidim/amendable/create_form.rb +0 -1
  115. data/app/forms/decidim/amendable/edit_form.rb +0 -1
  116. data/app/forms/decidim/amendable/form.rb +4 -4
  117. data/app/forms/decidim/ephemeral_user_form.rb +1 -0
  118. data/app/forms/decidim/notifications_settings_form.rb +1 -1
  119. data/app/forms/decidim/omniauth_registration_form.rb +1 -1
  120. data/app/forms/decidim/upload_validation_form.rb +9 -1
  121. data/app/helpers/decidim/amendments_helper.rb +1 -2
  122. data/app/helpers/decidim/animations_helper.rb +14 -0
  123. data/app/helpers/decidim/decidim_form_helper.rb +17 -6
  124. data/app/helpers/decidim/layout_helper.rb +1 -15
  125. data/app/helpers/decidim/likeable_helper.rb +46 -0
  126. data/app/helpers/decidim/map_helper.rb +1 -1
  127. data/app/helpers/decidim/menu_helper.rb +2 -8
  128. data/app/helpers/decidim/messaging/conversation_helper.rb +1 -1
  129. data/app/helpers/decidim/omniauth_helper.rb +1 -1
  130. data/app/helpers/decidim/qr_code_helper.rb +37 -0
  131. data/app/helpers/decidim/rich_text_editor_helper.rb +0 -1
  132. data/app/helpers/decidim/sanitize_helper.rb +5 -5
  133. data/app/helpers/decidim/social_share_button_helper.rb +11 -10
  134. data/app/jobs/decidim/delete_inactive_participants_job.rb +41 -0
  135. data/app/jobs/decidim/process_inactive_participant_job.rb +48 -0
  136. data/app/mailers/decidim/participants_account_mailer.rb +38 -0
  137. data/app/mailers/decidim/user_group_mailer.rb +28 -0
  138. data/app/models/decidim/action_log.rb +3 -5
  139. data/app/models/decidim/amendment.rb +1 -1
  140. data/app/models/decidim/attachment_collection.rb +2 -0
  141. data/app/models/decidim/authorization_transfer.rb +0 -1
  142. data/app/models/decidim/coauthorship.rb +1 -1
  143. data/app/models/decidim/component.rb +4 -1
  144. data/app/models/decidim/{endorsement.rb → like.rb} +4 -4
  145. data/app/models/decidim/messaging/conversation.rb +3 -5
  146. data/app/models/decidim/messaging/message.rb +3 -15
  147. data/app/models/decidim/omniauth_provider.rb +1 -1
  148. data/app/models/decidim/organization.rb +3 -8
  149. data/app/models/decidim/participatory_space_role_config/{valuator.rb → evaluator.rb} +1 -1
  150. data/app/models/decidim/reminder_record.rb +1 -1
  151. data/app/models/decidim/searchable_resource.rb +16 -0
  152. data/app/models/decidim/taxonomy.rb +6 -1
  153. data/app/models/decidim/user.rb +32 -15
  154. data/app/models/decidim/user_base_entity.rb +2 -2
  155. data/app/packs/entrypoints/decidim_conference_diploma.scss +2 -2
  156. data/app/packs/entrypoints/decidim_core.scss +2 -2
  157. data/app/packs/entrypoints/decidim_editor.js +0 -4
  158. data/app/packs/entrypoints/decidim_map.scss +2 -2
  159. data/app/packs/entrypoints/decidim_overrides.scss +1 -1
  160. data/app/packs/entrypoints/decidim_qr.js +1 -0
  161. data/app/packs/images/decidim/remixicon.symbol.svg +3 -3
  162. data/app/packs/src/decidim/a11y.js +1 -120
  163. data/app/packs/src/decidim/append_redirect_url_to_modals.js +1 -1
  164. data/app/packs/src/decidim/attachments/file_or_link_tabs.js +1 -1
  165. data/app/packs/src/decidim/confirm.js +27 -20
  166. data/app/packs/src/decidim/controllers/.keep +0 -0
  167. data/app/packs/src/decidim/controllers/accordion/controller.js +100 -0
  168. data/app/packs/src/decidim/controllers/account_form/account_form.test.js +423 -0
  169. data/app/packs/src/decidim/controllers/account_form/controller.js +69 -0
  170. data/app/packs/src/decidim/{input_character_counter.js → controllers/character_counter/controller.js} +90 -106
  171. data/app/packs/src/decidim/controllers/clipboard_copy/clipboard_copy.test.js +305 -0
  172. data/app/packs/src/decidim/controllers/clipboard_copy/controller.js +403 -0
  173. data/app/packs/src/decidim/controllers/date_picker/controller.js +12 -0
  174. data/app/packs/src/decidim/controllers/delete_account_form/controller.js +45 -0
  175. data/app/packs/src/decidim/controllers/delete_account_form/delete_account_form.test.js +216 -0
  176. data/app/packs/src/decidim/controllers/dropdown/controller.js +125 -0
  177. data/app/packs/src/decidim/controllers/editor/controller.js +8 -0
  178. data/app/packs/src/decidim/controllers/emoji/controller.js +26 -0
  179. data/app/packs/src/decidim/{input_emoji.js → controllers/emoji/emoji.js} +1 -15
  180. data/app/packs/src/decidim/{form_filter.js → controllers/form_filter/controller.js} +68 -57
  181. data/app/packs/src/decidim/controllers/form_filter/form_filter.test.js +648 -0
  182. data/app/packs/src/decidim/controllers/form_validator/controller.js +23 -0
  183. data/app/packs/src/decidim/controllers/form_validator/form_validator.js +789 -0
  184. data/app/packs/src/decidim/controllers/form_validator/form_validator.test.js +685 -0
  185. data/app/packs/src/decidim/controllers/impersonation_warning/controller.js +137 -0
  186. data/app/packs/src/decidim/controllers/impersonation_warning/impersonation.test.js +382 -0
  187. data/app/packs/src/decidim/controllers/input_tags/controller.js +28 -0
  188. data/app/packs/src/decidim/controllers/mention/controller.js +243 -0
  189. data/app/packs/src/decidim/controllers/mention/input_mentions.test.js +562 -0
  190. data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +215 -0
  191. data/app/packs/src/decidim/controllers/multiple_mentions/input_multiple_mentions.test.js +645 -0
  192. data/app/packs/src/decidim/controllers/notification_action/controller.js +210 -0
  193. data/app/packs/src/decidim/controllers/notification_action/notification_action.test.js +388 -0
  194. data/app/packs/src/decidim/controllers/password_toggler/controller.js +232 -0
  195. data/app/packs/src/decidim/controllers/password_toggler/password_toggler.test.js +229 -0
  196. data/app/packs/src/decidim/controllers/report_form/controller.js +184 -0
  197. data/app/packs/src/decidim/controllers/report_form/report_form_manager.test.js +511 -0
  198. data/app/packs/src/decidim/controllers/scroll_to_last/controller.js +9 -0
  199. data/app/packs/src/decidim/controllers/scroll_to_last/scroll_to_last_child.test.js +225 -0
  200. data/app/packs/src/decidim/controllers/sticky_buttons/controller.js +55 -0
  201. data/app/packs/src/decidim/controllers/sticky_buttons/sticky_buttons.test.js +334 -0
  202. data/app/packs/src/decidim/controllers/sticky_header/controller.js +116 -0
  203. data/app/packs/src/decidim/controllers/sticky_header/sticky_header.test.js +320 -0
  204. data/app/packs/src/decidim/controllers/toggle/controller.js +111 -0
  205. data/app/packs/src/decidim/controllers/toggle/toggle.test.js +260 -0
  206. data/app/packs/src/decidim/controllers/tooltip/controller.js +287 -0
  207. data/app/packs/src/decidim/controllers/tooltip/tooltip.test.js +380 -0
  208. data/app/packs/src/decidim/controllers/user_registration_form/controller.js +160 -0
  209. data/app/packs/src/decidim/controllers/user_registration_form/omniauth_registration_form.test.js +441 -0
  210. data/app/packs/src/decidim/controllers/user_registration_form/user_registration_form.test.js +386 -0
  211. data/app/packs/src/decidim/data_consent/index.js +1 -1
  212. data/app/packs/src/decidim/datalist_select.js +1 -1
  213. data/app/packs/src/decidim/datepicker/form_datepicker.js +1 -1
  214. data/app/packs/src/decidim/datepicker/generate_datepicker.js +2 -2
  215. data/app/packs/src/decidim/datepicker/generate_timepicker.js +2 -2
  216. data/app/packs/src/decidim/direct_uploads/upload_field.js +3 -5
  217. data/app/packs/src/decidim/direct_uploads/upload_modal.js +1 -1
  218. data/app/packs/src/decidim/dropdown_menu.js +1 -1
  219. data/app/packs/src/decidim/editor/common/input_dialog.js +1 -1
  220. data/app/packs/src/decidim/editor/common/suggestion.js +10 -2
  221. data/app/packs/src/decidim/editor/common/upload_dialog.js +1 -1
  222. data/app/packs/src/decidim/editor/extensions/decidim_kit/index.js +7 -7
  223. data/app/packs/src/decidim/editor/extensions/emoji/index.js +2 -3
  224. data/app/packs/src/decidim/editor/extensions/image/index.js +1 -1
  225. data/app/packs/src/decidim/editor/extensions/image/node_view.js +1 -1
  226. data/app/packs/src/decidim/editor/extensions/link/bubble_menu.js +1 -1
  227. data/app/packs/src/decidim/editor/extensions/link/index.js +1 -1
  228. data/app/packs/src/decidim/editor/extensions/mention/index.js +1 -2
  229. data/app/packs/src/decidim/editor/extensions/mention_resource/index.js +69 -0
  230. data/app/packs/src/decidim/editor/extensions/video_embed/index.js +1 -1
  231. data/app/packs/src/decidim/editor/index.js +6 -5
  232. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +1 -2
  233. data/app/packs/src/decidim/editor/test/extensions/emoji.test.js +17 -0
  234. data/app/packs/src/decidim/editor/test/extensions/heading.test.js +2 -2
  235. data/app/packs/src/decidim/editor/toolbar.js +1 -1
  236. data/app/packs/src/decidim/form_attachments.js +1 -1
  237. data/app/packs/src/decidim/geocoding/attach_input.js +3 -0
  238. data/app/packs/src/decidim/geocoding/provider/here.js +1 -1
  239. data/app/packs/src/decidim/geocoding/provider/photon.js +1 -1
  240. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +2 -2
  241. data/app/packs/src/decidim/geocoding.js +2 -2
  242. data/app/packs/src/decidim/index.js +127 -95
  243. data/app/packs/src/decidim/map/integration/forms.js +1 -1
  244. data/app/packs/src/decidim/map/legacy.js +1 -1
  245. data/app/packs/src/decidim/map/provider/default.js +1 -1
  246. data/app/packs/src/decidim/map/provider/here.js +1 -1
  247. data/app/packs/src/decidim/map.js +1 -1
  248. data/app/packs/src/decidim/{external_link.js → refactor/implementation/external_link.js} +1 -1
  249. data/app/packs/src/decidim/{onboarding_pending_action.js → refactor/integration/onboarding_pending_action.js} +4 -4
  250. data/app/packs/src/decidim/{check_boxes_tree.js → refactor/moved/check_boxes_tree.js} +24 -9
  251. data/app/packs/src/decidim/{i18n.test.js → refactor/moved/i18n.test.js} +1 -1
  252. data/app/packs/src/decidim/{icon.js → refactor/moved/icon.js} +2 -0
  253. data/app/packs/src/decidim/refactor/support/stimulus.js +39 -0
  254. data/app/packs/src/decidim/refactor/test/configuration.test.js +360 -0
  255. data/app/packs/src/decidim/{external_domain_warning.test.js → refactor/test/external_domain_warning.test.js} +1 -1
  256. data/app/packs/src/decidim/{external_link.test.js → refactor/test/external_link.test.js} +1 -1
  257. data/app/packs/src/decidim/results_listing.js +2 -2
  258. data/app/packs/src/decidim/security/selfxss_warning.js +1 -1
  259. data/app/packs/src/decidim/session_timeouter.js +1 -1
  260. data/app/packs/src/decidim/sw/push-permissions.js +1 -1
  261. data/app/packs/src/decidim/utilities/dom.js +1 -1
  262. data/app/packs/stylesheets/decidim/_accordion.scss +37 -3
  263. data/app/packs/stylesheets/decidim/_author.scss +0 -29
  264. data/app/packs/stylesheets/decidim/_buttons.scss +4 -0
  265. data/app/packs/stylesheets/decidim/_callout.scss +1 -1
  266. data/app/packs/stylesheets/decidim/_cards.scss +2 -6
  267. data/app/packs/stylesheets/decidim/_content_blocks.scss +1 -1
  268. data/app/packs/stylesheets/decidim/_cookies.scss +1 -1
  269. data/app/packs/stylesheets/decidim/_datepicker.scss +0 -4
  270. data/app/packs/stylesheets/decidim/_dropdown.scss +56 -19
  271. data/app/packs/stylesheets/decidim/_forms.scss +6 -6
  272. data/app/packs/stylesheets/decidim/_header.scss +17 -1
  273. data/app/packs/stylesheets/decidim/_labels.scss +1 -1
  274. data/app/packs/stylesheets/decidim/_layout.scss +12 -2
  275. data/app/packs/stylesheets/decidim/{_endorsers_list.scss → _likes_list.scss} +1 -1
  276. data/app/packs/stylesheets/decidim/_modal.scss +5 -1
  277. data/app/packs/stylesheets/decidim/_modal_share.scss +83 -9
  278. data/app/packs/stylesheets/decidim/_modal_update.scss +1 -5
  279. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +1 -1
  280. data/app/packs/stylesheets/decidim/_profile.scss +6 -6
  281. data/app/packs/stylesheets/decidim/_rich_text.scss +13 -0
  282. data/app/packs/stylesheets/decidim/_statistics.scss +35 -3
  283. data/app/packs/stylesheets/decidim/_tooltip.scss +1 -1
  284. data/app/packs/stylesheets/decidim/_typography.scss +6 -0
  285. data/app/packs/stylesheets/decidim/_wizard_steps.scss +1 -1
  286. data/app/packs/stylesheets/decidim/application.scss +76 -76
  287. data/app/packs/stylesheets/decidim/editor.scss +12 -15
  288. data/app/packs/stylesheets/decidim/legacy/email.scss +6 -5
  289. data/app/packs/stylesheets/decidim/map.scss +5 -3
  290. data/app/packs/stylesheets/decidim/qr.scss +65 -0
  291. data/app/permissions/decidim/default_permissions.rb +16 -0
  292. data/app/permissions/decidim/permissions.rb +5 -26
  293. data/app/presenters/decidim/admin_log/base_user_presenter.rb +2 -2
  294. data/app/presenters/decidim/admin_log/organization_presenter.rb +0 -15
  295. data/app/presenters/decidim/home_stats_presenter.rb +4 -54
  296. data/app/presenters/decidim/log/base_presenter.rb +1 -1
  297. data/app/presenters/decidim/menu_item_presenter.rb +10 -3
  298. data/app/presenters/decidim/official_author_presenter.rb +0 -4
  299. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +0 -4
  300. data/app/presenters/decidim/resource_locator_presenter.rb +15 -4
  301. data/app/presenters/decidim/resource_presenter.rb +8 -8
  302. data/app/presenters/decidim/stats_presenter.rb +39 -60
  303. data/app/presenters/decidim/taxonomy_presenter.rb +5 -1
  304. data/app/presenters/decidim/user_presenter.rb +0 -6
  305. data/app/queries/decidim/authorized_users.rb +26 -0
  306. data/app/queries/decidim/inactive_users_query.rb +31 -0
  307. data/app/queries/decidim/public_activities.rb +2 -2
  308. data/app/queries/decidim/stats_followers_count.rb +43 -0
  309. data/app/queries/decidim/stats_participants_count.rb +102 -0
  310. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +1 -5
  311. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +0 -1
  312. data/app/services/decidim/action_logger.rb +2 -1
  313. data/app/services/decidim/base_diff_renderer.rb +0 -17
  314. data/app/services/decidim/onboarding_manager.rb +4 -0
  315. data/app/services/decidim/open_data_exporter.rb +19 -11
  316. data/app/services/decidim/send_push_notification.rb +4 -3
  317. data/app/services/decidim/traceability.rb +1 -1
  318. data/app/validators/etiquette_validator.rb +9 -2
  319. data/app/validators/password_validator.rb +1 -3
  320. data/app/validators/translated_etiquette_validator.rb +1 -0
  321. data/app/views/decidim/account/_old_password_field.html.erb +1 -1
  322. data/app/views/decidim/account/_password_fields.html.erb +1 -1
  323. data/app/views/decidim/account/delete.html.erb +1 -1
  324. data/app/views/decidim/account/show.html.erb +3 -3
  325. data/app/views/decidim/amendments/edit_draft.html.erb +0 -4
  326. data/app/views/decidim/amendments/new.html.erb +0 -4
  327. data/app/views/decidim/amendments/preview_draft.html.erb +1 -1
  328. data/app/views/decidim/application/_accordion_section.html.erb +1 -1
  329. data/app/views/decidim/application/_collection.html.erb +1 -1
  330. data/app/views/decidim/application/_document.html.erb +2 -2
  331. data/app/views/decidim/application/_radio_accordion.html.erb +30 -0
  332. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +1 -1
  333. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +1 -1
  334. data/app/views/decidim/devise/registrations/new.html.erb +1 -1
  335. data/app/views/decidim/devise/shared/_links.html.erb +1 -1
  336. data/app/views/decidim/doorkeeper/authorizations/new.html.erb +39 -8
  337. data/app/views/decidim/errors/internal_server_error.html.erb +1 -0
  338. data/app/views/decidim/likes/update_buttons_and_counters.js.erb +21 -0
  339. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +2 -2
  340. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +1 -1
  341. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  342. data/app/views/decidim/messaging/conversations/create.js.erb +0 -1
  343. data/app/views/decidim/messaging/conversations/new.html.erb +1 -1
  344. data/app/views/decidim/messaging/conversations/show.html.erb +1 -1
  345. data/app/views/decidim/notifications_settings/show.html.erb +3 -3
  346. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  347. data/app/views/decidim/pages/index.html.erb +1 -1
  348. data/app/views/decidim/participants_account_mailer/inactivity_notification.html.erb +13 -0
  349. data/app/views/decidim/participants_account_mailer/removal_notification.html.erb +11 -0
  350. data/app/views/decidim/profiles/show.html.erb +1 -1
  351. data/app/views/decidim/qr/show.html.erb +28 -0
  352. data/app/views/decidim/searches/_filters.html.erb +18 -2
  353. data/app/views/decidim/searches/index.html.erb +5 -2
  354. data/app/views/decidim/shared/_confirm_modal.html.erb +5 -3
  355. data/app/views/decidim/shared/_filters.html.erb +3 -3
  356. data/app/views/decidim/shared/_orders.html.erb +1 -1
  357. data/app/views/decidim/shared/_resource_actions.html.erb +8 -5
  358. data/app/views/decidim/user_activities/index.html.erb +1 -1
  359. data/app/views/decidim/user_group_mailer/notify_deprecation_to_member.html.erb +15 -0
  360. data/app/views/decidim/user_group_mailer/notify_deprecation_to_owner.html.erb +22 -0
  361. data/app/views/layouts/decidim/_application.html.erb +1 -1
  362. data/app/views/layouts/decidim/_head.html.erb +15 -12
  363. data/app/views/layouts/decidim/_impersonation_warning.html.erb +1 -1
  364. data/app/views/layouts/decidim/_js_configuration.html.erb +17 -19
  365. data/app/views/layouts/decidim/_meta_tags_context.html.erb +3 -0
  366. data/app/views/layouts/decidim/_offline_banner.html.erb +1 -1
  367. data/app/views/layouts/decidim/_wrapper.html.erb +8 -6
  368. data/app/views/layouts/decidim/footer/_focus_mode_main.html.erb +7 -0
  369. data/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +1 -1
  370. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +12 -2
  371. data/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +24 -0
  372. data/app/views/layouts/decidim/header/_main.html.erb +28 -22
  373. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +1 -1
  374. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +18 -18
  375. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +1 -1
  376. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +1 -1
  377. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +1 -1
  378. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +1 -1
  379. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +1 -1
  380. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +1 -1
  381. data/app/views/layouts/decidim/mailer.html.erb +2 -2
  382. data/app/views/layouts/decidim/newsletter_base.html.erb +2 -2
  383. data/app/views/layouts/decidim/shared/_layout_two_col.html.erb +3 -1
  384. data/app/views/layouts/decidim/shared/_layout_user_profile.html.erb +7 -3
  385. data/config/assets.rb +3 -3
  386. data/config/initializers/devise.rb +8 -0
  387. data/config/initializers/omniauth.rb +1 -1
  388. data/config/locales/ar.yml +0 -209
  389. data/config/locales/bg.yml +0 -238
  390. data/config/locales/bs-BA.yml +0 -30
  391. data/config/locales/ca-IT.yml +120 -294
  392. data/config/locales/ca.yml +120 -294
  393. data/config/locales/cs.yml +85 -284
  394. data/config/locales/de.yml +111 -285
  395. data/config/locales/el.yml +0 -224
  396. data/config/locales/en.yml +112 -286
  397. data/config/locales/eo.yml +0 -2
  398. data/config/locales/es-MX.yml +112 -286
  399. data/config/locales/es-PY.yml +112 -286
  400. data/config/locales/es.yml +112 -286
  401. data/config/locales/eu.yml +138 -312
  402. data/config/locales/fi-plain.yml +112 -286
  403. data/config/locales/fi.yml +112 -286
  404. data/config/locales/fr-CA.yml +85 -275
  405. data/config/locales/fr.yml +85 -275
  406. data/config/locales/ga-IE.yml +0 -28
  407. data/config/locales/gl.yml +0 -140
  408. data/config/locales/hu.yml +0 -237
  409. data/config/locales/id-ID.yml +0 -136
  410. data/config/locales/is-IS.yml +0 -14
  411. data/config/locales/it.yml +1 -234
  412. data/config/locales/ja.yml +107 -282
  413. data/config/locales/lb.yml +0 -189
  414. data/config/locales/lt.yml +0 -240
  415. data/config/locales/lv.yml +0 -186
  416. data/config/locales/nl.yml +0 -189
  417. data/config/locales/no.yml +0 -189
  418. data/config/locales/pl.yml +0 -244
  419. data/config/locales/pt-BR.yml +0 -213
  420. data/config/locales/pt.yml +0 -189
  421. data/config/locales/ro-RO.yml +54 -218
  422. data/config/locales/ru.yml +0 -62
  423. data/config/locales/sk.yml +0 -164
  424. data/config/locales/sr-CS.yml +0 -31
  425. data/config/locales/sv.yml +80 -263
  426. data/config/locales/tr-TR.yml +0 -189
  427. data/config/locales/uk.yml +0 -23
  428. data/config/locales/zh-CN.yml +0 -180
  429. data/config/locales/zh-TW.yml +0 -229
  430. data/config/routes.rb +3 -36
  431. data/db/migrate/20250217192438_convert_user_groups_into_users.rb +38 -0
  432. data/db/migrate/20250221085317_add_user_type_to_action_logs.rb +12 -0
  433. data/db/migrate/20250221090905_create_decidim_api_jwt_denylist.rb +11 -0
  434. data/db/migrate/20250221091348_add_api_key_to_decidim_api_user.rb +7 -0
  435. data/db/migrate/20250327143657_remove_metrics_content_blocks.rb +9 -0
  436. data/db/migrate/20250401153444_enable_pkce.rb +8 -0
  437. data/db/migrate/20250416130426_rename_doorkeeper_scopes.rb +25 -0
  438. data/db/migrate/20250515105231_rename_endorsements_to_likes.rb +62 -0
  439. data/db/migrate/20250523104311_move_cta_to_hero_content_block.rb +34 -0
  440. data/db/migrate/20250527122040_move_highlighted_content_banner_settings_to_content_block.rb +69 -0
  441. data/db/migrate/20250603103953_add_refresh_tokens_enabled_to_doorkeeper_applications.rb +7 -0
  442. data/db/migrate/20250609073104_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb +10 -0
  443. data/db/migrate/20250613122148_remove_hashtag_table_from_core.rb +7 -0
  444. data/decidim-core.gemspec +4 -4
  445. data/{app/helpers → lib}/decidim/action_authorization_helper.rb +5 -4
  446. data/lib/decidim/amendable.rb +4 -4
  447. data/lib/decidim/api/functions/user_entity_finder.rb +1 -1
  448. data/lib/decidim/api/input_filters/component_input_filter.rb +3 -3
  449. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +0 -21
  450. data/lib/decidim/api/input_sorts/has_likeable_input_sort.rb +15 -0
  451. data/lib/decidim/api/interfaces/attachable_collection_interface.rb +13 -0
  452. data/lib/decidim/api/interfaces/author_interface.rb +1 -2
  453. data/lib/decidim/api/interfaces/authorable_interface.rb +2 -2
  454. data/lib/decidim/api/interfaces/coauthorable_interface.rb +1 -1
  455. data/lib/decidim/api/interfaces/component_interface.rb +6 -0
  456. data/lib/decidim/api/interfaces/followable_interface.rb +13 -0
  457. data/lib/decidim/api/interfaces/likeable_interface.rb +19 -0
  458. data/lib/decidim/api/interfaces/localizable_interface.rb +18 -0
  459. data/lib/decidim/api/interfaces/participatory_space_interface.rb +6 -8
  460. data/lib/decidim/api/interfaces/referable_interface.rb +13 -0
  461. data/lib/decidim/api/interfaces/timestamps_interface.rb +0 -1
  462. data/lib/decidim/api/interfaces/traceable_interface.rb +1 -1
  463. data/lib/decidim/api/types/attachment_collection_type.rb +14 -0
  464. data/lib/decidim/api/types/organization_type.rb +3 -1
  465. data/lib/decidim/api/types/session_type.rb +0 -5
  466. data/lib/decidim/api/types/statistic_type.rb +29 -3
  467. data/lib/decidim/api/types/trace_version_type.rb +1 -1
  468. data/lib/decidim/api/types/user_type.rb +1 -2
  469. data/lib/decidim/api_response_helper.rb +12 -0
  470. data/lib/decidim/asset_router/storage.rb +10 -12
  471. data/lib/decidim/assets/tailwind/instance.rb +1 -1
  472. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +4 -3
  473. data/lib/decidim/attribute_encryptor.rb +1 -1
  474. data/lib/decidim/attributes/time_with_zone.rb +1 -1
  475. data/lib/decidim/authorable.rb +5 -34
  476. data/lib/decidim/coauthorable.rb +13 -31
  477. data/lib/decidim/content_parsers/blob_parser.rb +1 -1
  478. data/lib/decidim/content_parsers/mention_resource_parser.rb +23 -0
  479. data/lib/decidim/content_parsers/tag_parser.rb +2 -2
  480. data/lib/decidim/content_parsers/user_parser.rb +2 -2
  481. data/lib/decidim/content_parsers.rb +14 -2
  482. data/lib/decidim/content_processor.rb +1 -1
  483. data/lib/decidim/content_renderers/mention_resource_renderer.rb +77 -0
  484. data/lib/decidim/content_renderers.rb +1 -2
  485. data/lib/decidim/core/api.rb +7 -8
  486. data/lib/decidim/core/content_blocks/registry_manager.rb +19 -5
  487. data/lib/decidim/core/engine.rb +72 -104
  488. data/lib/decidim/core/menu.rb +0 -7
  489. data/lib/decidim/core/seeds.rb +11 -39
  490. data/lib/decidim/core/test/factories.rb +22 -121
  491. data/lib/decidim/core/test/shared_examples/authorable.rb +0 -17
  492. data/lib/decidim/core/test/shared_examples/coauthorable.rb +5 -48
  493. data/lib/decidim/core/test/shared_examples/comments_examples.rb +7 -56
  494. data/lib/decidim/core/test/shared_examples/likeable.rb +22 -0
  495. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +16 -3
  496. data/lib/decidim/core/test/shared_examples/map_examples.rb +1 -1
  497. data/lib/decidim/core/test/shared_examples/oauth_application_examples.rb +137 -0
  498. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +0 -18
  499. data/lib/decidim/core/test/shared_examples/permissions.rb +0 -46
  500. data/lib/decidim/core/test/shared_examples/reports_examples.rb +2 -2
  501. data/lib/decidim/core/test/shared_examples/{resource_endorsed_event_examples.rb → resource_liked_event_examples.rb} +7 -7
  502. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +0 -14
  503. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +8 -34
  504. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +79 -0
  505. data/lib/decidim/core/test/shared_examples/system_like_resource_examples.rb +192 -0
  506. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +2 -2
  507. data/lib/decidim/core/test/shared_examples/{with_endorsable_permissions_examples.rb → with_likeable_permissions_examples.rb} +22 -22
  508. data/lib/decidim/core/test.rb +6 -9
  509. data/lib/decidim/core/version.rb +1 -1
  510. data/lib/decidim/core.rb +237 -88
  511. data/lib/decidim/deprecations.rb +1 -1
  512. data/lib/decidim/download_your_data_serializers.rb +6 -3
  513. data/lib/decidim/env.rb +3 -1
  514. data/lib/decidim/events.rb +0 -1
  515. data/lib/decidim/form_builder.rb +27 -44
  516. data/lib/decidim/gamification/badge_scorer.rb +0 -2
  517. data/lib/decidim/gamification.rb +1 -1
  518. data/lib/decidim/has_conversations.rb +0 -44
  519. data/lib/decidim/has_workflows.rb +42 -0
  520. data/lib/decidim/icon_registry.rb +4 -4
  521. data/lib/decidim/legacy_form_builder.rb +17 -2
  522. data/lib/decidim/likeable.rb +24 -0
  523. data/lib/decidim/manifest_registry.rb +1 -1
  524. data/lib/decidim/map/provider/dynamic_map/here.rb +0 -19
  525. data/lib/decidim/map/provider/static_map/here.rb +2 -10
  526. data/lib/decidim/menu.rb +1 -1
  527. data/lib/decidim/moderation_tools.rb +1 -1
  528. data/lib/decidim/mutation_registry.rb +17 -0
  529. data/lib/decidim/newsletter_encryptor.rb +1 -1
  530. data/lib/decidim/oauth/token_generator.rb +35 -0
  531. data/lib/decidim/oauth.rb +7 -0
  532. data/lib/decidim/organization_settings.rb +2 -10
  533. data/lib/decidim/paddable.rb +1 -1
  534. data/lib/decidim/participatory_space_resourceable.rb +2 -2
  535. data/lib/decidim/participatory_space_user.rb +1 -1
  536. data/lib/decidim/pdf_signature_example.rb +108 -0
  537. data/lib/decidim/query.rb +1 -1
  538. data/lib/decidim/query_extensions.rb +0 -33
  539. data/lib/decidim/reportable.rb +1 -1
  540. data/lib/decidim/searchable.rb +4 -2
  541. data/lib/decidim/seeds.rb +8 -0
  542. data/lib/decidim/settings_manifest.rb +3 -2
  543. data/lib/decidim/{webpacker → shakapacker}/configuration.rb +4 -4
  544. data/lib/decidim/{webpacker → shakapacker}/runner.rb +3 -3
  545. data/lib/decidim/shakapacker/shakapacker.rb +8 -0
  546. data/lib/decidim/{webpacker → shakapacker}/shakapacker.yml +3 -1
  547. data/lib/decidim/{webpacker → shakapacker}/webpack/custom.js +1 -1
  548. data/lib/decidim/shakapacker.rb +34 -0
  549. data/lib/decidim/social_share_service_manifest.rb +7 -12
  550. data/lib/decidim/stats_registry.rb +15 -3
  551. data/{app/helpers → lib}/decidim/tooltip_helper.rb +3 -3
  552. data/lib/decidim/url_option_resolver.rb +1 -1
  553. data/lib/decidim/view_model.rb +0 -3
  554. data/lib/decidim/webpacker.rb +11 -20
  555. data/lib/decidim/workflow_registry.rb +61 -0
  556. data/lib/tasks/decidim_participants_tasks.rake +22 -0
  557. data/lib/tasks/{decidim_webpacker_tasks.rake → decidim_shakapacker_tasks.rake} +35 -33
  558. data/lib/tasks/decidim_tasks.rake +4 -1
  559. data/lib/tasks/decidim_taxonomies.rake +0 -34
  560. data/lib/tasks/upgrade/clean.rake +1 -1
  561. data/lib/tasks/upgrade/decidim_action_log_valuation_assignment.rake +13 -0
  562. data/lib/tasks/upgrade/decidim_change_valuator_tasks.rake +12 -0
  563. data/lib/tasks/upgrade/{decidim_deduplicate_endorsements.rake → decidim_deduplicate_likes.rake} +10 -10
  564. data/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake +2 -2
  565. data/lib/tasks/upgrade/decidim_paper_trail_valuation_assignment.rake +13 -0
  566. data/lib/tasks/upgrade/user_groups_migration.rake +155 -0
  567. metadata +204 -257
  568. data/app/cells/decidim/author/badge.erb +0 -6
  569. data/app/cells/decidim/author/endorsements.erb +0 -4
  570. data/app/cells/decidim/author/profile_minicard.erb +0 -30
  571. data/app/cells/decidim/content_blocks/organization_metrics_cell.rb +0 -21
  572. data/app/cells/decidim/content_blocks/participatory_space_metrics/content.erb +0 -18
  573. data/app/cells/decidim/content_blocks/participatory_space_metrics_cell.rb +0 -43
  574. data/app/cells/decidim/endorsement_block/show.erb +0 -3
  575. data/app/cells/decidim/endorsement_buttons/button_content.erb +0 -2
  576. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +0 -7
  577. data/app/cells/decidim/endorsement_buttons/show.erb +0 -17
  578. data/app/cells/decidim/endorsement_buttons_cell.rb +0 -87
  579. data/app/cells/decidim/endorsers_list/empty.erb +0 -3
  580. data/app/cells/decidim/endorsers_list/show.erb +0 -20
  581. data/app/cells/decidim/endorsers_list_cell.rb +0 -64
  582. data/app/cells/decidim/group_admins/show.erb +0 -34
  583. data/app/cells/decidim/group_admins_cell.rb +0 -8
  584. data/app/cells/decidim/group_members/show.erb +0 -46
  585. data/app/cells/decidim/group_members_cell.rb +0 -8
  586. data/app/cells/decidim/groups/show.erb +0 -14
  587. data/app/cells/decidim/groups_cell.rb +0 -22
  588. data/app/cells/decidim/members/show.erb +0 -12
  589. data/app/cells/decidim/members_cell.rb +0 -34
  590. data/app/cells/decidim/profile_actions/dropdown_actions.erb +0 -21
  591. data/app/cells/decidim/represent_user_group/show.erb +0 -11
  592. data/app/cells/decidim/represent_user_group_cell.rb +0 -46
  593. data/app/cells/decidim/user_conversation/conversation_header.erb +0 -14
  594. data/app/cells/decidim/user_conversation/messages.erb +0 -1
  595. data/app/cells/decidim/user_conversation/new.erb +0 -6
  596. data/app/cells/decidim/user_conversation/reply.erb +0 -9
  597. data/app/cells/decidim/user_conversation/show.erb +0 -19
  598. data/app/cells/decidim/user_conversation/start.erb +0 -12
  599. data/app/cells/decidim/user_conversation_cell.rb +0 -62
  600. data/app/cells/decidim/user_conversations/new_conversation_button.erb +0 -20
  601. data/app/cells/decidim/user_conversations/show.erb +0 -13
  602. data/app/cells/decidim/user_conversations_cell.rb +0 -28
  603. data/app/cells/decidim/user_group_pending_invitations_list/show.erb +0 -28
  604. data/app/cells/decidim/user_group_pending_invitations_list_cell.rb +0 -26
  605. data/app/cells/decidim/user_group_pending_requests_list/show.erb +0 -27
  606. data/app/cells/decidim/user_group_pending_requests_list_cell.rb +0 -26
  607. data/app/commands/decidim/accept_group_invitation.rb +0 -43
  608. data/app/commands/decidim/accept_user_group_join_request.rb +0 -53
  609. data/app/commands/decidim/create_user_group.rb +0 -73
  610. data/app/commands/decidim/demote_membership.rb +0 -57
  611. data/app/commands/decidim/endorse_resource.rb +0 -66
  612. data/app/commands/decidim/invite_user_to_group.rb +0 -63
  613. data/app/commands/decidim/join_user_group.rb +0 -57
  614. data/app/commands/decidim/leave_user_group.rb +0 -47
  615. data/app/commands/decidim/promote_membership.rb +0 -55
  616. data/app/commands/decidim/reject_group_invitation.rb +0 -42
  617. data/app/commands/decidim/reject_user_group_join_request.rb +0 -53
  618. data/app/commands/decidim/remove_user_from_group.rb +0 -53
  619. data/app/commands/decidim/unendorse_resource.rb +0 -39
  620. data/app/commands/decidim/update_user_group.rb +0 -72
  621. data/app/controllers/concerns/decidim/user_groups.rb +0 -23
  622. data/app/controllers/decidim/endorsements_controller.rb +0 -71
  623. data/app/controllers/decidim/group_email_confirmations_controller.rb +0 -32
  624. data/app/controllers/decidim/group_invites_controller.rb +0 -104
  625. data/app/controllers/decidim/group_members_controller.rb +0 -75
  626. data/app/controllers/decidim/groups_controller.rb +0 -99
  627. data/app/controllers/decidim/own_user_groups_controller.rb +0 -15
  628. data/app/controllers/decidim/user_conversations_controller.rb +0 -133
  629. data/app/controllers/decidim/user_group_join_requests_controller.rb +0 -72
  630. data/app/events/decidim/demoted_membership_event.rb +0 -28
  631. data/app/events/decidim/invited_to_group_event.rb +0 -62
  632. data/app/events/decidim/join_request_accepted_event.rb +0 -28
  633. data/app/events/decidim/join_request_created_event.rb +0 -28
  634. data/app/events/decidim/join_request_rejected_event.rb +0 -28
  635. data/app/events/decidim/promoted_to_admin_event.rb +0 -28
  636. data/app/events/decidim/removed_from_group_event.rb +0 -28
  637. data/app/events/decidim/resource_endorsed_event.rb +0 -36
  638. data/app/events/decidim/user_group_admin_event.rb +0 -37
  639. data/app/events/decidim/user_group_created_event.rb +0 -6
  640. data/app/events/decidim/user_group_updated_event.rb +0 -6
  641. data/app/forms/decidim/invite_user_to_group_form.rb +0 -29
  642. data/app/forms/decidim/user_group_form.rb +0 -87
  643. data/app/helpers/decidim/cta_button_helper.rb +0 -31
  644. data/app/helpers/decidim/endorsable_helper.rb +0 -84
  645. data/app/helpers/decidim/twitter_search_helper.rb +0 -14
  646. data/app/helpers/decidim/user_group_helper.rb +0 -22
  647. data/app/jobs/decidim/metric_job.rb +0 -15
  648. data/app/models/decidim/metric.rb +0 -25
  649. data/app/models/decidim/user_group.rb +0 -217
  650. data/app/models/decidim/user_group_membership.rb +0 -17
  651. data/app/packs/entrypoints/decidim_widget.js +0 -1
  652. data/app/packs/src/decidim/abide_form_validator_fixer.js +0 -44
  653. data/app/packs/src/decidim/account_form.js +0 -96
  654. data/app/packs/src/decidim/append_elements.js +0 -6
  655. data/app/packs/src/decidim/back_to_list.js +0 -26
  656. data/app/packs/src/decidim/change_report_form_behavior.js +0 -45
  657. data/app/packs/src/decidim/clipboard.js +0 -128
  658. data/app/packs/src/decidim/editor/extensions/hashtag/index.js +0 -66
  659. data/app/packs/src/decidim/editor/extensions/heading/index.js +0 -33
  660. data/app/packs/src/decidim/editor/test/extensions/hashtag.test.js +0 -105
  661. data/app/packs/src/decidim/form_filter.component_for_testing.js +0 -7
  662. data/app/packs/src/decidim/form_validator.js +0 -56
  663. data/app/packs/src/decidim/gallery.js +0 -5
  664. data/app/packs/src/decidim/impersonation.js +0 -23
  665. data/app/packs/src/decidim/input_autojump.js +0 -38
  666. data/app/packs/src/decidim/input_hashtags.js +0 -91
  667. data/app/packs/src/decidim/input_mentions.js +0 -143
  668. data/app/packs/src/decidim/input_multiple_mentions.js +0 -115
  669. data/app/packs/src/decidim/input_tags.js +0 -16
  670. data/app/packs/src/decidim/notifications_actions.js +0 -40
  671. data/app/packs/src/decidim/password_toggler.js +0 -104
  672. data/app/packs/src/decidim/remote_tooltips.js +0 -38
  673. data/app/packs/src/decidim/responsive_horizontal_tabs.js +0 -12
  674. data/app/packs/src/decidim/scroll_to_last_child.js +0 -14
  675. data/app/packs/src/decidim/slug_form.js +0 -9
  676. data/app/packs/src/decidim/sticky_footer.js +0 -48
  677. data/app/packs/src/decidim/sticky_header.js +0 -62
  678. data/app/packs/src/decidim/toggle.js +0 -37
  679. data/app/packs/src/decidim/tooltips.js +0 -152
  680. data/app/packs/src/decidim/user_registrations.js +0 -65
  681. data/app/packs/src/decidim/vizzs/areachart.js +0 -251
  682. data/app/packs/src/decidim/vizzs/index.js +0 -82
  683. data/app/packs/src/decidim/widget.js +0 -14
  684. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  685. data/app/packs/stylesheets/decidim/_metrics.scss +0 -70
  686. data/app/packs/stylesheets/decidim/_modal_identities.scss +0 -23
  687. data/app/presenters/decidim/admin_log/user_group_presenter.rb +0 -31
  688. data/app/presenters/decidim/hashtag_presenter.rb +0 -37
  689. data/app/presenters/decidim/metric_charts_presenter.rb +0 -92
  690. data/app/presenters/decidim/metric_object_presenter.rb +0 -32
  691. data/app/presenters/decidim/user_group_presenter.rb +0 -38
  692. data/app/queries/decidim/metric_manage.rb +0 -81
  693. data/app/queries/decidim/metric_measure.rb +0 -36
  694. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +0 -26
  695. data/app/queries/decidim/metrics/followers_metric_manage.rb +0 -65
  696. data/app/queries/decidim/metrics/participants_metric_manage.rb +0 -79
  697. data/app/queries/decidim/metrics/reported_users_metric_manage.rb +0 -26
  698. data/app/queries/decidim/metrics/user_reports_metric_manage.rb +0 -26
  699. data/app/queries/decidim/metrics/users_metric_manage.rb +0 -26
  700. data/app/queries/decidim/user_groups/accepted_memberships.rb +0 -36
  701. data/app/queries/decidim/user_groups/accepted_user_groups.rb +0 -38
  702. data/app/queries/decidim/user_groups/accepted_users.rb +0 -36
  703. data/app/queries/decidim/user_groups/admin_memberships.rb +0 -37
  704. data/app/queries/decidim/user_groups/invited_memberships.rb +0 -36
  705. data/app/queries/decidim/user_groups/manageable_user_groups.rb +0 -39
  706. data/app/queries/decidim/user_groups/member_memberships.rb +0 -37
  707. data/app/resolvers/decidim/core/metric_resolver.rb +0 -71
  708. data/app/resolvers/decidim/hashtags_resolver.rb +0 -15
  709. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +0 -22
  710. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +0 -38
  711. data/app/views/decidim/endorsements/_identity.html.erb +0 -4
  712. data/app/views/decidim/endorsements/identities.html.erb +0 -18
  713. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +0 -25
  714. data/app/views/decidim/group_invites/index.html.erb +0 -26
  715. data/app/views/decidim/groups/_form.html.erb +0 -17
  716. data/app/views/decidim/groups/edit.html.erb +0 -19
  717. data/app/views/decidim/groups/new.html.erb +0 -23
  718. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_conversation.html.erb +0 -17
  719. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_message.html.erb +0 -17
  720. data/app/views/decidim/messaging/conversation_mailer/new_group_conversation.html.erb +0 -17
  721. data/app/views/decidim/messaging/conversation_mailer/new_group_message.html.erb +0 -17
  722. data/app/views/decidim/own_user_groups/index.html.erb +0 -10
  723. data/app/views/decidim/shared/_extended_navigation_bar.html.erb +0 -50
  724. data/app/views/decidim/user_conversations/index.html.erb +0 -4
  725. data/app/views/decidim/user_conversations/show.html.erb +0 -4
  726. data/app/views/decidim/user_conversations/update.js.erb +0 -8
  727. data/config/initializers/new_framework_defaults_7_0.rb +0 -145
  728. data/lib/decidim/api/input_filters/has_hastaggable_input_filter.rb +0 -15
  729. data/lib/decidim/api/input_sorts/has_endorsable_input_sort.rb +0 -15
  730. data/lib/decidim/api/interfaces/endorsable_interface.rb +0 -19
  731. data/lib/decidim/api/types/hashtag_type.rb +0 -13
  732. data/lib/decidim/api/types/metric_history_type.rb +0 -20
  733. data/lib/decidim/api/types/metric_type.rb +0 -13
  734. data/lib/decidim/api/types/user_group_type.rb +0 -55
  735. data/lib/decidim/content_parsers/hashtag_parser.rb +0 -66
  736. data/lib/decidim/content_parsers/user_group_parser.rb +0 -33
  737. data/lib/decidim/content_renderers/hashtag_renderer.rb +0 -78
  738. data/lib/decidim/content_renderers/user_group_renderer.rb +0 -31
  739. data/lib/decidim/core/test/shared_examples/amendable_interface_examples.rb +0 -14
  740. data/lib/decidim/core/test/shared_examples/amendable_proposals_interface_examples.rb +0 -50
  741. data/lib/decidim/core/test/shared_examples/assembly_announcements_examples.rb +0 -38
  742. data/lib/decidim/core/test/shared_examples/attachable_interface_examples.rb +0 -16
  743. data/lib/decidim/core/test/shared_examples/authorable_interface_examples.rb +0 -59
  744. data/lib/decidim/core/test/shared_examples/categories_container_examples.rb +0 -22
  745. data/lib/decidim/core/test/shared_examples/categorizable_interface_examples.rb +0 -27
  746. data/lib/decidim/core/test/shared_examples/coauthorable_interface_examples.rb +0 -91
  747. data/lib/decidim/core/test/shared_examples/endorsable.rb +0 -69
  748. data/lib/decidim/core/test/shared_examples/endorsable_interface_examples.rb +0 -22
  749. data/lib/decidim/core/test/shared_examples/fingerprintable_interface_examples.rb +0 -17
  750. data/lib/decidim/core/test/shared_examples/input_filter_examples.rb +0 -118
  751. data/lib/decidim/core/test/shared_examples/input_sort_examples.rb +0 -126
  752. data/lib/decidim/core/test/shared_examples/metric_manage_shared_context.rb +0 -9
  753. data/lib/decidim/core/test/shared_examples/participatory_space_resourcable_interface_examples.rb +0 -43
  754. data/lib/decidim/core/test/shared_examples/process_announcements_examples.rb +0 -37
  755. data/lib/decidim/core/test/shared_examples/scopable_interface_examples.rb +0 -19
  756. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +0 -298
  757. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +0 -20
  758. data/lib/decidim/core/test/shared_examples/timestamps_interface_examples.rb +0 -21
  759. data/lib/decidim/core/test/shared_examples/traceable_interface_examples.rb +0 -47
  760. data/lib/decidim/download_your_data_serializers/download_your_data_user_group_serializer.rb +0 -21
  761. data/lib/decidim/endorsable.rb +0 -29
  762. data/lib/decidim/events/user_group_event.rb +0 -43
  763. data/lib/decidim/hashtag.rb +0 -13
  764. data/lib/decidim/metric_manifest.rb +0 -35
  765. data/lib/decidim/metric_operation.rb +0 -58
  766. data/lib/decidim/metric_operation_manifest.rb +0 -21
  767. data/lib/decidim/metric_registry.rb +0 -109
  768. data/lib/gem_overrides/shakapacker/runner.rb +0 -9
  769. data/lib/tasks/decidim_metrics_tasks.rake +0 -89
  770. /data/app/cells/decidim/{endorsement_buttons/disabled_endorsements.erb → like_buttons/disabled_likes.erb} +0 -0
  771. /data/app/packs/src/decidim/{configuration.js → refactor/implementation/configuration.js} +0 -0
  772. /data/app/packs/src/decidim/{external_domain_warning.js → refactor/implementation/external_domain_warning.js} +0 -0
  773. /data/app/packs/src/decidim/{autocomplete.js → refactor/moved/autocomplete.js} +0 -0
  774. /data/app/packs/src/decidim/{delayed.js → refactor/moved/delayed.js} +0 -0
  775. /data/app/packs/src/decidim/{focus_guard.js → refactor/moved/focus_guard.js} +0 -0
  776. /data/app/packs/src/decidim/{history.js → refactor/moved/history.js} +0 -0
  777. /data/app/packs/src/decidim/{i18n.js → refactor/moved/i18n.js} +0 -0
  778. /data/lib/decidim/core/test/shared_examples/{endorsements_controller_shared_context.rb → likes_controller_shared_context.rb} +0 -0
  779. /data/{app/helpers → lib}/decidim/resource_helper.rb +0 -0
  780. /data/lib/decidim/{webpacker → shakapacker}/esbuild.config.js +0 -0
  781. /data/lib/decidim/{webpacker → shakapacker}/postcss.config.js +0 -0
  782. /data/lib/decidim/{webpacker → shakapacker}/tsconfig.json +0 -0
  783. /data/lib/decidim/{webpacker → shakapacker}/webpack/.modernizrrc +0 -0
  784. /data/lib/decidim/{webpacker → shakapacker}/webpack/webpack.config.js +0 -0
@@ -46,7 +46,7 @@ module Decidim
46
46
 
47
47
  # Validates the emendation using the amendable form.
48
48
  def amendable_form_must_be_valid
49
- parse_hashtaggable_params
49
+ parse_content_params
50
50
  original_form.validate unless defined?(@original_form) # Preserves previously added errors.
51
51
 
52
52
  amendable_form.validate unless defined?(@amendable_form) # Preserves previously added errors.
@@ -72,13 +72,13 @@ module Decidim
72
72
  end
73
73
  end
74
74
 
75
- # Parses :title and :body attribute values with HashtagParser.
76
- def parse_hashtaggable_params
75
+ # Parses :title and :body attribute values with BlobParser.
76
+ def parse_content_params
77
77
  emendation_params.each do |key, value|
78
78
  next unless [:title, :body].include?(key)
79
79
 
80
80
  clean_value = translated_attribute(value)
81
- emendation_params[key] = Decidim::ContentParsers::HashtagParser.new(clean_value, form_context).rewrite
81
+ emendation_params[key] = Decidim::ContentParsers::BlobParser.new(clean_value, form_context).rewrite
82
82
  end
83
83
  end
84
84
 
@@ -10,6 +10,7 @@ module Decidim
10
10
  attribute :nickname
11
11
  attribute :organization
12
12
  attribute :verified, Boolean, default: false
13
+ attribute :onboarding_data, Hash, default: {}
13
14
 
14
15
  def name
15
16
  super || I18n.t("decidim.ephemeral_user", locale:)
@@ -46,7 +46,7 @@ module Decidim
46
46
  end
47
47
 
48
48
  def meet_push_notifications_requirements?
49
- Rails.application.secrets.dig(:vapid, :enabled) || false
49
+ Decidim.vapid_public_key.present?
50
50
  end
51
51
  end
52
52
  end
@@ -22,7 +22,7 @@ module Decidim
22
22
  validates :uid, presence: true
23
23
 
24
24
  def self.create_signature(provider, uid)
25
- Digest::MD5.hexdigest("#{provider}-#{uid}-#{Rails.application.secret_key_base}")
25
+ Digest::SHA256.hexdigest("#{provider}-#{uid}-#{Rails.application.secret_key_base}")
26
26
  end
27
27
 
28
28
  def normalized_nickname
@@ -79,7 +79,7 @@ module Decidim
79
79
  class AttachmentContextProxy
80
80
  attr_reader :organization, :attachment_context
81
81
 
82
- delegate :id, :_read_attribute, to: :organization
82
+ delegate :id, :_read_attribute, :read_attribute, to: :organization
83
83
 
84
84
  def initialize(organization, attachment_context)
85
85
  @organization = organization
@@ -90,6 +90,14 @@ module Decidim
90
90
  :id
91
91
  end
92
92
 
93
+ def self.composite_primary_key?
94
+ false
95
+ end
96
+
97
+ def self.has_query_constraints?
98
+ false
99
+ end
100
+
93
101
  def self.polymorphic_name
94
102
  "Decidim::Organization"
95
103
  end
@@ -83,7 +83,6 @@ module Decidim
83
83
 
84
84
  def amendments_form_field_for(attribute, form, original_resource)
85
85
  options = {
86
- class: "js-hashtags",
87
86
  label: amendments_form_fields_label(attribute),
88
87
  value: amendments_form_fields_value(original_resource, attribute)
89
88
  }
@@ -92,7 +91,7 @@ module Decidim
92
91
  when :title
93
92
  form.text_field(:title, options)
94
93
  when :body
95
- text_editor_for(form, :body, options.merge(hashtaggable: true))
94
+ text_editor_for(form, :body, options)
96
95
  end
97
96
  end
98
97
 
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module AnimationsHelper
5
+ def success_animation
6
+ content_tag(:div, class: "success-image") do
7
+ content_tag(:svg, class: "animation-success__checkmark", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 52 52") do
8
+ concat tag(:circle, class: "animation-success__checkmark__circle", cx: "26", cy: "26", r: "25", fill: "none")
9
+ concat tag(:path, class: "animation-success__checkmark__check", fill: "none", d: "M14.1 27.2l7.1 7.2 16.7-16.8")
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -11,11 +11,7 @@ module Decidim
11
11
  #
12
12
  # Returns a String.
13
13
  def decidim_form_for(record, options = {}, &)
14
- options[:data] ||= {}
15
- options[:data].update(:abide => true, "live-validate" => true, "validate-on-blur" => true)
16
-
17
- options[:html] ||= {}
18
- options[:html].update(novalidate: true) unless options[:html].has_key?(:novalidate)
14
+ options = parse_html_options(options)
19
15
 
20
16
  # Generally called by form_for but we need the :url option generated
21
17
  # already before that.
@@ -56,7 +52,7 @@ module Decidim
56
52
  template += label_tag(name, options[:label]) if options[:label] != false
57
53
  template += hidden_field_tag(name, value, options)
58
54
  template += content_tag(:div, nil, class: "editor-container", data: {
59
- toolbar: options[:toolbar]
55
+ toolbar: options[:toolbar], controller: "editor"
60
56
  }, style: "height: #{options[:lines]}rem")
61
57
  template.html_safe
62
58
  end
@@ -191,5 +187,20 @@ module Decidim
191
187
 
192
188
  organization.area_types
193
189
  end
190
+
191
+ private
192
+
193
+ def parse_html_options(options)
194
+ options[:data] ||= {}
195
+ options[:data].update(live_validate: true, validate_on_blur: true)
196
+ options[:data].update(controller: "") unless options[:data].has_key?(:controller)
197
+ options[:data][:controller] += " form-validator"
198
+ options[:data][:controller].strip!
199
+
200
+ options[:html] ||= {}
201
+ options[:html].update(novalidate: true) unless options[:html].has_key?(:novalidate)
202
+
203
+ options
204
+ end
194
205
  end
195
206
  end
@@ -63,7 +63,7 @@ module Decidim
63
63
  if name == "wechat-line"
64
64
  html_properties = html_properties.merge({ "aria-label" => I18n.t("decidim.author.comments.other") }).except("aria-hidden")
65
65
  elsif name == "heart-line"
66
- html_properties = html_properties.merge({ "aria-label" => I18n.t("decidim.author.endorsements.other") }).except("aria-hidden")
66
+ html_properties = html_properties.merge({ "aria-label" => I18n.t("decidim.author.likes.other") }).except("aria-hidden")
67
67
  end
68
68
 
69
69
  href = Decidim.cors_enabled ? "" : asset_pack_path("media/images/remixicon.symbol.svg")
@@ -122,20 +122,6 @@ module Decidim
122
122
  classes.compact
123
123
  end
124
124
 
125
- def extended_navigation_bar(items, max_items: 5)
126
- return unless items.any?
127
-
128
- extra_items = items.slice((max_items + 1)..-1) || []
129
- active_item = items.find { |item| item[:active] }
130
-
131
- controller.view_context.render partial: "decidim/shared/extended_navigation_bar", locals: {
132
- items:,
133
- extra_items:,
134
- active_item:,
135
- max_items:
136
- }
137
- end
138
-
139
125
  def current_user_unread_data
140
126
  return {} if current_user.blank?
141
127
 
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A Helper for views with likeable resources.
5
+ module LikeableHelper
6
+ # Public: Checks if like are enabled in this step.
7
+ #
8
+ # Returns true if enabled, false otherwise.
9
+ def likes_enabled?
10
+ current_settings.likes_enabled
11
+ end
12
+
13
+ # Public: Checks if likes are blocked in this step.
14
+ #
15
+ # Returns true if blocked, false otherwise.
16
+ def likes_blocked?
17
+ current_settings.likes_blocked
18
+ end
19
+
20
+ # Public: Checks if the current user is allowed to like in this step.
21
+ #
22
+ # Returns true if the current user can like, false otherwise.
23
+ def current_user_can_like?
24
+ current_user && likes_enabled? && !likes_blocked?
25
+ end
26
+
27
+ # Public: Checks if the card for likes should be rendered.
28
+ #
29
+ # Returns true if the likes card should be rendered, false otherwise.
30
+ def show_likes_card?
31
+ likes_enabled?
32
+ end
33
+
34
+ # produces the path that should be POST to create a like
35
+ def path_to_create_like(resource)
36
+ likes_path(resource_id: resource.to_gid.to_param,
37
+ authenticity_token: form_authenticity_token)
38
+ end
39
+
40
+ # Produces the path that should be DELETE to destroy a like.
41
+ def path_to_destroy_like(resource)
42
+ like_path(resource.to_gid.to_param,
43
+ authenticity_token: form_authenticity_token)
44
+ end
45
+ end
46
+ end
@@ -81,7 +81,7 @@ module Decidim
81
81
 
82
82
  help = content_tag(:div, class: "map__skip-container") do
83
83
  sr_content = content_tag(:p, t("screen_reader_explanation", scope: "decidim.map.dynamic"), class: "sr-only")
84
- link = link_to(t("skip_button", scope: "decidim.map.dynamic"), "##{bottom_id}", class: "map__skip", "data-skip-to-content": true)
84
+ link = link_to(t("skip_button", scope: "decidim.map.dynamic"), "##{bottom_id}", class: "map__skip")
85
85
 
86
86
  sr_content + link
87
87
  end
@@ -68,14 +68,8 @@ module Decidim
68
68
  @menu_highlighted_participatory_process ||= (
69
69
  # The queries already include the order by weight
70
70
  Decidim::ParticipatoryProcesses::OrganizationParticipatoryProcesses.new(current_organization) |
71
- Decidim::ParticipatoryProcesses::PromotedParticipatoryProcesses.new
72
- ).select(&:published?).map { |process| remove_private_space_if_not_private_user(process) }&.compact&.first
73
- end
74
-
75
- def remove_private_space_if_not_private_user(process)
76
- return nil if process.private_space == true && !process.can_participate?(current_user)
77
-
78
- process
71
+ Decidim::ParticipatoryProcesses::PromotedParticipatoryProcesses.new
72
+ ).first
79
73
  end
80
74
 
81
75
  def home_content_block_menu
@@ -116,7 +116,7 @@ module Decidim
116
116
  end
117
117
 
118
118
  #
119
- # Links to the conversation between the current user and another users group
119
+ # Links to the conversation between the current user and another users
120
120
  #
121
121
  def current_or_new_conversation_path_with_multiple(users, opts = {})
122
122
  return decidim_routes.new_user_session_path unless user_signed_in?
@@ -20,7 +20,7 @@ module Decidim
20
20
  name = "#{name}-fill"
21
21
 
22
22
  if provider_info
23
- icon_path = provider_info[:icon_path] || Rails.application.secrets.omniauth[provider][:icon_path].presence
23
+ icon_path = provider_info[:icon_path] || Decidim.omniauth_providers[provider][:icon_path].presence
24
24
  return external_icon(icon_path) if icon_path.present?
25
25
 
26
26
  name = provider_info[:icon] if provider_info[:icon]
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module QrCodeHelper
5
+ include Decidim::ShortLinkHelper
6
+
7
+ def resource_url
8
+ @resource_url ||= (resource_name ? short_url(route_name: resource_name, params: local_params) : decidim_meta_url)
9
+ end
10
+
11
+ def qr_code
12
+ @qr_code ||= RQRCode::QRCode.new(resource_url.to_s)
13
+ end
14
+
15
+ def local_params
16
+ return processed_params.merge(budget_id: resource.decidim_budgets_budget_id) if project?
17
+
18
+ processed_params
19
+ end
20
+
21
+ def resource_name
22
+ return "budget_project" if project?
23
+
24
+ resource.class.name.demodulize.underscore
25
+ end
26
+
27
+ def qr_code_image
28
+ Base64.encode64(qr_code.as_png(size: 500).to_s).gsub("\n", "")
29
+ end
30
+
31
+ private
32
+
33
+ def project?
34
+ Decidim.module_installed?(:budgets) && resource.is_a?(Decidim::Budgets::Project)
35
+ end
36
+ end
37
+ end
@@ -15,7 +15,6 @@ module Decidim
15
15
  options[:context] ||= "participant"
16
16
  form.editor attribute, options
17
17
  else
18
- options.delete(:hashtaggable)
19
18
  options[:rows] ||= 10
20
19
  form.text_area attribute, options
21
20
  end
@@ -112,12 +112,12 @@ module Decidim
112
112
  add_line_feeds_to_paragraphs(add_line_feeds_to_list_items(text))
113
113
  end
114
114
 
115
- def content_handle_locale(body, all_locales, extras, links, strip_tags)
115
+ def content_handle_locale(body, all_locales, links, strip_tags)
116
116
  handle_locales(body, all_locales) do |content|
117
117
  content = strip_tags(sanitize_text(content)) if strip_tags
118
118
 
119
- renderer = Decidim::ContentRenderers::HashtagRenderer.new(content)
120
- content = renderer.render(links:, extras:).html_safe
119
+ renderer = Decidim::ContentRenderers::BlobRenderer.new(content)
120
+ content = renderer.render.html_safe
121
121
 
122
122
  content = Decidim::ContentRenderers::LinkRenderer.new(content).render if links
123
123
  content
@@ -131,8 +131,8 @@ module Decidim
131
131
  # @param method [Symbol] Method name
132
132
  #
133
133
  # @return ActiveSupport::SafeBuffer
134
- def render_sanitized_content(resource, method)
135
- content = present(resource).send(method, links: true, strip_tags: !try(:safe_content?))
134
+ def render_sanitized_content(resource, method, presenter_class: nil)
135
+ content = present(resource, presenter_class:).send(method, links: true, strip_tags: !try(:safe_content?))
136
136
 
137
137
  return decidim_sanitize(content, {}) unless try(:safe_content?)
138
138
  return decidim_sanitize_editor_admin(content, {}) if try(:safe_content_admin?)
@@ -6,9 +6,7 @@ module Decidim
6
6
  def social_share_button_tag(title, args)
7
7
  return unless enabled_services.length.positive?
8
8
 
9
- content_tag :div, class: "share-modal__list", data: { social_share: "" } do
10
- render_social_share_buttons(enabled_services, title, args)
11
- end
9
+ render_social_share_buttons(enabled_services, title, args)
12
10
  end
13
11
 
14
12
  def render_social_share_buttons(services, title, args)
@@ -21,18 +19,21 @@ module Decidim
21
19
  uri = service.formatted_share_uri(title, args)
22
20
  return unless uri
23
21
 
22
+ data = service.optional_args.reverse_merge(
23
+ "site" => service.name.downcase,
24
+ "external-link" => "text-only",
25
+ "external-domain-link" => false
26
+ )
27
+
24
28
  link_to(
25
29
  uri,
26
30
  rel: "nofollow noopener noreferrer",
27
31
  target: "_blank",
28
- data: {
29
- "site" => service.name.downcase,
30
- "external-link" => "text-only",
31
- "external-domain-link" => false
32
- },
32
+ data:,
33
33
  title: t("decidim.shared.share_modal.share_to", service: service.name)
34
34
  ) do
35
- render_social_share_icon(service) + content_tag(:span, service.name)
35
+ content_tag(:span, render_social_share_icon(service), class: "icon") +
36
+ content_tag(:span, service.name, class: "text")
36
37
  end
37
38
  end
38
39
 
@@ -40,7 +41,7 @@ module Decidim
40
41
  if service.icon.include? ".svg"
41
42
  image_tag service.icon_path, options.merge(alt: t("decidim.shared.share_modal.share_to", service: service.name))
42
43
  else
43
- icon(service.icon, options.merge(ignore_missing: true, style: "color: #{service.icon_color};"))
44
+ icon(service.icon, options.merge(ignore_missing: true))
44
45
  end
45
46
  end
46
47
 
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A job to delete inactive participants and notify them
5
+ class DeleteInactiveParticipantsJob < ApplicationJob
6
+ queue_as :delete_inactive_participants
7
+
8
+ def perform(organization)
9
+ clear_notifications_for_active_users(organization)
10
+ send_first_warning_notifications(organization.users.first_warning_inactive_users)
11
+ send_last_warning_notifications(organization.users.last_warning_inactive_users)
12
+ remove_inactive_users(organization.users.removable_users)
13
+ end
14
+
15
+ private
16
+
17
+ def enqueue_jobs(users, action, *args)
18
+ users.find_each do |user|
19
+ ProcessInactiveParticipantJob.perform_later(user.id, action, *args)
20
+ end
21
+ end
22
+
23
+ def clear_notifications_for_active_users(organization)
24
+ enqueue_jobs(organization.users.not_deleted
25
+ .with_inactivity_notification
26
+ .active_after_notification, :clear_notification)
27
+ end
28
+
29
+ def send_first_warning_notifications(users)
30
+ enqueue_jobs(users, :send_warning, "first", Decidim.delete_inactive_users_first_warning_days_before)
31
+ end
32
+
33
+ def send_last_warning_notifications(users)
34
+ enqueue_jobs(users, :send_warning, "second", Decidim.delete_inactive_users_last_warning_days_before)
35
+ end
36
+
37
+ def remove_inactive_users(users)
38
+ enqueue_jobs(users, :remove)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A job to process a single inactive participant
5
+ class ProcessInactiveParticipantJob < ApplicationJob
6
+ queue_as :delete_inactive_participants
7
+
8
+ def perform(user_id, action, *)
9
+ user = Decidim::User.find_by(id: user_id)
10
+ return unless user
11
+
12
+ case action.to_sym
13
+ when :clear_notification
14
+ user.extended_data.delete("inactivity_notification")
15
+ user.save!
16
+ when :send_warning
17
+ process_send_warning(user, *)
18
+ when :remove
19
+ process_remove_user(user)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def process_send_warning(user, type, days)
26
+ user.extended_data.deep_merge!(
27
+ "inactivity_notification" => { "notification_type" => type, "sent_at" => Time.current }
28
+ )
29
+ user.update!(extended_data: user.extended_data)
30
+ ParticipantsAccountMailer.inactivity_notification(user, days).deliver_later
31
+ end
32
+
33
+ def process_remove_user(user)
34
+ email = user.email
35
+ name = user.name
36
+ locale = user.locale
37
+ organization = user.organization
38
+
39
+ ParticipantsAccountMailer.removal_notification(email, name, locale, organization).deliver_later
40
+
41
+ Decidim::DestroyAccount.call(
42
+ Decidim::DeleteAccountForm.from_params(
43
+ delete_reason: I18n.t("decidim.account.destroy.inactive_account_removal_reason", inactivity_period: Decidim.delete_inactive_users_after_days)
44
+ ).with_context(current_user: user)
45
+ )
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A mailer to notify users about their account status
5
+ class ParticipantsAccountMailer < Decidim::ApplicationMailer
6
+ # Notify user about inactivity and potential account removal
7
+ def inactivity_notification(user, days)
8
+ with_user(user) do
9
+ @user = user
10
+ @organization = user.organization
11
+ @days_before_deletion = days
12
+
13
+ subject = I18n.t(
14
+ "decidim.participants_account_mailer.inactivity_notification.subject",
15
+ organization_name: organization_name(@organization)
16
+ )
17
+
18
+ mail(to: user.email, subject:)
19
+ end
20
+ end
21
+
22
+ # Notify user about account removal due to inactivity
23
+ def removal_notification(email, name, locale, organization)
24
+ @email = email
25
+ @user_name = name
26
+ @organization = organization
27
+
28
+ I18n.with_locale(locale) do
29
+ subject = I18n.t(
30
+ "decidim.participants_account_mailer.removal_notification.subject",
31
+ organization_name: organization_name(@organization)
32
+ )
33
+
34
+ mail(to: email, subject:)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class UserGroupMailer < ApplicationMailer
5
+ def notify_deprecation_to_owner(group)
6
+ with_user(group) do
7
+ @group_name = group.name
8
+ @group_email = group.email
9
+ @organization = group.organization
10
+
11
+ subject = I18n.t("notify_deprecation_to_owner.subject", scope: "decidim.user_group_mailer")
12
+ mail(to: group.email, subject:)
13
+ end
14
+ end
15
+
16
+ def notify_deprecation_to_member(user, group_name, group_email)
17
+ with_user(user) do
18
+ @user = user
19
+ @group_name = group_name
20
+ @group_email = group_email
21
+ @organization = user.organization
22
+
23
+ subject = I18n.t("notify_deprecation_to_member.subject", scope: "decidim.user_group_mailer")
24
+ mail(to: user.email, subject:)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -12,9 +12,7 @@ module Decidim
12
12
  foreign_key: :decidim_organization_id,
13
13
  class_name: "Decidim::Organization"
14
14
 
15
- belongs_to :user,
16
- foreign_key: :decidim_user_id,
17
- class_name: "Decidim::User"
15
+ belongs_to :user, class_name: "Decidim::UserBaseEntity"
18
16
 
19
17
  belongs_to :component,
20
18
  foreign_key: :decidim_component_id,
@@ -200,7 +198,7 @@ module Decidim
200
198
  # Lazy loads the `user` association through BatchLoader, can be used
201
199
  # as a regular object.
202
200
  def user_lazy(cache: true)
203
- self.class.lazy_relation(decidim_user_id, "Decidim::User", cache)
201
+ self.class.lazy_relation(user_id, user_type, cache)
204
202
  end
205
203
 
206
204
  # Lazy loads the `participatory_space` association through BatchLoader, can be used
@@ -247,7 +245,7 @@ module Decidim
247
245
  elsif klass.reflect_on_association(:organization)
248
246
  scope.where(id: relation_ids).includes(:organization)
249
247
  elsif klass_name == "Decidim::Comments::Comment"
250
- scope.where(id: relation_ids).includes([:moderation, :root_commentable, :user_group])
248
+ scope.where(id: relation_ids).includes([:moderation, :root_commentable])
251
249
  else
252
250
  scope
253
251
  end
@@ -10,7 +10,7 @@ module Decidim
10
10
 
11
11
  validates :state, presence: true, inclusion: { in: STATES.keys.map(&:to_s) }
12
12
 
13
- enum state: STATES, _default: "draft"
13
+ enum :state, STATES, default: "draft"
14
14
 
15
15
  # Reports the mapped resource type for authorization transfers.
16
16
  #
@@ -11,6 +11,8 @@ module Decidim
11
11
  belongs_to :collection_for, polymorphic: true
12
12
  has_many :attachments, class_name: "Decidim::Attachment", dependent: :nullify
13
13
 
14
+ delegate :organization, to: :collection_for
15
+
14
16
  default_scope { order(arel_table[:weight].asc) }
15
17
 
16
18
  def unused?
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Rails/HelperInstanceVariable
4
3
  module Decidim
5
4
  # An authorization transfer object is created when the user authorizes
6
5
  # themselves with the same unique ID as some other user had used in the past.
@@ -9,7 +9,7 @@ module Decidim
9
9
  after_commit :author_is_follower, on: [:create]
10
10
 
11
11
  def identity
12
- user_group || author
12
+ author
13
13
  end
14
14
 
15
15
  # Reports the mapped resource type for authorization transfers.
@@ -77,7 +77,10 @@ module Decidim
77
77
 
78
78
  # Public: Returns the value of the registered primary stat.
79
79
  def primary_stat
80
- @primary_stat ||= manifest.stats.filter(primary: true).with_context([self]).map { |name, value| [name, value] }.first&.last
80
+ @primary_stat ||= begin
81
+ data = manifest.stats.filter(primary: true).with_context([self]).map { |name, value| [name, value] }.first&.first&.[](:data)
82
+ data.respond_to?(:first) ? data.first : data
83
+ end
81
84
  end
82
85
 
83
86
  # Public: Returns the component's name as resource title