decidim-core 0.30.3 → 0.31.0.rc2

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 (777) 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/avatar.erb +1 -7
  8. data/app/cells/decidim/author/likes.erb +4 -0
  9. data/app/cells/decidim/author/name.erb +1 -5
  10. data/app/cells/decidim/author/show.erb +45 -19
  11. data/app/cells/decidim/author_cell.rb +5 -28
  12. data/app/cells/decidim/badge_cell.rb +1 -7
  13. data/app/cells/decidim/card_cell.rb +2 -12
  14. data/app/cells/decidim/card_metadata_cell.rb +4 -4
  15. data/app/cells/decidim/coauthorships_cell.rb +1 -1
  16. data/app/cells/decidim/collapsible_authors/show.erb +1 -1
  17. data/app/cells/decidim/content_blocks/hero_cell.rb +23 -4
  18. data/app/cells/decidim/content_blocks/hero_settings_form/show.erb +16 -2
  19. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +6 -6
  20. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +28 -1
  21. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form/show.erb +27 -0
  22. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form_cell.rb +13 -0
  23. data/app/cells/decidim/content_blocks/highlighted_elements_for_component_settings_form/show.erb +9 -2
  24. data/app/cells/decidim/content_blocks/html_settings_form/show.erb +3 -1
  25. data/app/cells/decidim/content_blocks/last_activity_cell.rb +1 -1
  26. data/app/cells/decidim/content_blocks/last_activity_settings_form/show.erb +3 -1
  27. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity_cell.rb +1 -1
  28. data/app/cells/decidim/content_blocks/participatory_space_extra_data/recent_users.erb +1 -1
  29. data/app/cells/decidim/content_blocks/participatory_space_hero/show.erb +0 -5
  30. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +1 -13
  31. data/app/cells/decidim/content_blocks/participatory_space_hero_settings_form/show.erb +10 -3
  32. data/app/cells/decidim/content_blocks/participatory_space_last_activity/content.erb +1 -1
  33. data/app/cells/decidim/content_blocks/participatory_space_last_activity/recent_avatars.erb +1 -1
  34. data/app/cells/decidim/content_blocks/participatory_space_last_activity_cell.rb +3 -3
  35. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +17 -5
  36. data/app/cells/decidim/content_blocks/participatory_space_main_data_cell.rb +4 -0
  37. data/app/cells/decidim/content_blocks/stats/show.erb +2 -3
  38. data/app/cells/decidim/data_consent/modal.erb +1 -1
  39. data/app/cells/decidim/like_block/show.erb +3 -0
  40. data/app/cells/decidim/{endorsement_block_cell.rb → like_block_cell.rb} +2 -2
  41. data/app/cells/decidim/like_buttons/button_content.erb +2 -0
  42. data/app/cells/decidim/like_buttons/show.erb +17 -0
  43. data/app/cells/decidim/{endorsement_buttons → like_buttons}/verification_modal.erb +3 -3
  44. data/app/cells/decidim/like_buttons_cell.rb +77 -0
  45. data/app/cells/decidim/likers_list/empty.erb +3 -0
  46. data/app/cells/decidim/{endorsers_list → likers_list}/full.erb +3 -3
  47. data/app/cells/decidim/likers_list/show.erb +20 -0
  48. data/app/cells/decidim/likers_list_cell.rb +64 -0
  49. data/app/cells/decidim/nav_links/show.erb +1 -1
  50. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  51. data/app/cells/decidim/onboarding_action_message_cell.rb +1 -1
  52. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +0 -8
  53. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +0 -8
  54. data/app/cells/decidim/profile/details.erb +1 -1
  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_profile/show.erb +1 -1
  77. data/app/cells/decidim/user_profile_cell.rb +1 -9
  78. data/app/cells/decidim/version_author_cell.rb +0 -7
  79. data/app/commands/decidim/amendable/accept.rb +1 -3
  80. data/app/commands/decidim/amendable/create_draft.rb +2 -3
  81. data/app/commands/decidim/amendable/update_draft.rb +2 -3
  82. data/app/commands/decidim/create_ephemeral_user.rb +7 -1
  83. data/app/commands/decidim/create_omniauth_registration.rb +8 -7
  84. data/app/commands/decidim/create_report.rb +9 -1
  85. data/app/commands/decidim/destroy_account.rb +0 -5
  86. data/app/commands/decidim/like_resource.rb +52 -0
  87. data/app/commands/decidim/messaging/reply_to_conversation.rb +2 -21
  88. data/app/commands/decidim/messaging/start_conversation.rb +2 -21
  89. data/app/commands/decidim/unlike_resource.rb +34 -0
  90. data/app/commands/decidim/update_account.rb +1 -1
  91. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +6 -2
  92. data/app/controllers/concerns/decidim/user_profile.rb +0 -1
  93. data/app/controllers/decidim/account_controller.rb +1 -1
  94. data/app/controllers/decidim/amendments_controller.rb +4 -5
  95. data/app/controllers/decidim/application_controller.rb +2 -1
  96. data/app/controllers/decidim/devise/confirmations_controller.rb +0 -5
  97. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -1
  98. data/app/controllers/decidim/devise/passwords_controller.rb +1 -1
  99. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  100. data/app/controllers/decidim/doorkeeper/authorizations_controller.rb +19 -1
  101. data/app/controllers/decidim/download_your_data_controller.rb +2 -2
  102. data/app/controllers/decidim/likes_controller.rb +57 -0
  103. data/app/controllers/decidim/links_controller.rb +1 -0
  104. data/app/controllers/decidim/messaging/conversations_controller.rb +1 -8
  105. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  106. data/app/controllers/decidim/notifications_settings_controller.rb +2 -2
  107. data/app/controllers/decidim/pages_controller.rb +0 -1
  108. data/app/controllers/decidim/profiles_controller.rb +2 -57
  109. data/app/controllers/decidim/qr_controller.rb +73 -0
  110. data/app/controllers/decidim/resource_autocomplete_controller.rb +56 -0
  111. data/app/controllers/decidim/user_activities_controller.rb +0 -1
  112. data/app/events/decidim/resource_liked_event.rb +36 -0
  113. data/app/forms/decidim/amendable/create_form.rb +0 -1
  114. data/app/forms/decidim/amendable/edit_form.rb +0 -1
  115. data/app/forms/decidim/amendable/form.rb +4 -4
  116. data/app/forms/decidim/ephemeral_user_form.rb +1 -0
  117. data/app/forms/decidim/notifications_settings_form.rb +1 -1
  118. data/app/forms/decidim/omniauth_registration_form.rb +1 -1
  119. data/app/forms/decidim/upload_validation_form.rb +9 -1
  120. data/app/helpers/decidim/amendments_helper.rb +1 -2
  121. data/app/helpers/decidim/animations_helper.rb +14 -0
  122. data/app/helpers/decidim/decidim_form_helper.rb +17 -6
  123. data/app/helpers/decidim/layout_helper.rb +1 -15
  124. data/app/helpers/decidim/likeable_helper.rb +46 -0
  125. data/app/helpers/decidim/messaging/conversation_helper.rb +1 -1
  126. data/app/helpers/decidim/omniauth_helper.rb +1 -1
  127. data/app/helpers/decidim/qr_code_helper.rb +37 -0
  128. data/app/helpers/decidim/rich_text_editor_helper.rb +0 -1
  129. data/app/helpers/decidim/sanitize_helper.rb +5 -5
  130. data/app/helpers/decidim/social_share_button_helper.rb +11 -10
  131. data/app/jobs/decidim/delete_inactive_participants_job.rb +41 -0
  132. data/app/jobs/decidim/process_inactive_participant_job.rb +48 -0
  133. data/app/mailers/decidim/participants_account_mailer.rb +38 -0
  134. data/app/mailers/decidim/user_group_mailer.rb +49 -0
  135. data/app/models/decidim/action_log.rb +3 -5
  136. data/app/models/decidim/amendment.rb +1 -1
  137. data/app/models/decidim/attachment_collection.rb +2 -0
  138. data/app/models/decidim/authorization_transfer.rb +0 -1
  139. data/app/models/decidim/coauthorship.rb +1 -1
  140. data/app/models/decidim/component.rb +4 -1
  141. data/app/models/decidim/{endorsement.rb → like.rb} +4 -4
  142. data/app/models/decidim/messaging/conversation.rb +3 -5
  143. data/app/models/decidim/messaging/message.rb +3 -15
  144. data/app/models/decidim/omniauth_provider.rb +1 -1
  145. data/app/models/decidim/organization.rb +3 -8
  146. data/app/models/decidim/participatory_space_role_config/{valuator.rb → evaluator.rb} +1 -1
  147. data/app/models/decidim/reminder_record.rb +1 -1
  148. data/app/models/decidim/searchable_resource.rb +16 -0
  149. data/app/models/decidim/taxonomy.rb +6 -1
  150. data/app/models/decidim/user.rb +32 -15
  151. data/app/models/decidim/user_base_entity.rb +2 -2
  152. data/app/packs/entrypoints/decidim_conference_diploma.scss +2 -2
  153. data/app/packs/entrypoints/decidim_core.scss +2 -2
  154. data/app/packs/entrypoints/decidim_editor.js +0 -4
  155. data/app/packs/entrypoints/decidim_map.scss +2 -2
  156. data/app/packs/entrypoints/decidim_overrides.scss +1 -1
  157. data/app/packs/entrypoints/decidim_qr.js +1 -0
  158. data/app/packs/images/decidim/remixicon.symbol.svg +3 -3
  159. data/app/packs/src/decidim/a11y.js +1 -120
  160. data/app/packs/src/decidim/append_redirect_url_to_modals.js +1 -1
  161. data/app/packs/src/decidim/attachments/file_or_link_tabs.js +1 -1
  162. data/app/packs/src/decidim/confirm.js +27 -20
  163. data/app/packs/src/decidim/controllers/.keep +0 -0
  164. data/app/packs/src/decidim/controllers/accordion/controller.js +100 -0
  165. data/app/packs/src/decidim/controllers/account_form/account_form.test.js +423 -0
  166. data/app/packs/src/decidim/controllers/account_form/controller.js +69 -0
  167. data/app/packs/src/decidim/{input_character_counter.js → controllers/character_counter/controller.js} +90 -106
  168. data/app/packs/src/decidim/controllers/clipboard_copy/clipboard_copy.test.js +305 -0
  169. data/app/packs/src/decidim/controllers/clipboard_copy/controller.js +403 -0
  170. data/app/packs/src/decidim/controllers/date_picker/controller.js +12 -0
  171. data/app/packs/src/decidim/controllers/delete_account_form/controller.js +45 -0
  172. data/app/packs/src/decidim/controllers/delete_account_form/delete_account_form.test.js +216 -0
  173. data/app/packs/src/decidim/controllers/dropdown/controller.js +125 -0
  174. data/app/packs/src/decidim/controllers/editor/controller.js +11 -0
  175. data/app/packs/src/decidim/controllers/emoji/controller.js +26 -0
  176. data/app/packs/src/decidim/{input_emoji.js → controllers/emoji/emoji.js} +1 -15
  177. data/app/packs/src/decidim/{form_filter.js → controllers/form_filter/controller.js} +68 -51
  178. data/app/packs/src/decidim/controllers/form_filter/form_filter.test.js +648 -0
  179. data/app/packs/src/decidim/controllers/form_validator/controller.js +23 -0
  180. data/app/packs/src/decidim/controllers/form_validator/form_validator.js +789 -0
  181. data/app/packs/src/decidim/controllers/form_validator/form_validator.test.js +685 -0
  182. data/app/packs/src/decidim/controllers/impersonation_warning/controller.js +137 -0
  183. data/app/packs/src/decidim/controllers/impersonation_warning/impersonation.test.js +382 -0
  184. data/app/packs/src/decidim/controllers/input_tags/controller.js +28 -0
  185. data/app/packs/src/decidim/controllers/mention/controller.js +243 -0
  186. data/app/packs/src/decidim/controllers/mention/input_mentions.test.js +562 -0
  187. data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +215 -0
  188. data/app/packs/src/decidim/controllers/multiple_mentions/input_multiple_mentions.test.js +645 -0
  189. data/app/packs/src/decidim/controllers/notification_action/controller.js +210 -0
  190. data/app/packs/src/decidim/controllers/notification_action/notification_action.test.js +388 -0
  191. data/app/packs/src/decidim/controllers/password_toggler/controller.js +232 -0
  192. data/app/packs/src/decidim/controllers/password_toggler/password_toggler.test.js +229 -0
  193. data/app/packs/src/decidim/controllers/report_form/controller.js +184 -0
  194. data/app/packs/src/decidim/controllers/report_form/report_form_manager.test.js +511 -0
  195. data/app/packs/src/decidim/controllers/scroll_to_last/controller.js +9 -0
  196. data/app/packs/src/decidim/controllers/scroll_to_last/scroll_to_last_child.test.js +225 -0
  197. data/app/packs/src/decidim/controllers/sticky_buttons/controller.js +55 -0
  198. data/app/packs/src/decidim/controllers/sticky_buttons/sticky_buttons.test.js +334 -0
  199. data/app/packs/src/decidim/controllers/sticky_header/controller.js +116 -0
  200. data/app/packs/src/decidim/controllers/sticky_header/sticky_header.test.js +320 -0
  201. data/app/packs/src/decidim/controllers/toggle/controller.js +111 -0
  202. data/app/packs/src/decidim/controllers/toggle/toggle.test.js +260 -0
  203. data/app/packs/src/decidim/controllers/tooltip/controller.js +287 -0
  204. data/app/packs/src/decidim/controllers/tooltip/tooltip.test.js +380 -0
  205. data/app/packs/src/decidim/controllers/user_registration_form/controller.js +160 -0
  206. data/app/packs/src/decidim/controllers/user_registration_form/omniauth_registration_form.test.js +441 -0
  207. data/app/packs/src/decidim/controllers/user_registration_form/user_registration_form.test.js +386 -0
  208. data/app/packs/src/decidim/data_consent/index.js +1 -1
  209. data/app/packs/src/decidim/datalist_select.js +1 -1
  210. data/app/packs/src/decidim/datepicker/form_datepicker.js +1 -1
  211. data/app/packs/src/decidim/datepicker/generate_datepicker.js +2 -2
  212. data/app/packs/src/decidim/datepicker/generate_timepicker.js +2 -2
  213. data/app/packs/src/decidim/direct_uploads/upload_field.js +3 -5
  214. data/app/packs/src/decidim/direct_uploads/upload_modal.js +1 -1
  215. data/app/packs/src/decidim/dropdown_menu.js +1 -1
  216. data/app/packs/src/decidim/editor/common/input_dialog.js +1 -1
  217. data/app/packs/src/decidim/editor/common/suggestion.js +10 -2
  218. data/app/packs/src/decidim/editor/common/upload_dialog.js +1 -1
  219. data/app/packs/src/decidim/editor/extensions/decidim_kit/index.js +7 -7
  220. data/app/packs/src/decidim/editor/extensions/emoji/index.js +2 -3
  221. data/app/packs/src/decidim/editor/extensions/image/index.js +1 -1
  222. data/app/packs/src/decidim/editor/extensions/image/node_view.js +1 -1
  223. data/app/packs/src/decidim/editor/extensions/link/bubble_menu.js +1 -1
  224. data/app/packs/src/decidim/editor/extensions/link/index.js +1 -1
  225. data/app/packs/src/decidim/editor/extensions/mention/index.js +1 -2
  226. data/app/packs/src/decidim/editor/extensions/mention_resource/index.js +69 -0
  227. data/app/packs/src/decidim/editor/extensions/video_embed/index.js +1 -1
  228. data/app/packs/src/decidim/editor/index.js +6 -5
  229. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +1 -2
  230. data/app/packs/src/decidim/editor/test/extensions/emoji.test.js +17 -0
  231. data/app/packs/src/decidim/editor/test/extensions/heading.test.js +2 -2
  232. data/app/packs/src/decidim/editor/toolbar.js +1 -1
  233. data/app/packs/src/decidim/form_attachments.js +1 -1
  234. data/app/packs/src/decidim/geocoding/attach_input.js +3 -0
  235. data/app/packs/src/decidim/geocoding/provider/here.js +1 -1
  236. data/app/packs/src/decidim/geocoding/provider/photon.js +1 -1
  237. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +2 -2
  238. data/app/packs/src/decidim/geocoding.js +2 -2
  239. data/app/packs/src/decidim/index.js +127 -95
  240. data/app/packs/src/decidim/map/integration/forms.js +1 -1
  241. data/app/packs/src/decidim/map/legacy.js +1 -1
  242. data/app/packs/src/decidim/map/provider/default.js +1 -1
  243. data/app/packs/src/decidim/map/provider/here.js +1 -1
  244. data/app/packs/src/decidim/map.js +1 -1
  245. data/app/packs/src/decidim/{external_link.js → refactor/implementation/external_link.js} +1 -1
  246. data/app/packs/src/decidim/{onboarding_pending_action.js → refactor/integration/onboarding_pending_action.js} +4 -4
  247. data/app/packs/src/decidim/{check_boxes_tree.js → refactor/moved/check_boxes_tree.js} +25 -9
  248. data/app/packs/src/decidim/{i18n.test.js → refactor/moved/i18n.test.js} +1 -1
  249. data/app/packs/src/decidim/{icon.js → refactor/moved/icon.js} +2 -0
  250. data/app/packs/src/decidim/refactor/support/stimulus.js +39 -0
  251. data/app/packs/src/decidim/refactor/test/configuration.test.js +360 -0
  252. data/app/packs/src/decidim/{external_domain_warning.test.js → refactor/test/external_domain_warning.test.js} +1 -1
  253. data/app/packs/src/decidim/{external_link.test.js → refactor/test/external_link.test.js} +1 -1
  254. data/app/packs/src/decidim/results_listing.js +2 -2
  255. data/app/packs/src/decidim/security/selfxss_warning.js +1 -1
  256. data/app/packs/src/decidim/session_timeouter.js +1 -1
  257. data/app/packs/src/decidim/sw/push-permissions.js +1 -1
  258. data/app/packs/src/decidim/utilities/dom.js +1 -1
  259. data/app/packs/stylesheets/decidim/_accordion.scss +37 -3
  260. data/app/packs/stylesheets/decidim/_author.scss +7 -22
  261. data/app/packs/stylesheets/decidim/_buttons.scss +4 -0
  262. data/app/packs/stylesheets/decidim/_callout.scss +1 -1
  263. data/app/packs/stylesheets/decidim/_cards.scss +1 -1
  264. data/app/packs/stylesheets/decidim/_content_blocks.scss +1 -1
  265. data/app/packs/stylesheets/decidim/_cookies.scss +1 -1
  266. data/app/packs/stylesheets/decidim/_datepicker.scss +0 -4
  267. data/app/packs/stylesheets/decidim/_dropdown.scss +56 -19
  268. data/app/packs/stylesheets/decidim/_forms.scss +6 -6
  269. data/app/packs/stylesheets/decidim/_header.scss +17 -1
  270. data/app/packs/stylesheets/decidim/_labels.scss +1 -1
  271. data/app/packs/stylesheets/decidim/_layout.scss +12 -2
  272. data/app/packs/stylesheets/decidim/{_endorsers_list.scss → _likes_list.scss} +1 -1
  273. data/app/packs/stylesheets/decidim/_modal.scss +5 -1
  274. data/app/packs/stylesheets/decidim/_modal_share.scss +83 -9
  275. data/app/packs/stylesheets/decidim/_modal_update.scss +1 -5
  276. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +1 -1
  277. data/app/packs/stylesheets/decidim/_rich_text.scss +13 -0
  278. data/app/packs/stylesheets/decidim/_statistics.scss +35 -3
  279. data/app/packs/stylesheets/decidim/_tooltip.scss +1 -1
  280. data/app/packs/stylesheets/decidim/_typography.scss +6 -0
  281. data/app/packs/stylesheets/decidim/_wizard_steps.scss +1 -1
  282. data/app/packs/stylesheets/decidim/application.scss +76 -76
  283. data/app/packs/stylesheets/decidim/editor.scss +11 -12
  284. data/app/packs/stylesheets/decidim/legacy/email.scss +6 -5
  285. data/app/packs/stylesheets/decidim/map.scss +5 -3
  286. data/app/packs/stylesheets/decidim/qr.scss +65 -0
  287. data/app/permissions/decidim/default_permissions.rb +16 -0
  288. data/app/permissions/decidim/permissions.rb +5 -26
  289. data/app/presenters/decidim/admin_log/base_user_presenter.rb +2 -2
  290. data/app/presenters/decidim/admin_log/organization_presenter.rb +0 -15
  291. data/app/presenters/decidim/home_stats_presenter.rb +4 -54
  292. data/app/presenters/decidim/log/base_presenter.rb +1 -1
  293. data/app/presenters/decidim/menu_item_presenter.rb +10 -3
  294. data/app/presenters/decidim/official_author_presenter.rb +0 -4
  295. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +0 -4
  296. data/app/presenters/decidim/resource_locator_presenter.rb +15 -4
  297. data/app/presenters/decidim/resource_presenter.rb +8 -8
  298. data/app/presenters/decidim/stats_presenter.rb +39 -60
  299. data/app/presenters/decidim/taxonomy_presenter.rb +5 -1
  300. data/app/presenters/decidim/user_presenter.rb +0 -6
  301. data/app/queries/decidim/authorized_users.rb +26 -0
  302. data/app/queries/decidim/inactive_users_query.rb +31 -0
  303. data/app/queries/decidim/public_activities.rb +2 -2
  304. data/app/queries/decidim/stats_followers_count.rb +43 -0
  305. data/app/queries/decidim/stats_participants_count.rb +102 -0
  306. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +1 -5
  307. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +0 -1
  308. data/app/services/decidim/action_logger.rb +2 -1
  309. data/app/services/decidim/base_diff_renderer.rb +0 -17
  310. data/app/services/decidim/onboarding_manager.rb +4 -0
  311. data/app/services/decidim/open_data_exporter.rb +19 -11
  312. data/app/services/decidim/send_push_notification.rb +4 -3
  313. data/app/services/decidim/traceability.rb +1 -1
  314. data/app/validators/etiquette_validator.rb +7 -0
  315. data/app/validators/translated_etiquette_validator.rb +1 -0
  316. data/app/views/decidim/account/_old_password_field.html.erb +1 -1
  317. data/app/views/decidim/account/_password_fields.html.erb +1 -1
  318. data/app/views/decidim/account/delete.html.erb +1 -1
  319. data/app/views/decidim/account/show.html.erb +3 -3
  320. data/app/views/decidim/amendments/edit_draft.html.erb +0 -4
  321. data/app/views/decidim/amendments/new.html.erb +0 -4
  322. data/app/views/decidim/amendments/preview_draft.html.erb +1 -1
  323. data/app/views/decidim/application/_accordion_section.html.erb +1 -1
  324. data/app/views/decidim/application/_collection.html.erb +1 -1
  325. data/app/views/decidim/application/_radio_accordion.html.erb +30 -0
  326. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +1 -1
  327. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +1 -1
  328. data/app/views/decidim/devise/registrations/new.html.erb +1 -1
  329. data/app/views/decidim/devise/shared/_links.html.erb +1 -1
  330. data/app/views/decidim/doorkeeper/authorizations/new.html.erb +39 -8
  331. data/app/views/decidim/errors/internal_server_error.html.erb +1 -0
  332. data/app/views/decidim/likes/update_buttons_and_counters.js.erb +21 -0
  333. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +2 -2
  334. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +1 -1
  335. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  336. data/app/views/decidim/messaging/conversations/create.js.erb +0 -1
  337. data/app/views/decidim/messaging/conversations/new.html.erb +1 -1
  338. data/app/views/decidim/messaging/conversations/show.html.erb +1 -1
  339. data/app/views/decidim/notifications_settings/show.html.erb +3 -3
  340. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  341. data/app/views/decidim/pages/index.html.erb +1 -1
  342. data/app/views/decidim/participants_account_mailer/inactivity_notification.html.erb +13 -0
  343. data/app/views/decidim/participants_account_mailer/removal_notification.html.erb +11 -0
  344. data/app/views/decidim/profiles/show.html.erb +1 -1
  345. data/app/views/decidim/qr/show.html.erb +28 -0
  346. data/app/views/decidim/searches/_filters.html.erb +18 -2
  347. data/app/views/decidim/searches/index.html.erb +5 -2
  348. data/app/views/decidim/shared/_confirm_modal.html.erb +5 -3
  349. data/app/views/decidim/shared/_filters.html.erb +2 -2
  350. data/app/views/decidim/shared/_orders.html.erb +1 -1
  351. data/app/views/decidim/shared/_resource_actions.html.erb +8 -5
  352. data/app/views/decidim/user_activities/index.html.erb +1 -1
  353. data/app/views/decidim/user_group_mailer/notify_deprecation_to_member.html.erb +18 -0
  354. data/app/views/decidim/user_group_mailer/notify_deprecation_to_owner.html.erb +19 -0
  355. data/app/views/decidim/user_group_mailer/notify_user_group_patched.html.erb +21 -0
  356. data/app/views/layouts/decidim/_head.html.erb +15 -12
  357. data/app/views/layouts/decidim/_impersonation_warning.html.erb +1 -1
  358. data/app/views/layouts/decidim/_js_configuration.html.erb +17 -19
  359. data/app/views/layouts/decidim/_meta_tags_context.html.erb +3 -0
  360. data/app/views/layouts/decidim/_offline_banner.html.erb +1 -1
  361. data/app/views/layouts/decidim/_wrapper.html.erb +8 -6
  362. data/app/views/layouts/decidim/footer/_focus_mode_main.html.erb +7 -0
  363. data/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +1 -1
  364. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +12 -2
  365. data/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +24 -0
  366. data/app/views/layouts/decidim/header/_main.html.erb +28 -22
  367. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +1 -1
  368. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +18 -18
  369. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +1 -1
  370. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +1 -1
  371. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +1 -1
  372. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +1 -1
  373. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +1 -1
  374. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +1 -1
  375. data/app/views/layouts/decidim/mailer.html.erb +2 -2
  376. data/app/views/layouts/decidim/newsletter_base.html.erb +2 -2
  377. data/app/views/layouts/decidim/shared/_layout_two_col.html.erb +3 -1
  378. data/app/views/layouts/decidim/shared/_layout_user_profile.html.erb +7 -3
  379. data/config/assets.rb +3 -3
  380. data/config/initializers/devise.rb +8 -0
  381. data/config/initializers/omniauth.rb +1 -1
  382. data/config/locales/ar.yml +0 -209
  383. data/config/locales/bg.yml +0 -238
  384. data/config/locales/bs-BA.yml +0 -30
  385. data/config/locales/ca-IT.yml +122 -286
  386. data/config/locales/ca.yml +122 -286
  387. data/config/locales/cs.yml +84 -284
  388. data/config/locales/de.yml +102 -285
  389. data/config/locales/el.yml +0 -224
  390. data/config/locales/en.yml +122 -286
  391. data/config/locales/eo.yml +0 -2
  392. data/config/locales/es-MX.yml +122 -286
  393. data/config/locales/es-PY.yml +122 -286
  394. data/config/locales/es.yml +122 -286
  395. data/config/locales/eu.yml +114 -287
  396. data/config/locales/fi-plain.yml +112 -286
  397. data/config/locales/fi.yml +112 -286
  398. data/config/locales/fr-CA.yml +85 -275
  399. data/config/locales/fr.yml +85 -275
  400. data/config/locales/ga-IE.yml +0 -28
  401. data/config/locales/gl.yml +0 -140
  402. data/config/locales/hu.yml +0 -237
  403. data/config/locales/id-ID.yml +0 -136
  404. data/config/locales/is-IS.yml +0 -14
  405. data/config/locales/it.yml +1 -234
  406. data/config/locales/ja.yml +97 -282
  407. data/config/locales/lb.yml +0 -189
  408. data/config/locales/lt.yml +0 -240
  409. data/config/locales/lv.yml +0 -186
  410. data/config/locales/nl.yml +0 -189
  411. data/config/locales/no.yml +0 -189
  412. data/config/locales/pl.yml +0 -244
  413. data/config/locales/pt-BR.yml +0 -213
  414. data/config/locales/pt.yml +0 -189
  415. data/config/locales/ro-RO.yml +54 -218
  416. data/config/locales/ru.yml +0 -62
  417. data/config/locales/sk.yml +0 -164
  418. data/config/locales/sr-CS.yml +0 -31
  419. data/config/locales/sv.yml +80 -263
  420. data/config/locales/tr-TR.yml +0 -189
  421. data/config/locales/uk.yml +0 -23
  422. data/config/locales/zh-CN.yml +0 -180
  423. data/config/locales/zh-TW.yml +0 -229
  424. data/config/routes.rb +3 -36
  425. data/db/migrate/20250217192438_convert_user_groups_into_users.rb +56 -0
  426. data/db/migrate/20250221085317_add_user_type_to_action_logs.rb +12 -0
  427. data/db/migrate/20250221090905_create_decidim_api_jwt_denylist.rb +11 -0
  428. data/db/migrate/20250221091348_add_api_key_to_decidim_api_user.rb +7 -0
  429. data/db/migrate/20250327143657_remove_metrics_content_blocks.rb +9 -0
  430. data/db/migrate/20250401153444_enable_pkce.rb +8 -0
  431. data/db/migrate/20250416130426_rename_doorkeeper_scopes.rb +25 -0
  432. data/db/migrate/20250515105231_rename_endorsements_to_likes.rb +62 -0
  433. data/db/migrate/20250523104311_move_cta_to_hero_content_block.rb +34 -0
  434. data/db/migrate/20250527122040_move_highlighted_content_banner_settings_to_content_block.rb +69 -0
  435. data/db/migrate/20250603103953_add_refresh_tokens_enabled_to_doorkeeper_applications.rb +7 -0
  436. data/db/migrate/20250609073104_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb +10 -0
  437. data/db/migrate/20250613122148_remove_hashtag_table_from_core.rb +7 -0
  438. data/decidim-core.gemspec +4 -4
  439. data/{app/helpers → lib}/decidim/action_authorization_helper.rb +5 -4
  440. data/lib/decidim/amendable.rb +4 -4
  441. data/lib/decidim/api/functions/user_entity_finder.rb +1 -1
  442. data/lib/decidim/api/input_filters/component_input_filter.rb +3 -3
  443. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +0 -21
  444. data/lib/decidim/api/input_sorts/has_likeable_input_sort.rb +15 -0
  445. data/lib/decidim/api/interfaces/attachable_collection_interface.rb +13 -0
  446. data/lib/decidim/api/interfaces/author_interface.rb +1 -2
  447. data/lib/decidim/api/interfaces/authorable_interface.rb +2 -2
  448. data/lib/decidim/api/interfaces/coauthorable_interface.rb +1 -1
  449. data/lib/decidim/api/interfaces/component_interface.rb +6 -0
  450. data/lib/decidim/api/interfaces/followable_interface.rb +13 -0
  451. data/lib/decidim/api/interfaces/likeable_interface.rb +19 -0
  452. data/lib/decidim/api/interfaces/localizable_interface.rb +18 -0
  453. data/lib/decidim/api/interfaces/participatory_space_interface.rb +6 -8
  454. data/lib/decidim/api/interfaces/referable_interface.rb +13 -0
  455. data/lib/decidim/api/interfaces/timestamps_interface.rb +0 -1
  456. data/lib/decidim/api/interfaces/traceable_interface.rb +1 -1
  457. data/lib/decidim/api/types/attachment_collection_type.rb +14 -0
  458. data/lib/decidim/api/types/organization_type.rb +3 -1
  459. data/lib/decidim/api/types/session_type.rb +0 -5
  460. data/lib/decidim/api/types/statistic_type.rb +29 -3
  461. data/lib/decidim/api/types/trace_version_type.rb +1 -1
  462. data/lib/decidim/api/types/user_type.rb +1 -2
  463. data/lib/decidim/api_response_helper.rb +12 -0
  464. data/lib/decidim/asset_router/storage.rb +2 -4
  465. data/lib/decidim/assets/tailwind/instance.rb +1 -1
  466. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +4 -3
  467. data/lib/decidim/attribute_encryptor.rb +1 -1
  468. data/lib/decidim/attributes/time_with_zone.rb +1 -1
  469. data/lib/decidim/authorable.rb +5 -34
  470. data/lib/decidim/coauthorable.rb +13 -31
  471. data/lib/decidim/content_parsers/blob_parser.rb +1 -1
  472. data/lib/decidim/content_parsers/mention_resource_parser.rb +23 -0
  473. data/lib/decidim/content_parsers/tag_parser.rb +2 -2
  474. data/lib/decidim/content_parsers/user_parser.rb +2 -2
  475. data/lib/decidim/content_parsers.rb +14 -2
  476. data/lib/decidim/content_processor.rb +1 -1
  477. data/lib/decidim/content_renderers/mention_resource_renderer.rb +77 -0
  478. data/lib/decidim/content_renderers.rb +1 -2
  479. data/lib/decidim/core/api.rb +7 -8
  480. data/lib/decidim/core/content_blocks/registry_manager.rb +19 -5
  481. data/lib/decidim/core/engine.rb +72 -104
  482. data/lib/decidim/core/menu.rb +0 -7
  483. data/lib/decidim/core/seeds.rb +11 -39
  484. data/lib/decidim/core/test/factories.rb +22 -121
  485. data/lib/decidim/core/test/shared_examples/authorable.rb +0 -17
  486. data/lib/decidim/core/test/shared_examples/coauthorable.rb +5 -48
  487. data/lib/decidim/core/test/shared_examples/comments_examples.rb +7 -56
  488. data/lib/decidim/core/test/shared_examples/likeable.rb +22 -0
  489. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +16 -3
  490. data/lib/decidim/core/test/shared_examples/map_examples.rb +1 -1
  491. data/lib/decidim/core/test/shared_examples/oauth_application_examples.rb +137 -0
  492. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +0 -18
  493. data/lib/decidim/core/test/shared_examples/permissions.rb +0 -46
  494. data/lib/decidim/core/test/shared_examples/reports_examples.rb +2 -2
  495. data/lib/decidim/core/test/shared_examples/{resource_endorsed_event_examples.rb → resource_liked_event_examples.rb} +7 -7
  496. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +0 -14
  497. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +8 -34
  498. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +79 -0
  499. data/lib/decidim/core/test/shared_examples/system_like_resource_examples.rb +192 -0
  500. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +2 -2
  501. data/lib/decidim/core/test/shared_examples/{with_endorsable_permissions_examples.rb → with_likeable_permissions_examples.rb} +22 -22
  502. data/lib/decidim/core/test.rb +6 -9
  503. data/lib/decidim/core/version.rb +1 -1
  504. data/lib/decidim/core.rb +237 -88
  505. data/lib/decidim/deprecations.rb +1 -1
  506. data/lib/decidim/download_your_data_serializers.rb +6 -3
  507. data/lib/decidim/env.rb +3 -1
  508. data/lib/decidim/events.rb +0 -1
  509. data/lib/decidim/form_builder.rb +26 -43
  510. data/lib/decidim/gamification/badge_scorer.rb +0 -2
  511. data/lib/decidim/gamification.rb +1 -1
  512. data/lib/decidim/has_conversations.rb +0 -44
  513. data/lib/decidim/has_workflows.rb +42 -0
  514. data/lib/decidim/icon_registry.rb +4 -4
  515. data/lib/decidim/legacy_form_builder.rb +17 -2
  516. data/lib/decidim/likeable.rb +24 -0
  517. data/lib/decidim/manifest_registry.rb +1 -1
  518. data/lib/decidim/map/provider/dynamic_map/here.rb +0 -19
  519. data/lib/decidim/map/provider/static_map/here.rb +2 -10
  520. data/lib/decidim/menu.rb +1 -1
  521. data/lib/decidim/moderation_tools.rb +1 -1
  522. data/lib/decidim/mutation_registry.rb +17 -0
  523. data/lib/decidim/newsletter_encryptor.rb +1 -1
  524. data/lib/decidim/oauth/token_generator.rb +35 -0
  525. data/lib/decidim/oauth.rb +7 -0
  526. data/lib/decidim/organization_settings.rb +2 -10
  527. data/lib/decidim/paddable.rb +1 -1
  528. data/lib/decidim/participatory_space_resourceable.rb +2 -2
  529. data/lib/decidim/participatory_space_user.rb +1 -1
  530. data/lib/decidim/pdf_signature_example.rb +108 -0
  531. data/lib/decidim/query.rb +1 -1
  532. data/lib/decidim/query_extensions.rb +0 -33
  533. data/lib/decidim/reportable.rb +1 -1
  534. data/lib/decidim/searchable.rb +4 -2
  535. data/lib/decidim/seeds.rb +8 -0
  536. data/lib/decidim/settings_manifest.rb +3 -2
  537. data/lib/decidim/{webpacker → shakapacker}/configuration.rb +4 -4
  538. data/lib/decidim/{webpacker → shakapacker}/runner.rb +3 -3
  539. data/lib/decidim/shakapacker/shakapacker.rb +8 -0
  540. data/lib/decidim/{webpacker → shakapacker}/shakapacker.yml +3 -1
  541. data/lib/decidim/{webpacker → shakapacker}/webpack/custom.js +1 -1
  542. data/lib/decidim/shakapacker.rb +34 -0
  543. data/lib/decidim/social_share_service_manifest.rb +7 -12
  544. data/lib/decidim/stats_registry.rb +15 -3
  545. data/{app/helpers → lib}/decidim/tooltip_helper.rb +3 -3
  546. data/lib/decidim/url_option_resolver.rb +1 -1
  547. data/lib/decidim/view_model.rb +0 -3
  548. data/lib/decidim/webpacker.rb +11 -20
  549. data/lib/decidim/workflow_registry.rb +61 -0
  550. data/lib/tasks/decidim_participants_tasks.rake +22 -0
  551. data/lib/tasks/{decidim_webpacker_tasks.rake → decidim_shakapacker_tasks.rake} +35 -33
  552. data/lib/tasks/decidim_tasks.rake +4 -1
  553. data/lib/tasks/decidim_taxonomies.rake +0 -34
  554. data/lib/tasks/upgrade/clean.rake +1 -1
  555. data/lib/tasks/upgrade/decidim_action_log_valuation_assignment.rake +13 -0
  556. data/lib/tasks/upgrade/decidim_change_valuator_tasks.rake +12 -0
  557. data/lib/tasks/upgrade/{decidim_deduplicate_endorsements.rake → decidim_deduplicate_likes.rake} +10 -10
  558. data/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake +2 -2
  559. data/lib/tasks/upgrade/decidim_paper_trail_valuation_assignment.rake +13 -0
  560. data/lib/tasks/upgrade/user_groups_migration.rake +188 -0
  561. metadata +204 -255
  562. data/app/cells/decidim/author/endorsements.erb +0 -4
  563. data/app/cells/decidim/author/profile_minicard.erb +0 -30
  564. data/app/cells/decidim/content_blocks/organization_metrics_cell.rb +0 -21
  565. data/app/cells/decidim/content_blocks/participatory_space_metrics/content.erb +0 -18
  566. data/app/cells/decidim/content_blocks/participatory_space_metrics_cell.rb +0 -43
  567. data/app/cells/decidim/endorsement_block/show.erb +0 -3
  568. data/app/cells/decidim/endorsement_buttons/button_content.erb +0 -2
  569. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +0 -7
  570. data/app/cells/decidim/endorsement_buttons/show.erb +0 -17
  571. data/app/cells/decidim/endorsement_buttons_cell.rb +0 -87
  572. data/app/cells/decidim/endorsers_list/empty.erb +0 -3
  573. data/app/cells/decidim/endorsers_list/show.erb +0 -20
  574. data/app/cells/decidim/endorsers_list_cell.rb +0 -64
  575. data/app/cells/decidim/group_admins/show.erb +0 -34
  576. data/app/cells/decidim/group_admins_cell.rb +0 -8
  577. data/app/cells/decidim/group_members/show.erb +0 -46
  578. data/app/cells/decidim/group_members_cell.rb +0 -8
  579. data/app/cells/decidim/groups/show.erb +0 -14
  580. data/app/cells/decidim/groups_cell.rb +0 -22
  581. data/app/cells/decidim/members/show.erb +0 -12
  582. data/app/cells/decidim/members_cell.rb +0 -34
  583. data/app/cells/decidim/profile_actions/dropdown_actions.erb +0 -21
  584. data/app/cells/decidim/represent_user_group/show.erb +0 -11
  585. data/app/cells/decidim/represent_user_group_cell.rb +0 -46
  586. data/app/cells/decidim/user_conversation/conversation_header.erb +0 -14
  587. data/app/cells/decidim/user_conversation/messages.erb +0 -1
  588. data/app/cells/decidim/user_conversation/new.erb +0 -6
  589. data/app/cells/decidim/user_conversation/reply.erb +0 -9
  590. data/app/cells/decidim/user_conversation/show.erb +0 -19
  591. data/app/cells/decidim/user_conversation/start.erb +0 -12
  592. data/app/cells/decidim/user_conversation_cell.rb +0 -62
  593. data/app/cells/decidim/user_conversations/new_conversation_button.erb +0 -20
  594. data/app/cells/decidim/user_conversations/show.erb +0 -13
  595. data/app/cells/decidim/user_conversations_cell.rb +0 -28
  596. data/app/cells/decidim/user_group_pending_invitations_list/show.erb +0 -28
  597. data/app/cells/decidim/user_group_pending_invitations_list_cell.rb +0 -26
  598. data/app/cells/decidim/user_group_pending_requests_list/show.erb +0 -27
  599. data/app/cells/decidim/user_group_pending_requests_list_cell.rb +0 -26
  600. data/app/commands/decidim/accept_group_invitation.rb +0 -43
  601. data/app/commands/decidim/accept_user_group_join_request.rb +0 -53
  602. data/app/commands/decidim/create_user_group.rb +0 -73
  603. data/app/commands/decidim/demote_membership.rb +0 -57
  604. data/app/commands/decidim/endorse_resource.rb +0 -66
  605. data/app/commands/decidim/invite_user_to_group.rb +0 -63
  606. data/app/commands/decidim/join_user_group.rb +0 -57
  607. data/app/commands/decidim/leave_user_group.rb +0 -47
  608. data/app/commands/decidim/promote_membership.rb +0 -55
  609. data/app/commands/decidim/reject_group_invitation.rb +0 -42
  610. data/app/commands/decidim/reject_user_group_join_request.rb +0 -53
  611. data/app/commands/decidim/remove_user_from_group.rb +0 -53
  612. data/app/commands/decidim/unendorse_resource.rb +0 -39
  613. data/app/commands/decidim/update_user_group.rb +0 -72
  614. data/app/controllers/concerns/decidim/user_groups.rb +0 -23
  615. data/app/controllers/decidim/endorsements_controller.rb +0 -71
  616. data/app/controllers/decidim/group_email_confirmations_controller.rb +0 -32
  617. data/app/controllers/decidim/group_invites_controller.rb +0 -104
  618. data/app/controllers/decidim/group_members_controller.rb +0 -75
  619. data/app/controllers/decidim/groups_controller.rb +0 -99
  620. data/app/controllers/decidim/own_user_groups_controller.rb +0 -15
  621. data/app/controllers/decidim/user_conversations_controller.rb +0 -133
  622. data/app/controllers/decidim/user_group_join_requests_controller.rb +0 -72
  623. data/app/events/decidim/demoted_membership_event.rb +0 -28
  624. data/app/events/decidim/invited_to_group_event.rb +0 -62
  625. data/app/events/decidim/join_request_accepted_event.rb +0 -28
  626. data/app/events/decidim/join_request_created_event.rb +0 -28
  627. data/app/events/decidim/join_request_rejected_event.rb +0 -28
  628. data/app/events/decidim/promoted_to_admin_event.rb +0 -28
  629. data/app/events/decidim/removed_from_group_event.rb +0 -28
  630. data/app/events/decidim/resource_endorsed_event.rb +0 -36
  631. data/app/events/decidim/user_group_admin_event.rb +0 -37
  632. data/app/events/decidim/user_group_created_event.rb +0 -6
  633. data/app/events/decidim/user_group_updated_event.rb +0 -6
  634. data/app/forms/decidim/invite_user_to_group_form.rb +0 -29
  635. data/app/forms/decidim/user_group_form.rb +0 -87
  636. data/app/helpers/decidim/cta_button_helper.rb +0 -31
  637. data/app/helpers/decidim/endorsable_helper.rb +0 -84
  638. data/app/helpers/decidim/twitter_search_helper.rb +0 -14
  639. data/app/helpers/decidim/user_group_helper.rb +0 -22
  640. data/app/jobs/decidim/metric_job.rb +0 -15
  641. data/app/models/decidim/metric.rb +0 -25
  642. data/app/models/decidim/user_group.rb +0 -217
  643. data/app/models/decidim/user_group_membership.rb +0 -17
  644. data/app/packs/entrypoints/decidim_widget.js +0 -1
  645. data/app/packs/src/decidim/abide_form_validator_fixer.js +0 -44
  646. data/app/packs/src/decidim/account_form.js +0 -96
  647. data/app/packs/src/decidim/append_elements.js +0 -6
  648. data/app/packs/src/decidim/back_to_list.js +0 -26
  649. data/app/packs/src/decidim/change_report_form_behavior.js +0 -45
  650. data/app/packs/src/decidim/clipboard.js +0 -128
  651. data/app/packs/src/decidim/editor/extensions/hashtag/index.js +0 -66
  652. data/app/packs/src/decidim/editor/extensions/heading/index.js +0 -33
  653. data/app/packs/src/decidim/editor/test/extensions/hashtag.test.js +0 -105
  654. data/app/packs/src/decidim/form_filter.component_for_testing.js +0 -7
  655. data/app/packs/src/decidim/form_validator.js +0 -56
  656. data/app/packs/src/decidim/gallery.js +0 -5
  657. data/app/packs/src/decidim/impersonation.js +0 -23
  658. data/app/packs/src/decidim/input_autojump.js +0 -38
  659. data/app/packs/src/decidim/input_hashtags.js +0 -91
  660. data/app/packs/src/decidim/input_mentions.js +0 -143
  661. data/app/packs/src/decidim/input_multiple_mentions.js +0 -115
  662. data/app/packs/src/decidim/input_tags.js +0 -16
  663. data/app/packs/src/decidim/notifications_actions.js +0 -40
  664. data/app/packs/src/decidim/password_toggler.js +0 -104
  665. data/app/packs/src/decidim/remote_tooltips.js +0 -38
  666. data/app/packs/src/decidim/responsive_horizontal_tabs.js +0 -12
  667. data/app/packs/src/decidim/scroll_to_last_child.js +0 -14
  668. data/app/packs/src/decidim/slug_form.js +0 -9
  669. data/app/packs/src/decidim/sticky_footer.js +0 -48
  670. data/app/packs/src/decidim/sticky_header.js +0 -62
  671. data/app/packs/src/decidim/toggle.js +0 -37
  672. data/app/packs/src/decidim/tooltips.js +0 -152
  673. data/app/packs/src/decidim/user_registrations.js +0 -65
  674. data/app/packs/src/decidim/vizzs/areachart.js +0 -251
  675. data/app/packs/src/decidim/vizzs/index.js +0 -82
  676. data/app/packs/src/decidim/widget.js +0 -14
  677. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  678. data/app/packs/stylesheets/decidim/_metrics.scss +0 -70
  679. data/app/packs/stylesheets/decidim/_modal_identities.scss +0 -23
  680. data/app/presenters/decidim/admin_log/user_group_presenter.rb +0 -31
  681. data/app/presenters/decidim/hashtag_presenter.rb +0 -37
  682. data/app/presenters/decidim/metric_charts_presenter.rb +0 -92
  683. data/app/presenters/decidim/metric_object_presenter.rb +0 -32
  684. data/app/presenters/decidim/user_group_presenter.rb +0 -38
  685. data/app/queries/decidim/metric_manage.rb +0 -81
  686. data/app/queries/decidim/metric_measure.rb +0 -36
  687. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +0 -26
  688. data/app/queries/decidim/metrics/followers_metric_manage.rb +0 -65
  689. data/app/queries/decidim/metrics/participants_metric_manage.rb +0 -79
  690. data/app/queries/decidim/metrics/reported_users_metric_manage.rb +0 -26
  691. data/app/queries/decidim/metrics/user_reports_metric_manage.rb +0 -26
  692. data/app/queries/decidim/metrics/users_metric_manage.rb +0 -26
  693. data/app/queries/decidim/user_groups/accepted_memberships.rb +0 -36
  694. data/app/queries/decidim/user_groups/accepted_user_groups.rb +0 -38
  695. data/app/queries/decidim/user_groups/accepted_users.rb +0 -36
  696. data/app/queries/decidim/user_groups/admin_memberships.rb +0 -37
  697. data/app/queries/decidim/user_groups/invited_memberships.rb +0 -36
  698. data/app/queries/decidim/user_groups/manageable_user_groups.rb +0 -39
  699. data/app/queries/decidim/user_groups/member_memberships.rb +0 -37
  700. data/app/resolvers/decidim/core/metric_resolver.rb +0 -71
  701. data/app/resolvers/decidim/hashtags_resolver.rb +0 -15
  702. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +0 -22
  703. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +0 -38
  704. data/app/views/decidim/endorsements/_identity.html.erb +0 -4
  705. data/app/views/decidim/endorsements/identities.html.erb +0 -18
  706. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +0 -25
  707. data/app/views/decidim/group_invites/index.html.erb +0 -26
  708. data/app/views/decidim/groups/_form.html.erb +0 -17
  709. data/app/views/decidim/groups/edit.html.erb +0 -19
  710. data/app/views/decidim/groups/new.html.erb +0 -23
  711. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_conversation.html.erb +0 -17
  712. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_message.html.erb +0 -17
  713. data/app/views/decidim/messaging/conversation_mailer/new_group_conversation.html.erb +0 -17
  714. data/app/views/decidim/messaging/conversation_mailer/new_group_message.html.erb +0 -17
  715. data/app/views/decidim/own_user_groups/index.html.erb +0 -10
  716. data/app/views/decidim/shared/_extended_navigation_bar.html.erb +0 -50
  717. data/app/views/decidim/user_conversations/index.html.erb +0 -4
  718. data/app/views/decidim/user_conversations/show.html.erb +0 -4
  719. data/app/views/decidim/user_conversations/update.js.erb +0 -8
  720. data/config/initializers/new_framework_defaults_7_0.rb +0 -145
  721. data/lib/decidim/api/input_filters/has_hastaggable_input_filter.rb +0 -15
  722. data/lib/decidim/api/input_sorts/has_endorsable_input_sort.rb +0 -15
  723. data/lib/decidim/api/interfaces/endorsable_interface.rb +0 -19
  724. data/lib/decidim/api/types/hashtag_type.rb +0 -13
  725. data/lib/decidim/api/types/metric_history_type.rb +0 -20
  726. data/lib/decidim/api/types/metric_type.rb +0 -13
  727. data/lib/decidim/api/types/user_group_type.rb +0 -55
  728. data/lib/decidim/content_parsers/hashtag_parser.rb +0 -66
  729. data/lib/decidim/content_parsers/user_group_parser.rb +0 -33
  730. data/lib/decidim/content_renderers/hashtag_renderer.rb +0 -78
  731. data/lib/decidim/content_renderers/user_group_renderer.rb +0 -31
  732. data/lib/decidim/core/test/shared_examples/amendable_interface_examples.rb +0 -14
  733. data/lib/decidim/core/test/shared_examples/amendable_proposals_interface_examples.rb +0 -50
  734. data/lib/decidim/core/test/shared_examples/assembly_announcements_examples.rb +0 -38
  735. data/lib/decidim/core/test/shared_examples/attachable_interface_examples.rb +0 -16
  736. data/lib/decidim/core/test/shared_examples/authorable_interface_examples.rb +0 -59
  737. data/lib/decidim/core/test/shared_examples/categories_container_examples.rb +0 -22
  738. data/lib/decidim/core/test/shared_examples/categorizable_interface_examples.rb +0 -27
  739. data/lib/decidim/core/test/shared_examples/coauthorable_interface_examples.rb +0 -91
  740. data/lib/decidim/core/test/shared_examples/endorsable.rb +0 -69
  741. data/lib/decidim/core/test/shared_examples/endorsable_interface_examples.rb +0 -22
  742. data/lib/decidim/core/test/shared_examples/fingerprintable_interface_examples.rb +0 -17
  743. data/lib/decidim/core/test/shared_examples/input_filter_examples.rb +0 -118
  744. data/lib/decidim/core/test/shared_examples/input_sort_examples.rb +0 -126
  745. data/lib/decidim/core/test/shared_examples/metric_manage_shared_context.rb +0 -9
  746. data/lib/decidim/core/test/shared_examples/participatory_space_resourcable_interface_examples.rb +0 -43
  747. data/lib/decidim/core/test/shared_examples/process_announcements_examples.rb +0 -37
  748. data/lib/decidim/core/test/shared_examples/scopable_interface_examples.rb +0 -19
  749. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +0 -298
  750. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +0 -20
  751. data/lib/decidim/core/test/shared_examples/timestamps_interface_examples.rb +0 -21
  752. data/lib/decidim/core/test/shared_examples/traceable_interface_examples.rb +0 -47
  753. data/lib/decidim/download_your_data_serializers/download_your_data_user_group_serializer.rb +0 -21
  754. data/lib/decidim/endorsable.rb +0 -29
  755. data/lib/decidim/events/user_group_event.rb +0 -43
  756. data/lib/decidim/hashtag.rb +0 -13
  757. data/lib/decidim/metric_manifest.rb +0 -35
  758. data/lib/decidim/metric_operation.rb +0 -58
  759. data/lib/decidim/metric_operation_manifest.rb +0 -21
  760. data/lib/decidim/metric_registry.rb +0 -109
  761. data/lib/gem_overrides/shakapacker/runner.rb +0 -9
  762. data/lib/tasks/decidim_metrics_tasks.rake +0 -89
  763. /data/app/cells/decidim/{endorsement_buttons/disabled_endorsements.erb → like_buttons/disabled_likes.erb} +0 -0
  764. /data/app/packs/src/decidim/{configuration.js → refactor/implementation/configuration.js} +0 -0
  765. /data/app/packs/src/decidim/{external_domain_warning.js → refactor/implementation/external_domain_warning.js} +0 -0
  766. /data/app/packs/src/decidim/{autocomplete.js → refactor/moved/autocomplete.js} +0 -0
  767. /data/app/packs/src/decidim/{delayed.js → refactor/moved/delayed.js} +0 -0
  768. /data/app/packs/src/decidim/{focus_guard.js → refactor/moved/focus_guard.js} +0 -0
  769. /data/app/packs/src/decidim/{history.js → refactor/moved/history.js} +0 -0
  770. /data/app/packs/src/decidim/{i18n.js → refactor/moved/i18n.js} +0 -0
  771. /data/lib/decidim/core/test/shared_examples/{endorsements_controller_shared_context.rb → likes_controller_shared_context.rb} +0 -0
  772. /data/{app/helpers → lib}/decidim/resource_helper.rb +0 -0
  773. /data/lib/decidim/{webpacker → shakapacker}/esbuild.config.js +0 -0
  774. /data/lib/decidim/{webpacker → shakapacker}/postcss.config.js +0 -0
  775. /data/lib/decidim/{webpacker → shakapacker}/tsconfig.json +0 -0
  776. /data/lib/decidim/{webpacker → shakapacker}/webpack/.modernizrrc +0 -0
  777. /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
@@ -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,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class UserGroupMailer < ApplicationMailer
5
+ # This is a mailer that aids migration from the old user_groups to the new user group system
6
+ # This should be used only in the scope of the migration process
7
+ # @deprecated This mailer will be removed in decidim v0.32.0
8
+ def notify_deprecation_to_owner(group)
9
+ with_user(group) do
10
+ @group_name = group.name
11
+ @group_email = group.email
12
+ @organization = group.organization
13
+
14
+ subject = I18n.t("notify_deprecation_to_owner.subject", scope: "decidim.user_group_mailer")
15
+ mail(to: group.email, subject:)
16
+ end
17
+ end
18
+
19
+ # This is a mailer that aids migration from the old user_groups to the new user group system
20
+ # This should be used only in the scope of the migration process
21
+ # @deprecated This mailer will be removed in decidim v0.32.0
22
+ def notify_deprecation_to_member(user, group_name, group_email)
23
+ with_user(user) do
24
+ @user = user
25
+ @group_name = group_name
26
+ @group_email = group_email
27
+ @organization = user.organization
28
+
29
+ subject = I18n.t("notify_deprecation_to_member.subject", scope: "decidim.user_group_mailer")
30
+ mail(to: user.email, subject:)
31
+ end
32
+ end
33
+
34
+ # This is a mailer that aids migration from the old user_groups to the new user group system
35
+ # This should be used only in the scope of the migration process
36
+ # @deprecated This mailer will be removed in decidim v0.32.0
37
+ def notify_user_group_patched(group, user, password)
38
+ with_user(user) do
39
+ @group = group
40
+ @user = user
41
+ @password = password
42
+ @organization = user.organization
43
+
44
+ subject = I18n.t("notify_user_group_patched.subject", scope: "decidim.user_group_mailer")
45
+ mail(to: user.email, subject:)
46
+ end
47
+ end
48
+ end
49
+ 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
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Decidim
4
- # A resource can have an endorsement for each user or group the author/endorser belongs to.
5
- class Endorsement < ApplicationRecord
4
+ # A resource can have a like for each user.
5
+ class Like < ApplicationRecord
6
6
  include Decidim::Authorable
7
7
 
8
8
  belongs_to :resource,
9
9
  polymorphic: true,
10
10
  counter_cache: true
11
11
 
12
- validates :resource_id, uniqueness: { scope: [:resource_type, :author, :user_group] }
12
+ validates :resource_id, uniqueness: { scope: [:resource_type, :author] }
13
13
  validate :author_and_resource_same_organization
14
14
 
15
- scope :for_listing, -> { order(:decidim_user_group_id, :created_at) }
15
+ scope :for_listing, -> { order(:decidim_author_type, :decidim_author_id, :created_at) }
16
16
 
17
17
  private
18
18