decidim-core 0.30.1 → 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 (795) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -4
  3. data/app/cells/decidim/activity/show.erb +6 -6
  4. data/app/cells/decidim/activity_cell.rb +0 -3
  5. data/app/cells/decidim/address/show.erb +1 -0
  6. data/app/cells/decidim/address_cell.rb +7 -1
  7. data/app/cells/decidim/amendable/amend_button_card/show.erb +2 -2
  8. data/app/cells/decidim/author/likes.erb +4 -0
  9. data/app/cells/decidim/author/show.erb +1 -3
  10. data/app/cells/decidim/author_cell.rb +5 -28
  11. data/app/cells/decidim/badge_cell.rb +1 -7
  12. data/app/cells/decidim/card_cell.rb +2 -12
  13. data/app/cells/decidim/card_metadata_cell.rb +4 -4
  14. data/app/cells/decidim/coauthorships_cell.rb +1 -1
  15. data/app/cells/decidim/collapsible_authors/show.erb +1 -1
  16. data/app/cells/decidim/content_blocks/hero_cell.rb +23 -4
  17. data/app/cells/decidim/content_blocks/hero_settings_form/show.erb +16 -2
  18. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +6 -6
  19. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +28 -1
  20. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form/show.erb +27 -0
  21. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form_cell.rb +13 -0
  22. data/app/cells/decidim/content_blocks/highlighted_elements_for_component_settings_form/show.erb +9 -2
  23. data/app/cells/decidim/content_blocks/html_settings_form/show.erb +3 -1
  24. data/app/cells/decidim/content_blocks/last_activity_cell.rb +1 -1
  25. data/app/cells/decidim/content_blocks/last_activity_settings_form/show.erb +3 -1
  26. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity_cell.rb +1 -1
  27. data/app/cells/decidim/content_blocks/participatory_space_extra_data/recent_users.erb +1 -1
  28. data/app/cells/decidim/content_blocks/participatory_space_hero/show.erb +0 -5
  29. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +1 -13
  30. data/app/cells/decidim/content_blocks/participatory_space_hero_settings_form/show.erb +10 -3
  31. data/app/cells/decidim/content_blocks/participatory_space_last_activity/content.erb +1 -1
  32. data/app/cells/decidim/content_blocks/participatory_space_last_activity/recent_avatars.erb +1 -1
  33. data/app/cells/decidim/content_blocks/participatory_space_last_activity_cell.rb +3 -3
  34. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +27 -6
  35. data/app/cells/decidim/content_blocks/participatory_space_main_data_cell.rb +4 -0
  36. data/app/cells/decidim/content_blocks/stats/show.erb +2 -3
  37. data/app/cells/decidim/data_consent/modal.erb +1 -1
  38. data/app/cells/decidim/footer_topics/show.erb +2 -2
  39. data/app/cells/decidim/images_panel/show.erb +5 -2
  40. data/app/cells/decidim/like_block/show.erb +3 -0
  41. data/app/cells/decidim/{endorsement_block_cell.rb → like_block_cell.rb} +2 -2
  42. data/app/cells/decidim/like_buttons/button_content.erb +2 -0
  43. data/app/cells/decidim/like_buttons/show.erb +17 -0
  44. data/app/cells/decidim/{endorsement_buttons → like_buttons}/verification_modal.erb +3 -3
  45. data/app/cells/decidim/like_buttons_cell.rb +77 -0
  46. data/app/cells/decidim/likers_list/empty.erb +3 -0
  47. data/app/cells/decidim/{endorsers_list → likers_list}/full.erb +3 -3
  48. data/app/cells/decidim/likers_list/show.erb +20 -0
  49. data/app/cells/decidim/likers_list_cell.rb +64 -0
  50. data/app/cells/decidim/nav_links/show.erb +1 -1
  51. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  52. data/app/cells/decidim/onboarding_action_message_cell.rb +1 -1
  53. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +0 -8
  54. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +0 -8
  55. data/app/cells/decidim/profile/details.erb +1 -1
  56. data/app/cells/decidim/profile/tabs.erb +1 -1
  57. data/app/cells/decidim/profile_actions/show.erb +0 -1
  58. data/app/cells/decidim/profile_actions_cell.rb +5 -91
  59. data/app/cells/decidim/profile_cell.rb +4 -39
  60. data/app/cells/decidim/report_button/content.erb +2 -0
  61. data/app/cells/decidim/report_button/flag_modal.erb +12 -10
  62. data/app/cells/decidim/report_button_cell.rb +1 -1
  63. data/app/cells/decidim/report_user_button/flag_modal.erb +12 -11
  64. data/app/cells/decidim/resource_history_cell.rb +2 -1
  65. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  66. data/app/cells/decidim/share_button_cell.rb +1 -1
  67. data/app/cells/decidim/share_text_widget/modal.erb +16 -0
  68. data/app/cells/decidim/share_text_widget/show.erb +2 -0
  69. data/app/cells/decidim/share_text_widget_cell.rb +27 -0
  70. data/app/cells/decidim/share_widget/modal.erb +19 -8
  71. data/app/cells/decidim/share_widget/qr_code_modal.erb +26 -0
  72. data/app/cells/decidim/share_widget/show.erb +1 -0
  73. data/app/cells/decidim/share_widget_cell.rb +10 -6
  74. data/app/cells/decidim/statistic/show.erb +23 -5
  75. data/app/cells/decidim/statistic_cell.rb +28 -3
  76. data/app/cells/decidim/tab_panels/show.erb +1 -1
  77. data/app/cells/decidim/upload_modal/files.erb +4 -4
  78. data/app/cells/decidim/upload_modal_cell.rb +5 -3
  79. data/app/cells/decidim/user_profile/show.erb +1 -1
  80. data/app/cells/decidim/user_profile_cell.rb +1 -9
  81. data/app/cells/decidim/version_author_cell.rb +0 -7
  82. data/app/commands/decidim/amendable/accept.rb +1 -2
  83. data/app/commands/decidim/amendable/create_draft.rb +2 -3
  84. data/app/commands/decidim/amendable/update_draft.rb +2 -3
  85. data/app/commands/decidim/create_ephemeral_user.rb +7 -1
  86. data/app/commands/decidim/create_omniauth_registration.rb +9 -8
  87. data/app/commands/decidim/create_report.rb +9 -1
  88. data/app/commands/decidim/destroy_account.rb +0 -5
  89. data/app/commands/decidim/like_resource.rb +52 -0
  90. data/app/commands/decidim/messaging/reply_to_conversation.rb +2 -21
  91. data/app/commands/decidim/messaging/start_conversation.rb +2 -21
  92. data/app/commands/decidim/unlike_resource.rb +34 -0
  93. data/app/commands/decidim/update_account.rb +1 -1
  94. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +6 -2
  95. data/app/controllers/concerns/decidim/user_profile.rb +0 -1
  96. data/app/controllers/decidim/account_controller.rb +1 -1
  97. data/app/controllers/decidim/amendments_controller.rb +7 -8
  98. data/app/controllers/decidim/application_controller.rb +2 -1
  99. data/app/controllers/decidim/devise/confirmations_controller.rb +0 -5
  100. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -1
  101. data/app/controllers/decidim/devise/passwords_controller.rb +1 -1
  102. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  103. data/app/controllers/decidim/doorkeeper/authorizations_controller.rb +19 -1
  104. data/app/controllers/decidim/download_your_data_controller.rb +2 -2
  105. data/app/controllers/decidim/likes_controller.rb +57 -0
  106. data/app/controllers/decidim/links_controller.rb +1 -0
  107. data/app/controllers/decidim/messaging/conversations_controller.rb +1 -8
  108. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  109. data/app/controllers/decidim/notifications_settings_controller.rb +2 -2
  110. data/app/controllers/decidim/pages_controller.rb +0 -1
  111. data/app/controllers/decidim/profiles_controller.rb +2 -57
  112. data/app/controllers/decidim/qr_controller.rb +73 -0
  113. data/app/controllers/decidim/resource_autocomplete_controller.rb +56 -0
  114. data/app/controllers/decidim/user_activities_controller.rb +0 -1
  115. data/app/events/decidim/resource_liked_event.rb +36 -0
  116. data/app/forms/decidim/amendable/create_form.rb +0 -1
  117. data/app/forms/decidim/amendable/edit_form.rb +0 -1
  118. data/app/forms/decidim/amendable/form.rb +4 -4
  119. data/app/forms/decidim/ephemeral_user_form.rb +1 -0
  120. data/app/forms/decidim/notifications_settings_form.rb +1 -1
  121. data/app/forms/decidim/omniauth_registration_form.rb +1 -1
  122. data/app/forms/decidim/upload_validation_form.rb +9 -1
  123. data/app/helpers/decidim/amendments_helper.rb +3 -3
  124. data/app/helpers/decidim/animations_helper.rb +14 -0
  125. data/app/helpers/decidim/decidim_form_helper.rb +17 -6
  126. data/app/helpers/decidim/filters_helper.rb +25 -0
  127. data/app/helpers/decidim/layout_helper.rb +6 -14
  128. data/app/helpers/decidim/likeable_helper.rb +46 -0
  129. data/app/helpers/decidim/messaging/conversation_helper.rb +1 -1
  130. data/app/helpers/decidim/omniauth_helper.rb +1 -1
  131. data/app/helpers/decidim/qr_code_helper.rb +37 -0
  132. data/app/helpers/decidim/rich_text_editor_helper.rb +0 -1
  133. data/app/helpers/decidim/sanitize_helper.rb +5 -5
  134. data/app/helpers/decidim/social_share_button_helper.rb +11 -10
  135. data/app/jobs/decidim/delete_inactive_participants_job.rb +41 -0
  136. data/app/jobs/decidim/process_inactive_participant_job.rb +48 -0
  137. data/app/mailers/decidim/participants_account_mailer.rb +38 -0
  138. data/app/mailers/decidim/user_group_mailer.rb +28 -0
  139. data/app/models/decidim/action_log.rb +3 -5
  140. data/app/models/decidim/amendment.rb +1 -1
  141. data/app/models/decidim/attachment_collection.rb +2 -0
  142. data/app/models/decidim/authorization_transfer.rb +0 -1
  143. data/app/models/decidim/coauthorship.rb +1 -1
  144. data/app/models/decidim/component.rb +4 -1
  145. data/app/models/decidim/{endorsement.rb → like.rb} +4 -4
  146. data/app/models/decidim/messaging/conversation.rb +3 -5
  147. data/app/models/decidim/messaging/message.rb +3 -15
  148. data/app/models/decidim/omniauth_provider.rb +1 -1
  149. data/app/models/decidim/organization.rb +3 -8
  150. data/app/models/decidim/participatory_space_role_config/{valuator.rb → evaluator.rb} +1 -1
  151. data/app/models/decidim/reminder_record.rb +1 -1
  152. data/app/models/decidim/searchable_resource.rb +16 -0
  153. data/app/models/decidim/taxonomy.rb +6 -1
  154. data/app/models/decidim/user.rb +32 -15
  155. data/app/models/decidim/user_base_entity.rb +2 -2
  156. data/app/packs/entrypoints/decidim_conference_diploma.scss +2 -2
  157. data/app/packs/entrypoints/decidim_core.scss +2 -2
  158. data/app/packs/entrypoints/decidim_editor.js +0 -4
  159. data/app/packs/entrypoints/decidim_map.scss +2 -2
  160. data/app/packs/entrypoints/decidim_overrides.scss +1 -1
  161. data/app/packs/entrypoints/decidim_qr.js +1 -0
  162. data/app/packs/images/decidim/default-avatar.svg +1 -1
  163. data/app/packs/images/decidim/remixicon.symbol.svg +3 -3
  164. data/app/packs/src/decidim/a11y.js +1 -120
  165. data/app/packs/src/decidim/append_redirect_url_to_modals.js +1 -1
  166. data/app/packs/src/decidim/attachments/file_or_link_tabs.js +1 -1
  167. data/app/packs/src/decidim/callout.js +13 -8
  168. data/app/packs/src/decidim/confirm.js +25 -6
  169. data/app/packs/src/decidim/controllers/.keep +0 -0
  170. data/app/packs/src/decidim/controllers/accordion/controller.js +100 -0
  171. data/app/packs/src/decidim/controllers/account_form/account_form.test.js +423 -0
  172. data/app/packs/src/decidim/controllers/account_form/controller.js +69 -0
  173. data/app/packs/src/decidim/{input_character_counter.js → controllers/character_counter/controller.js} +90 -106
  174. data/app/packs/src/decidim/controllers/clipboard_copy/clipboard_copy.test.js +305 -0
  175. data/app/packs/src/decidim/controllers/clipboard_copy/controller.js +403 -0
  176. data/app/packs/src/decidim/controllers/date_picker/controller.js +12 -0
  177. data/app/packs/src/decidim/controllers/delete_account_form/controller.js +45 -0
  178. data/app/packs/src/decidim/controllers/delete_account_form/delete_account_form.test.js +216 -0
  179. data/app/packs/src/decidim/controllers/dropdown/controller.js +125 -0
  180. data/app/packs/src/decidim/controllers/editor/controller.js +8 -0
  181. data/app/packs/src/decidim/controllers/emoji/controller.js +26 -0
  182. data/app/packs/src/decidim/{input_emoji.js → controllers/emoji/emoji.js} +1 -15
  183. data/app/packs/src/decidim/{form_filter.js → controllers/form_filter/controller.js} +68 -51
  184. data/app/packs/src/decidim/controllers/form_filter/form_filter.test.js +648 -0
  185. data/app/packs/src/decidim/controllers/form_validator/controller.js +23 -0
  186. data/app/packs/src/decidim/controllers/form_validator/form_validator.js +789 -0
  187. data/app/packs/src/decidim/controllers/form_validator/form_validator.test.js +685 -0
  188. data/app/packs/src/decidim/controllers/impersonation_warning/controller.js +137 -0
  189. data/app/packs/src/decidim/controllers/impersonation_warning/impersonation.test.js +382 -0
  190. data/app/packs/src/decidim/controllers/input_tags/controller.js +28 -0
  191. data/app/packs/src/decidim/controllers/mention/controller.js +243 -0
  192. data/app/packs/src/decidim/controllers/mention/input_mentions.test.js +562 -0
  193. data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +215 -0
  194. data/app/packs/src/decidim/controllers/multiple_mentions/input_multiple_mentions.test.js +645 -0
  195. data/app/packs/src/decidim/controllers/notification_action/controller.js +210 -0
  196. data/app/packs/src/decidim/controllers/notification_action/notification_action.test.js +388 -0
  197. data/app/packs/src/decidim/controllers/password_toggler/controller.js +232 -0
  198. data/app/packs/src/decidim/controllers/password_toggler/password_toggler.test.js +229 -0
  199. data/app/packs/src/decidim/controllers/report_form/controller.js +184 -0
  200. data/app/packs/src/decidim/controllers/report_form/report_form_manager.test.js +511 -0
  201. data/app/packs/src/decidim/controllers/scroll_to_last/controller.js +9 -0
  202. data/app/packs/src/decidim/controllers/scroll_to_last/scroll_to_last_child.test.js +225 -0
  203. data/app/packs/src/decidim/controllers/sticky_buttons/controller.js +55 -0
  204. data/app/packs/src/decidim/controllers/sticky_buttons/sticky_buttons.test.js +334 -0
  205. data/app/packs/src/decidim/controllers/sticky_header/controller.js +116 -0
  206. data/app/packs/src/decidim/controllers/sticky_header/sticky_header.test.js +320 -0
  207. data/app/packs/src/decidim/controllers/toggle/controller.js +111 -0
  208. data/app/packs/src/decidim/controllers/toggle/toggle.test.js +260 -0
  209. data/app/packs/src/decidim/controllers/tooltip/controller.js +287 -0
  210. data/app/packs/src/decidim/controllers/tooltip/tooltip.test.js +380 -0
  211. data/app/packs/src/decidim/controllers/user_registration_form/controller.js +160 -0
  212. data/app/packs/src/decidim/controllers/user_registration_form/omniauth_registration_form.test.js +441 -0
  213. data/app/packs/src/decidim/controllers/user_registration_form/user_registration_form.test.js +386 -0
  214. data/app/packs/src/decidim/data_consent/index.js +1 -1
  215. data/app/packs/src/decidim/datalist_select.js +1 -1
  216. data/app/packs/src/decidim/datepicker/form_datepicker.js +1 -1
  217. data/app/packs/src/decidim/datepicker/generate_datepicker.js +4 -2
  218. data/app/packs/src/decidim/datepicker/generate_timepicker.js +4 -2
  219. data/app/packs/src/decidim/direct_uploads/upload_field.js +6 -9
  220. data/app/packs/src/decidim/direct_uploads/upload_modal.js +9 -10
  221. data/app/packs/src/decidim/dropdown_menu.js +18 -0
  222. data/app/packs/src/decidim/editor/common/input_dialog.js +1 -1
  223. data/app/packs/src/decidim/editor/common/suggestion.js +21 -3
  224. data/app/packs/src/decidim/editor/common/upload_dialog.js +1 -1
  225. data/app/packs/src/decidim/editor/extensions/decidim_kit/index.js +7 -7
  226. data/app/packs/src/decidim/editor/extensions/emoji/index.js +2 -3
  227. data/app/packs/src/decidim/editor/extensions/image/index.js +1 -1
  228. data/app/packs/src/decidim/editor/extensions/image/node_view.js +1 -1
  229. data/app/packs/src/decidim/editor/extensions/link/bubble_menu.js +1 -1
  230. data/app/packs/src/decidim/editor/extensions/link/index.js +1 -1
  231. data/app/packs/src/decidim/editor/extensions/mention/index.js +1 -2
  232. data/app/packs/src/decidim/editor/extensions/mention_resource/index.js +69 -0
  233. data/app/packs/src/decidim/editor/extensions/video_embed/index.js +1 -1
  234. data/app/packs/src/decidim/editor/index.js +6 -5
  235. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +1 -2
  236. data/app/packs/src/decidim/editor/test/extensions/emoji.test.js +17 -0
  237. data/app/packs/src/decidim/editor/test/extensions/heading.test.js +2 -2
  238. data/app/packs/src/decidim/editor/toolbar.js +1 -1
  239. data/app/packs/src/decidim/form_attachments.js +1 -1
  240. data/app/packs/src/decidim/geocoding/attach_input.js +3 -0
  241. data/app/packs/src/decidim/geocoding/provider/here.js +1 -1
  242. data/app/packs/src/decidim/geocoding/provider/photon.js +1 -1
  243. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +2 -2
  244. data/app/packs/src/decidim/geocoding.js +2 -2
  245. data/app/packs/src/decidim/index.js +128 -95
  246. data/app/packs/src/decidim/map/integration/forms.js +1 -1
  247. data/app/packs/src/decidim/map/legacy.js +1 -1
  248. data/app/packs/src/decidim/map/provider/default.js +1 -1
  249. data/app/packs/src/decidim/map/provider/here.js +1 -1
  250. data/app/packs/src/decidim/map.js +1 -1
  251. data/app/packs/src/decidim/{external_link.js → refactor/implementation/external_link.js} +1 -1
  252. data/app/packs/src/decidim/{onboarding_pending_action.js → refactor/integration/onboarding_pending_action.js} +4 -4
  253. data/app/packs/src/decidim/{check_boxes_tree.js → refactor/moved/check_boxes_tree.js} +24 -9
  254. data/app/packs/src/decidim/{i18n.test.js → refactor/moved/i18n.test.js} +1 -1
  255. data/app/packs/src/decidim/{icon.js → refactor/moved/icon.js} +2 -0
  256. data/app/packs/src/decidim/refactor/support/stimulus.js +39 -0
  257. data/app/packs/src/decidim/refactor/test/configuration.test.js +360 -0
  258. data/app/packs/src/decidim/{external_domain_warning.test.js → refactor/test/external_domain_warning.test.js} +1 -1
  259. data/app/packs/src/decidim/{external_link.test.js → refactor/test/external_link.test.js} +1 -1
  260. data/app/packs/src/decidim/results_listing.js +2 -2
  261. data/app/packs/src/decidim/security/selfxss_warning.js +1 -1
  262. data/app/packs/src/decidim/session_timeouter.js +1 -1
  263. data/app/packs/src/decidim/sw/push-permissions.js +1 -1
  264. data/app/packs/src/decidim/utilities/dom.js +1 -1
  265. data/app/packs/stylesheets/decidim/_accordion.scss +37 -3
  266. data/app/packs/stylesheets/decidim/_activity.scss +4 -4
  267. data/app/packs/stylesheets/decidim/_author.scss +0 -21
  268. data/app/packs/stylesheets/decidim/_buttons.scss +4 -0
  269. data/app/packs/stylesheets/decidim/_callout.scss +1 -1
  270. data/app/packs/stylesheets/decidim/_cards.scss +6 -2
  271. data/app/packs/stylesheets/decidim/_content_blocks.scss +1 -1
  272. data/app/packs/stylesheets/decidim/_cookies.scss +1 -1
  273. data/app/packs/stylesheets/decidim/_datepicker.scss +0 -4
  274. data/app/packs/stylesheets/decidim/_dropdown.scss +56 -19
  275. data/app/packs/stylesheets/decidim/_filters.scss +1 -1
  276. data/app/packs/stylesheets/decidim/_forms.scss +6 -6
  277. data/app/packs/stylesheets/decidim/_header.scss +28 -4
  278. data/app/packs/stylesheets/decidim/_labels.scss +1 -1
  279. data/app/packs/stylesheets/decidim/_layout.scss +14 -4
  280. data/app/packs/stylesheets/decidim/{_endorsers_list.scss → _likes_list.scss} +1 -1
  281. data/app/packs/stylesheets/decidim/_modal_share.scss +83 -9
  282. data/app/packs/stylesheets/decidim/_modal_update.scss +6 -6
  283. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +1 -1
  284. data/app/packs/stylesheets/decidim/_rich_text.scss +13 -0
  285. data/app/packs/stylesheets/decidim/_statistics.scss +35 -3
  286. data/app/packs/stylesheets/decidim/_tooltip.scss +1 -1
  287. data/app/packs/stylesheets/decidim/_typography.scss +6 -0
  288. data/app/packs/stylesheets/decidim/_wizard_steps.scss +1 -1
  289. data/app/packs/stylesheets/decidim/application.scss +76 -76
  290. data/app/packs/stylesheets/decidim/editor.scss +11 -12
  291. data/app/packs/stylesheets/decidim/legacy/email.scss +6 -5
  292. data/app/packs/stylesheets/decidim/map.scss +5 -3
  293. data/app/packs/stylesheets/decidim/qr.scss +65 -0
  294. data/app/permissions/decidim/default_permissions.rb +16 -0
  295. data/app/permissions/decidim/permissions.rb +18 -27
  296. data/app/presenters/decidim/admin_log/base_user_presenter.rb +2 -2
  297. data/app/presenters/decidim/admin_log/organization_presenter.rb +0 -15
  298. data/app/presenters/decidim/home_stats_presenter.rb +4 -54
  299. data/app/presenters/decidim/log/base_presenter.rb +1 -1
  300. data/app/presenters/decidim/menu_item_presenter.rb +10 -3
  301. data/app/presenters/decidim/official_author_presenter.rb +0 -4
  302. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +0 -4
  303. data/app/presenters/decidim/resource_locator_presenter.rb +15 -4
  304. data/app/presenters/decidim/resource_presenter.rb +8 -8
  305. data/app/presenters/decidim/stats_presenter.rb +39 -60
  306. data/app/presenters/decidim/taxonomy_presenter.rb +5 -1
  307. data/app/presenters/decidim/user_presenter.rb +0 -6
  308. data/app/queries/decidim/authorized_users.rb +26 -0
  309. data/app/queries/decidim/inactive_users_query.rb +31 -0
  310. data/app/queries/decidim/public_activities.rb +2 -2
  311. data/app/queries/decidim/stats_followers_count.rb +43 -0
  312. data/app/queries/decidim/stats_participants_count.rb +102 -0
  313. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +1 -5
  314. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +0 -1
  315. data/app/services/decidim/action_logger.rb +2 -1
  316. data/app/services/decidim/base_diff_renderer.rb +0 -17
  317. data/app/services/decidim/onboarding_manager.rb +4 -0
  318. data/app/services/decidim/open_data_exporter.rb +19 -11
  319. data/app/services/decidim/send_push_notification.rb +4 -3
  320. data/app/services/decidim/traceability.rb +1 -1
  321. data/app/validators/etiquette_validator.rb +7 -0
  322. data/app/validators/translated_etiquette_validator.rb +3 -0
  323. data/app/views/decidim/account/_old_password_field.html.erb +1 -1
  324. data/app/views/decidim/account/_password_fields.html.erb +1 -1
  325. data/app/views/decidim/account/delete.html.erb +1 -1
  326. data/app/views/decidim/account/show.html.erb +3 -3
  327. data/app/views/decidim/amendments/edit_draft.html.erb +0 -4
  328. data/app/views/decidim/amendments/new.html.erb +0 -4
  329. data/app/views/decidim/amendments/preview_draft.html.erb +1 -1
  330. data/app/views/decidim/application/_accordion_section.html.erb +1 -1
  331. data/app/views/decidim/application/_collection.html.erb +1 -1
  332. data/app/views/decidim/application/_radio_accordion.html.erb +30 -0
  333. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +1 -1
  334. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +1 -1
  335. data/app/views/decidim/devise/registrations/new.html.erb +1 -1
  336. data/app/views/decidim/devise/shared/_links.html.erb +1 -1
  337. data/app/views/decidim/doorkeeper/authorizations/new.html.erb +39 -8
  338. data/app/views/decidim/errors/internal_server_error.html.erb +2 -1
  339. data/app/views/decidim/errors/not_found.html.erb +1 -1
  340. data/app/views/decidim/likes/update_buttons_and_counters.js.erb +21 -0
  341. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +2 -2
  342. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +1 -1
  343. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  344. data/app/views/decidim/messaging/conversations/create.js.erb +0 -1
  345. data/app/views/decidim/messaging/conversations/new.html.erb +1 -1
  346. data/app/views/decidim/messaging/conversations/show.html.erb +1 -1
  347. data/app/views/decidim/newsletters/unsubscribe.html.erb +16 -4
  348. data/app/views/decidim/notifications_settings/show.html.erb +3 -3
  349. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  350. data/app/views/decidim/pages/index.html.erb +1 -1
  351. data/app/views/decidim/participants_account_mailer/inactivity_notification.html.erb +13 -0
  352. data/app/views/decidim/participants_account_mailer/removal_notification.html.erb +11 -0
  353. data/app/views/decidim/profiles/show.html.erb +1 -1
  354. data/app/views/decidim/qr/show.html.erb +28 -0
  355. data/app/views/decidim/searches/_filters.html.erb +66 -15
  356. data/app/views/decidim/searches/index.html.erb +5 -2
  357. data/app/views/decidim/shared/_component_announcement.html.erb +1 -1
  358. data/app/views/decidim/shared/_confirm_modal.html.erb +1 -1
  359. data/app/views/decidim/shared/_filters.html.erb +8 -6
  360. data/app/views/decidim/shared/_orders.html.erb +1 -1
  361. data/app/views/decidim/shared/_resource_actions.html.erb +8 -5
  362. data/app/views/decidim/user_activities/index.html.erb +1 -1
  363. data/app/views/decidim/user_group_mailer/notify_deprecation_to_member.html.erb +15 -0
  364. data/app/views/decidim/user_group_mailer/notify_deprecation_to_owner.html.erb +22 -0
  365. data/app/views/layouts/decidim/_head.html.erb +15 -12
  366. data/app/views/layouts/decidim/_impersonation_warning.html.erb +1 -1
  367. data/app/views/layouts/decidim/_js_configuration.html.erb +17 -19
  368. data/app/views/layouts/decidim/_meta_tags_context.html.erb +3 -0
  369. data/app/views/layouts/decidim/_offline_banner.html.erb +1 -1
  370. data/app/views/layouts/decidim/_wrapper.html.erb +8 -6
  371. data/app/views/layouts/decidim/footer/_focus_mode_main.html.erb +7 -0
  372. data/app/views/layouts/decidim/footer/_main.html.erb +1 -1
  373. data/app/views/layouts/decidim/footer/_main_intro.html.erb +1 -1
  374. data/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +1 -1
  375. data/app/views/layouts/decidim/footer/_mini.html.erb +2 -2
  376. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +12 -2
  377. data/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +24 -0
  378. data/app/views/layouts/decidim/header/_main.html.erb +28 -22
  379. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +7 -1
  380. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +20 -18
  381. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +1 -1
  382. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +1 -1
  383. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +1 -1
  384. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +1 -1
  385. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +1 -1
  386. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +1 -1
  387. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +2 -2
  388. data/app/views/layouts/decidim/mailer.html.erb +2 -2
  389. data/app/views/layouts/decidim/newsletter_base.html.erb +2 -2
  390. data/app/views/layouts/decidim/shared/_layout_two_col.html.erb +3 -1
  391. data/app/views/layouts/decidim/shared/_layout_user_profile.html.erb +7 -3
  392. data/config/assets.rb +3 -3
  393. data/config/initializers/devise.rb +8 -0
  394. data/config/initializers/omniauth.rb +1 -1
  395. data/config/locales/ar.yml +0 -212
  396. data/config/locales/bg-BG.yml +2 -2
  397. data/config/locales/bg.yml +0 -243
  398. data/config/locales/bs-BA.yml +0 -30
  399. data/config/locales/ca-IT.yml +129 -280
  400. data/config/locales/ca.yml +129 -280
  401. data/config/locales/cs.yml +99 -284
  402. data/config/locales/de.yml +144 -285
  403. data/config/locales/el.yml +0 -228
  404. data/config/locales/en.yml +129 -280
  405. data/config/locales/eo.yml +0 -2
  406. data/config/locales/es-MX.yml +129 -280
  407. data/config/locales/es-PY.yml +129 -280
  408. data/config/locales/es.yml +129 -280
  409. data/config/locales/eu.yml +175 -326
  410. data/config/locales/fi-plain.yml +167 -270
  411. data/config/locales/fi.yml +168 -271
  412. data/config/locales/fr-CA.yml +102 -269
  413. data/config/locales/fr-LU.yml +3 -3
  414. data/config/locales/fr.yml +102 -269
  415. data/config/locales/ga-IE.yml +0 -28
  416. data/config/locales/gl.yml +0 -143
  417. data/config/locales/hu.yml +0 -242
  418. data/config/locales/id-ID.yml +0 -139
  419. data/config/locales/is-IS.yml +0 -15
  420. data/config/locales/it.yml +122 -193
  421. data/config/locales/ja.yml +124 -267
  422. data/config/locales/lb-LU.yml +2 -2
  423. data/config/locales/lb.yml +0 -192
  424. data/config/locales/lt.yml +0 -245
  425. data/config/locales/lv.yml +0 -189
  426. data/config/locales/nl.yml +0 -192
  427. data/config/locales/no.yml +0 -192
  428. data/config/locales/pl.yml +0 -249
  429. data/config/locales/pt-BR.yml +0 -217
  430. data/config/locales/pt.yml +0 -192
  431. data/config/locales/ro-RO.yml +54 -222
  432. data/config/locales/ru.yml +0 -65
  433. data/config/locales/sk-SK.yml +3 -3
  434. data/config/locales/sk.yml +2 -167
  435. data/config/locales/sr-CS.yml +0 -31
  436. data/config/locales/sv.yml +96 -256
  437. data/config/locales/tr-TR.yml +0 -192
  438. data/config/locales/uk.yml +0 -25
  439. data/config/locales/zh-CN.yml +0 -183
  440. data/config/locales/zh-TW.yml +0 -234
  441. data/config/routes.rb +3 -36
  442. data/db/migrate/20250217192438_convert_user_groups_into_users.rb +38 -0
  443. data/db/migrate/20250221085317_add_user_type_to_action_logs.rb +12 -0
  444. data/db/migrate/20250221090905_create_decidim_api_jwt_denylist.rb +11 -0
  445. data/db/migrate/20250221091348_add_api_key_to_decidim_api_user.rb +7 -0
  446. data/db/migrate/20250327143657_remove_metrics_content_blocks.rb +9 -0
  447. data/db/migrate/20250401153444_enable_pkce.rb +8 -0
  448. data/db/migrate/20250416130426_rename_doorkeeper_scopes.rb +25 -0
  449. data/db/migrate/20250515105231_rename_endorsements_to_likes.rb +62 -0
  450. data/db/migrate/20250523104311_move_cta_to_hero_content_block.rb +34 -0
  451. data/db/migrate/20250527122040_move_highlighted_content_banner_settings_to_content_block.rb +69 -0
  452. data/db/migrate/20250603103953_add_refresh_tokens_enabled_to_doorkeeper_applications.rb +7 -0
  453. data/db/migrate/20250609073104_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb +10 -0
  454. data/db/migrate/20250613122148_remove_hashtag_table_from_core.rb +7 -0
  455. data/decidim-core.gemspec +4 -4
  456. data/{app/helpers → lib}/decidim/action_authorization_helper.rb +5 -4
  457. data/lib/decidim/amendable.rb +4 -4
  458. data/lib/decidim/api/functions/user_entity_finder.rb +1 -1
  459. data/lib/decidim/api/input_filters/component_input_filter.rb +3 -3
  460. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +0 -21
  461. data/lib/decidim/api/input_sorts/has_likeable_input_sort.rb +15 -0
  462. data/lib/decidim/api/interfaces/attachable_collection_interface.rb +13 -0
  463. data/lib/decidim/api/interfaces/author_interface.rb +1 -2
  464. data/lib/decidim/api/interfaces/authorable_interface.rb +2 -2
  465. data/lib/decidim/api/interfaces/coauthorable_interface.rb +1 -1
  466. data/lib/decidim/api/interfaces/component_interface.rb +6 -0
  467. data/lib/decidim/api/interfaces/followable_interface.rb +13 -0
  468. data/lib/decidim/api/interfaces/likeable_interface.rb +19 -0
  469. data/lib/decidim/api/interfaces/localizable_interface.rb +18 -0
  470. data/lib/decidim/api/interfaces/participatory_space_interface.rb +6 -8
  471. data/lib/decidim/api/interfaces/referable_interface.rb +13 -0
  472. data/lib/decidim/api/interfaces/timestamps_interface.rb +0 -1
  473. data/lib/decidim/api/interfaces/traceable_interface.rb +1 -1
  474. data/lib/decidim/api/types/attachment_collection_type.rb +14 -0
  475. data/lib/decidim/api/types/organization_type.rb +3 -1
  476. data/lib/decidim/api/types/session_type.rb +0 -5
  477. data/lib/decidim/api/types/statistic_type.rb +29 -3
  478. data/lib/decidim/api/types/trace_version_type.rb +1 -1
  479. data/lib/decidim/api/types/user_type.rb +1 -2
  480. data/lib/decidim/api_response_helper.rb +12 -0
  481. data/lib/decidim/asset_router/storage.rb +2 -4
  482. data/lib/decidim/assets/tailwind/instance.rb +1 -1
  483. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +5 -3
  484. data/lib/decidim/attribute_encryptor.rb +1 -1
  485. data/lib/decidim/attributes/time_with_zone.rb +1 -1
  486. data/lib/decidim/authorable.rb +5 -34
  487. data/lib/decidim/coauthorable.rb +13 -31
  488. data/lib/decidim/content_parsers/blob_parser.rb +1 -1
  489. data/lib/decidim/content_parsers/mention_resource_parser.rb +23 -0
  490. data/lib/decidim/content_parsers/tag_parser.rb +2 -2
  491. data/lib/decidim/content_parsers/user_parser.rb +2 -2
  492. data/lib/decidim/content_parsers.rb +14 -2
  493. data/lib/decidim/content_processor.rb +1 -1
  494. data/lib/decidim/content_renderers/mention_resource_renderer.rb +77 -0
  495. data/lib/decidim/content_renderers.rb +1 -2
  496. data/lib/decidim/core/api.rb +7 -8
  497. data/lib/decidim/core/content_blocks/registry_manager.rb +19 -5
  498. data/lib/decidim/core/engine.rb +72 -104
  499. data/lib/decidim/core/menu.rb +0 -7
  500. data/lib/decidim/core/seeds.rb +11 -39
  501. data/lib/decidim/core/test/factories.rb +24 -123
  502. data/lib/decidim/core/test/shared_examples/announcements_examples.rb +4 -0
  503. data/lib/decidim/core/test/shared_examples/authorable.rb +0 -17
  504. data/lib/decidim/core/test/shared_examples/coauthorable.rb +5 -48
  505. data/lib/decidim/core/test/shared_examples/comments_examples.rb +14 -61
  506. data/lib/decidim/core/test/shared_examples/likeable.rb +22 -0
  507. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +16 -3
  508. data/lib/decidim/core/test/shared_examples/map_examples.rb +1 -1
  509. data/lib/decidim/core/test/shared_examples/oauth_application_examples.rb +137 -0
  510. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +0 -18
  511. data/lib/decidim/core/test/shared_examples/permissions.rb +0 -46
  512. data/lib/decidim/core/test/shared_examples/reports_examples.rb +2 -2
  513. data/lib/decidim/core/test/shared_examples/{resource_endorsed_event_examples.rb → resource_liked_event_examples.rb} +7 -7
  514. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +0 -14
  515. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +8 -34
  516. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +79 -0
  517. data/lib/decidim/core/test/shared_examples/system_like_resource_examples.rb +192 -0
  518. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +2 -2
  519. data/lib/decidim/core/test/shared_examples/{with_endorsable_permissions_examples.rb → with_likeable_permissions_examples.rb} +22 -22
  520. data/lib/decidim/core/test.rb +6 -9
  521. data/lib/decidim/core/version.rb +1 -1
  522. data/lib/decidim/core.rb +237 -88
  523. data/lib/decidim/deprecations.rb +1 -1
  524. data/lib/decidim/download_your_data_serializers.rb +6 -3
  525. data/lib/decidim/env.rb +3 -1
  526. data/lib/decidim/events.rb +0 -1
  527. data/lib/decidim/form_builder.rb +40 -43
  528. data/lib/decidim/gamification/badge_scorer.rb +0 -2
  529. data/lib/decidim/gamification.rb +1 -1
  530. data/lib/decidim/has_conversations.rb +0 -44
  531. data/lib/decidim/has_workflows.rb +42 -0
  532. data/lib/decidim/icon_registry.rb +4 -4
  533. data/lib/decidim/legacy_form_builder.rb +17 -2
  534. data/lib/decidim/likeable.rb +24 -0
  535. data/lib/decidim/manifest_registry.rb +1 -1
  536. data/lib/decidim/map/provider/dynamic_map/here.rb +0 -19
  537. data/lib/decidim/map/provider/static_map/here.rb +2 -10
  538. data/lib/decidim/menu.rb +1 -1
  539. data/lib/decidim/moderation_tools.rb +1 -1
  540. data/lib/decidim/mutation_registry.rb +17 -0
  541. data/lib/decidim/newsletter_encryptor.rb +1 -1
  542. data/lib/decidim/oauth/token_generator.rb +35 -0
  543. data/lib/decidim/oauth.rb +7 -0
  544. data/lib/decidim/organization_settings.rb +2 -10
  545. data/lib/decidim/paddable.rb +1 -1
  546. data/lib/decidim/participatory_space_resourceable.rb +2 -2
  547. data/lib/decidim/participatory_space_user.rb +1 -1
  548. data/lib/decidim/pdf_signature_example.rb +108 -0
  549. data/lib/decidim/query.rb +1 -1
  550. data/lib/decidim/query_extensions.rb +0 -33
  551. data/lib/decidim/reportable.rb +1 -1
  552. data/lib/decidim/searchable.rb +4 -2
  553. data/lib/decidim/seeds.rb +8 -0
  554. data/lib/decidim/settings_manifest.rb +3 -2
  555. data/lib/decidim/{webpacker → shakapacker}/configuration.rb +4 -4
  556. data/lib/decidim/{webpacker → shakapacker}/runner.rb +3 -3
  557. data/lib/decidim/shakapacker/shakapacker.rb +8 -0
  558. data/lib/decidim/{webpacker → shakapacker}/shakapacker.yml +3 -1
  559. data/lib/decidim/{webpacker → shakapacker}/webpack/custom.js +1 -1
  560. data/lib/decidim/shakapacker.rb +34 -0
  561. data/lib/decidim/social_share_service_manifest.rb +7 -12
  562. data/lib/decidim/stats_registry.rb +15 -3
  563. data/{app/helpers → lib}/decidim/tooltip_helper.rb +3 -3
  564. data/lib/decidim/url_option_resolver.rb +1 -1
  565. data/lib/decidim/view_model.rb +0 -3
  566. data/lib/decidim/webpacker.rb +11 -20
  567. data/lib/decidim/workflow_registry.rb +61 -0
  568. data/lib/tasks/decidim_participants_tasks.rake +22 -0
  569. data/lib/tasks/{decidim_webpacker_tasks.rake → decidim_shakapacker_tasks.rake} +35 -33
  570. data/lib/tasks/decidim_tasks.rake +4 -1
  571. data/lib/tasks/decidim_taxonomies.rake +0 -34
  572. data/lib/tasks/upgrade/clean.rake +1 -1
  573. data/lib/tasks/upgrade/decidim_action_log_valuation_assignment.rake +13 -0
  574. data/lib/tasks/upgrade/decidim_change_valuator_tasks.rake +12 -0
  575. data/lib/tasks/upgrade/{decidim_deduplicate_endorsements.rake → decidim_deduplicate_likes.rake} +10 -10
  576. data/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake +2 -2
  577. data/lib/tasks/upgrade/decidim_paper_trail_valuation_assignment.rake +13 -0
  578. data/lib/tasks/upgrade/user_groups_migration.rake +155 -0
  579. metadata +205 -256
  580. data/app/cells/decidim/author/endorsements.erb +0 -4
  581. data/app/cells/decidim/author/profile_minicard.erb +0 -30
  582. data/app/cells/decidim/content_blocks/organization_metrics_cell.rb +0 -21
  583. data/app/cells/decidim/content_blocks/participatory_space_metrics/content.erb +0 -18
  584. data/app/cells/decidim/content_blocks/participatory_space_metrics_cell.rb +0 -43
  585. data/app/cells/decidim/endorsement_block/show.erb +0 -3
  586. data/app/cells/decidim/endorsement_buttons/button_content.erb +0 -2
  587. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +0 -7
  588. data/app/cells/decidim/endorsement_buttons/show.erb +0 -17
  589. data/app/cells/decidim/endorsement_buttons_cell.rb +0 -87
  590. data/app/cells/decidim/endorsers_list/empty.erb +0 -3
  591. data/app/cells/decidim/endorsers_list/show.erb +0 -20
  592. data/app/cells/decidim/endorsers_list_cell.rb +0 -64
  593. data/app/cells/decidim/group_admins/show.erb +0 -32
  594. data/app/cells/decidim/group_admins_cell.rb +0 -8
  595. data/app/cells/decidim/group_members/show.erb +0 -42
  596. data/app/cells/decidim/group_members_cell.rb +0 -8
  597. data/app/cells/decidim/groups/show.erb +0 -14
  598. data/app/cells/decidim/groups_cell.rb +0 -22
  599. data/app/cells/decidim/members/show.erb +0 -12
  600. data/app/cells/decidim/members_cell.rb +0 -34
  601. data/app/cells/decidim/profile_actions/dropdown_actions.erb +0 -21
  602. data/app/cells/decidim/represent_user_group/show.erb +0 -11
  603. data/app/cells/decidim/represent_user_group_cell.rb +0 -46
  604. data/app/cells/decidim/user_conversation/conversation_header.erb +0 -14
  605. data/app/cells/decidim/user_conversation/messages.erb +0 -1
  606. data/app/cells/decidim/user_conversation/new.erb +0 -6
  607. data/app/cells/decidim/user_conversation/reply.erb +0 -9
  608. data/app/cells/decidim/user_conversation/show.erb +0 -19
  609. data/app/cells/decidim/user_conversation/start.erb +0 -12
  610. data/app/cells/decidim/user_conversation_cell.rb +0 -62
  611. data/app/cells/decidim/user_conversations/new_conversation_button.erb +0 -20
  612. data/app/cells/decidim/user_conversations/show.erb +0 -13
  613. data/app/cells/decidim/user_conversations_cell.rb +0 -28
  614. data/app/cells/decidim/user_group_pending_invitations_list/show.erb +0 -28
  615. data/app/cells/decidim/user_group_pending_invitations_list_cell.rb +0 -26
  616. data/app/cells/decidim/user_group_pending_requests_list/show.erb +0 -27
  617. data/app/cells/decidim/user_group_pending_requests_list_cell.rb +0 -26
  618. data/app/commands/decidim/accept_group_invitation.rb +0 -43
  619. data/app/commands/decidim/accept_user_group_join_request.rb +0 -53
  620. data/app/commands/decidim/create_user_group.rb +0 -73
  621. data/app/commands/decidim/demote_membership.rb +0 -57
  622. data/app/commands/decidim/endorse_resource.rb +0 -66
  623. data/app/commands/decidim/invite_user_to_group.rb +0 -63
  624. data/app/commands/decidim/join_user_group.rb +0 -57
  625. data/app/commands/decidim/leave_user_group.rb +0 -47
  626. data/app/commands/decidim/promote_membership.rb +0 -55
  627. data/app/commands/decidim/reject_group_invitation.rb +0 -42
  628. data/app/commands/decidim/reject_user_group_join_request.rb +0 -53
  629. data/app/commands/decidim/remove_user_from_group.rb +0 -53
  630. data/app/commands/decidim/unendorse_resource.rb +0 -39
  631. data/app/commands/decidim/update_user_group.rb +0 -72
  632. data/app/controllers/concerns/decidim/user_groups.rb +0 -23
  633. data/app/controllers/decidim/endorsements_controller.rb +0 -71
  634. data/app/controllers/decidim/group_email_confirmations_controller.rb +0 -32
  635. data/app/controllers/decidim/group_invites_controller.rb +0 -104
  636. data/app/controllers/decidim/group_members_controller.rb +0 -75
  637. data/app/controllers/decidim/groups_controller.rb +0 -99
  638. data/app/controllers/decidim/own_user_groups_controller.rb +0 -15
  639. data/app/controllers/decidim/user_conversations_controller.rb +0 -133
  640. data/app/controllers/decidim/user_group_join_requests_controller.rb +0 -72
  641. data/app/events/decidim/demoted_membership_event.rb +0 -28
  642. data/app/events/decidim/invited_to_group_event.rb +0 -62
  643. data/app/events/decidim/join_request_accepted_event.rb +0 -28
  644. data/app/events/decidim/join_request_created_event.rb +0 -28
  645. data/app/events/decidim/join_request_rejected_event.rb +0 -28
  646. data/app/events/decidim/promoted_to_admin_event.rb +0 -28
  647. data/app/events/decidim/removed_from_group_event.rb +0 -28
  648. data/app/events/decidim/resource_endorsed_event.rb +0 -36
  649. data/app/events/decidim/user_group_admin_event.rb +0 -37
  650. data/app/events/decidim/user_group_created_event.rb +0 -6
  651. data/app/events/decidim/user_group_updated_event.rb +0 -6
  652. data/app/forms/decidim/invite_user_to_group_form.rb +0 -29
  653. data/app/forms/decidim/user_group_form.rb +0 -85
  654. data/app/helpers/decidim/cta_button_helper.rb +0 -31
  655. data/app/helpers/decidim/endorsable_helper.rb +0 -84
  656. data/app/helpers/decidim/twitter_search_helper.rb +0 -14
  657. data/app/helpers/decidim/user_group_helper.rb +0 -22
  658. data/app/jobs/decidim/metric_job.rb +0 -15
  659. data/app/models/decidim/metric.rb +0 -25
  660. data/app/models/decidim/user_group.rb +0 -217
  661. data/app/models/decidim/user_group_membership.rb +0 -17
  662. data/app/packs/entrypoints/decidim_widget.js +0 -1
  663. data/app/packs/src/decidim/abide_form_validator_fixer.js +0 -44
  664. data/app/packs/src/decidim/account_form.js +0 -96
  665. data/app/packs/src/decidim/append_elements.js +0 -6
  666. data/app/packs/src/decidim/back_to_list.js +0 -26
  667. data/app/packs/src/decidim/change_report_form_behavior.js +0 -45
  668. data/app/packs/src/decidim/clipboard.js +0 -128
  669. data/app/packs/src/decidim/editor/extensions/hashtag/index.js +0 -66
  670. data/app/packs/src/decidim/editor/extensions/heading/index.js +0 -33
  671. data/app/packs/src/decidim/editor/test/extensions/hashtag.test.js +0 -105
  672. data/app/packs/src/decidim/form_filter.component_for_testing.js +0 -7
  673. data/app/packs/src/decidim/form_validator.js +0 -56
  674. data/app/packs/src/decidim/gallery.js +0 -5
  675. data/app/packs/src/decidim/impersonation.js +0 -23
  676. data/app/packs/src/decidim/input_autojump.js +0 -38
  677. data/app/packs/src/decidim/input_hashtags.js +0 -91
  678. data/app/packs/src/decidim/input_mentions.js +0 -143
  679. data/app/packs/src/decidim/input_multiple_mentions.js +0 -115
  680. data/app/packs/src/decidim/input_tags.js +0 -16
  681. data/app/packs/src/decidim/notifications_actions.js +0 -40
  682. data/app/packs/src/decidim/password_toggler.js +0 -104
  683. data/app/packs/src/decidim/remote_tooltips.js +0 -38
  684. data/app/packs/src/decidim/responsive_horizontal_tabs.js +0 -12
  685. data/app/packs/src/decidim/scroll_to_last_child.js +0 -14
  686. data/app/packs/src/decidim/slug_form.js +0 -9
  687. data/app/packs/src/decidim/sticky_footer.js +0 -48
  688. data/app/packs/src/decidim/sticky_header.js +0 -62
  689. data/app/packs/src/decidim/toggle.js +0 -37
  690. data/app/packs/src/decidim/tooltips.js +0 -152
  691. data/app/packs/src/decidim/user_registrations.js +0 -65
  692. data/app/packs/src/decidim/vizzs/areachart.js +0 -251
  693. data/app/packs/src/decidim/vizzs/index.js +0 -82
  694. data/app/packs/src/decidim/widget.js +0 -14
  695. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  696. data/app/packs/stylesheets/decidim/_metrics.scss +0 -70
  697. data/app/packs/stylesheets/decidim/_modal_identities.scss +0 -23
  698. data/app/presenters/decidim/admin_log/user_group_presenter.rb +0 -31
  699. data/app/presenters/decidim/hashtag_presenter.rb +0 -37
  700. data/app/presenters/decidim/metric_charts_presenter.rb +0 -92
  701. data/app/presenters/decidim/metric_object_presenter.rb +0 -32
  702. data/app/presenters/decidim/user_group_presenter.rb +0 -38
  703. data/app/queries/decidim/metric_manage.rb +0 -81
  704. data/app/queries/decidim/metric_measure.rb +0 -36
  705. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +0 -26
  706. data/app/queries/decidim/metrics/followers_metric_manage.rb +0 -65
  707. data/app/queries/decidim/metrics/participants_metric_manage.rb +0 -79
  708. data/app/queries/decidim/metrics/reported_users_metric_manage.rb +0 -26
  709. data/app/queries/decidim/metrics/user_reports_metric_manage.rb +0 -26
  710. data/app/queries/decidim/metrics/users_metric_manage.rb +0 -26
  711. data/app/queries/decidim/user_groups/accepted_memberships.rb +0 -36
  712. data/app/queries/decidim/user_groups/accepted_user_groups.rb +0 -38
  713. data/app/queries/decidim/user_groups/accepted_users.rb +0 -36
  714. data/app/queries/decidim/user_groups/admin_memberships.rb +0 -37
  715. data/app/queries/decidim/user_groups/invited_memberships.rb +0 -36
  716. data/app/queries/decidim/user_groups/manageable_user_groups.rb +0 -39
  717. data/app/queries/decidim/user_groups/member_memberships.rb +0 -37
  718. data/app/resolvers/decidim/core/metric_resolver.rb +0 -71
  719. data/app/resolvers/decidim/hashtags_resolver.rb +0 -15
  720. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +0 -22
  721. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +0 -38
  722. data/app/views/decidim/endorsements/_identity.html.erb +0 -4
  723. data/app/views/decidim/endorsements/identities.html.erb +0 -18
  724. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +0 -25
  725. data/app/views/decidim/group_invites/index.html.erb +0 -26
  726. data/app/views/decidim/groups/_form.html.erb +0 -17
  727. data/app/views/decidim/groups/edit.html.erb +0 -19
  728. data/app/views/decidim/groups/new.html.erb +0 -23
  729. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_conversation.html.erb +0 -17
  730. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_message.html.erb +0 -17
  731. data/app/views/decidim/messaging/conversation_mailer/new_group_conversation.html.erb +0 -17
  732. data/app/views/decidim/messaging/conversation_mailer/new_group_message.html.erb +0 -17
  733. data/app/views/decidim/own_user_groups/index.html.erb +0 -10
  734. data/app/views/decidim/shared/_extended_navigation_bar.html.erb +0 -50
  735. data/app/views/decidim/user_conversations/index.html.erb +0 -4
  736. data/app/views/decidim/user_conversations/show.html.erb +0 -4
  737. data/app/views/decidim/user_conversations/update.js.erb +0 -8
  738. data/config/initializers/new_framework_defaults_7_0.rb +0 -145
  739. data/lib/decidim/api/input_filters/has_hastaggable_input_filter.rb +0 -15
  740. data/lib/decidim/api/input_sorts/has_endorsable_input_sort.rb +0 -15
  741. data/lib/decidim/api/interfaces/endorsable_interface.rb +0 -19
  742. data/lib/decidim/api/types/hashtag_type.rb +0 -13
  743. data/lib/decidim/api/types/metric_history_type.rb +0 -20
  744. data/lib/decidim/api/types/metric_type.rb +0 -13
  745. data/lib/decidim/api/types/user_group_type.rb +0 -55
  746. data/lib/decidim/content_parsers/hashtag_parser.rb +0 -66
  747. data/lib/decidim/content_parsers/user_group_parser.rb +0 -33
  748. data/lib/decidim/content_renderers/hashtag_renderer.rb +0 -78
  749. data/lib/decidim/content_renderers/user_group_renderer.rb +0 -31
  750. data/lib/decidim/core/test/shared_examples/amendable_interface_examples.rb +0 -14
  751. data/lib/decidim/core/test/shared_examples/amendable_proposals_interface_examples.rb +0 -50
  752. data/lib/decidim/core/test/shared_examples/assembly_announcements_examples.rb +0 -38
  753. data/lib/decidim/core/test/shared_examples/attachable_interface_examples.rb +0 -16
  754. data/lib/decidim/core/test/shared_examples/authorable_interface_examples.rb +0 -59
  755. data/lib/decidim/core/test/shared_examples/categories_container_examples.rb +0 -22
  756. data/lib/decidim/core/test/shared_examples/categorizable_interface_examples.rb +0 -27
  757. data/lib/decidim/core/test/shared_examples/coauthorable_interface_examples.rb +0 -91
  758. data/lib/decidim/core/test/shared_examples/endorsable.rb +0 -69
  759. data/lib/decidim/core/test/shared_examples/endorsable_interface_examples.rb +0 -22
  760. data/lib/decidim/core/test/shared_examples/fingerprintable_interface_examples.rb +0 -17
  761. data/lib/decidim/core/test/shared_examples/input_filter_examples.rb +0 -118
  762. data/lib/decidim/core/test/shared_examples/input_sort_examples.rb +0 -126
  763. data/lib/decidim/core/test/shared_examples/metric_manage_shared_context.rb +0 -9
  764. data/lib/decidim/core/test/shared_examples/participatory_space_resourcable_interface_examples.rb +0 -43
  765. data/lib/decidim/core/test/shared_examples/process_announcements_examples.rb +0 -37
  766. data/lib/decidim/core/test/shared_examples/scopable_interface_examples.rb +0 -19
  767. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +0 -298
  768. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +0 -20
  769. data/lib/decidim/core/test/shared_examples/timestamps_interface_examples.rb +0 -21
  770. data/lib/decidim/core/test/shared_examples/traceable_interface_examples.rb +0 -47
  771. data/lib/decidim/download_your_data_serializers/download_your_data_user_group_serializer.rb +0 -21
  772. data/lib/decidim/endorsable.rb +0 -29
  773. data/lib/decidim/events/user_group_event.rb +0 -43
  774. data/lib/decidim/hashtag.rb +0 -13
  775. data/lib/decidim/metric_manifest.rb +0 -35
  776. data/lib/decidim/metric_operation.rb +0 -58
  777. data/lib/decidim/metric_operation_manifest.rb +0 -21
  778. data/lib/decidim/metric_registry.rb +0 -109
  779. data/lib/gem_overrides/shakapacker/runner.rb +0 -9
  780. data/lib/tasks/decidim_metrics_tasks.rake +0 -89
  781. /data/app/cells/decidim/{endorsement_buttons/disabled_endorsements.erb → like_buttons/disabled_likes.erb} +0 -0
  782. /data/app/packs/src/decidim/{configuration.js → refactor/implementation/configuration.js} +0 -0
  783. /data/app/packs/src/decidim/{external_domain_warning.js → refactor/implementation/external_domain_warning.js} +0 -0
  784. /data/app/packs/src/decidim/{autocomplete.js → refactor/moved/autocomplete.js} +0 -0
  785. /data/app/packs/src/decidim/{delayed.js → refactor/moved/delayed.js} +0 -0
  786. /data/app/packs/src/decidim/{focus_guard.js → refactor/moved/focus_guard.js} +0 -0
  787. /data/app/packs/src/decidim/{history.js → refactor/moved/history.js} +0 -0
  788. /data/app/packs/src/decidim/{i18n.js → refactor/moved/i18n.js} +0 -0
  789. /data/lib/decidim/core/test/shared_examples/{endorsements_controller_shared_context.rb → likes_controller_shared_context.rb} +0 -0
  790. /data/{app/helpers → lib}/decidim/resource_helper.rb +0 -0
  791. /data/lib/decidim/{webpacker → shakapacker}/esbuild.config.js +0 -0
  792. /data/lib/decidim/{webpacker → shakapacker}/postcss.config.js +0 -0
  793. /data/lib/decidim/{webpacker → shakapacker}/tsconfig.json +0 -0
  794. /data/lib/decidim/{webpacker → shakapacker}/webpack/.modernizrrc +0 -0
  795. /data/lib/decidim/{webpacker → shakapacker}/webpack/webpack.config.js +0 -0
@@ -119,7 +119,18 @@ module Decidim
119
119
  def manifest_for(record)
120
120
  record.try(:resource_manifest) ||
121
121
  record.class.try(:resource_manifest) ||
122
- record.class.try(:participatory_space_manifest)
122
+ record.class.try(:participatory_space_manifest) ||
123
+ record.to_s
124
+ end
125
+
126
+ def route_name_for(record)
127
+ manifest = manifest_for(record)
128
+
129
+ if manifest.respond_to?(:route_name)
130
+ manifest.route_name
131
+ else
132
+ manifest.to_s
133
+ end
123
134
  end
124
135
 
125
136
  def component
@@ -130,14 +141,14 @@ module Decidim
130
141
  if polymorphic?
131
142
  polymorphic_member_route_name
132
143
  else
133
- manifest_for(target).route_name
144
+ route_name_for(target)
134
145
  end
135
146
  end
136
147
 
137
148
  def polymorphic_member_route_name
138
149
  return unless polymorphic?
139
150
 
140
- resource.map { |record| manifest_for(record).route_name }.join("_")
151
+ resource.map { |record| route_name_for(record) }.join("_")
141
152
  end
142
153
 
143
154
  def collection_route_name
@@ -149,7 +160,7 @@ module Decidim
149
160
 
150
161
  parent_resources = {}
151
162
  (resource - [target]).each do |parent|
152
- parent_resources["#{manifest_for(parent).route_name}_id"] = parent.id
163
+ parent_resources["#{route_name_for(parent)}_id"] = parent.id unless parent.is_a?(String)
153
164
  end
154
165
  parent_resources
155
166
  end
@@ -6,12 +6,12 @@ module Decidim
6
6
  include Decidim::TranslatableAttributes
7
7
  include Decidim::SanitizeHelper
8
8
 
9
- def title(resource_title, links, html_escape, all_locales, extras: true)
9
+ def title(resource_title, html_escape, all_locales)
10
10
  handle_locales(resource_title, all_locales) do |content|
11
11
  content = decidim_html_escape(content) if html_escape
12
12
 
13
- renderer = Decidim::ContentRenderers::HashtagRenderer.new(content)
14
- renderer.render(links:, extras:).html_safe
13
+ renderer = Decidim::ContentRenderers::BlobRenderer.new(content)
14
+ renderer.render.html_safe
15
15
  end
16
16
  end
17
17
 
@@ -30,16 +30,16 @@ module Decidim
30
30
  end
31
31
 
32
32
  # Prepares the HTML content for the editors with the correct tags included
33
- # to identify the hashtags and mentions.
34
- def editor_locales(data, all_locales, extras: true)
33
+ # to identify the mentions.
34
+ def editor_locales(data, all_locales)
35
35
  handle_locales(data, all_locales) do |content|
36
36
  [
37
- Decidim::ContentRenderers::HashtagRenderer,
37
+ Decidim::ContentRenderers::BlobRenderer,
38
38
  Decidim::ContentRenderers::UserRenderer,
39
- Decidim::ContentRenderers::UserGroupRenderer
39
+ Decidim::ContentRenderers::MentionResourceRenderer
40
40
  ].each do |renderer_class|
41
41
  renderer = renderer_class.new(content)
42
- content = renderer.render(links: false, editor: true, extras:).html_safe
42
+ content = renderer.render(editor: true).html_safe
43
43
  end
44
44
 
45
45
  content
@@ -3,83 +3,62 @@
3
3
  module Decidim
4
4
  # A general presenter to render statistics in participatory spaces.
5
5
  class StatsPresenter < SimpleDelegator
6
- def comments_stats(name)
7
- comments = Decidim.component_manifests.map do |component_manifest|
8
- component_manifest.stats.only([:comments_count])
9
- .filter({ tag: :comments })
10
- .with_context(published_components)
11
- .map { |_name, value| value }.sum
12
- end
13
- comments_count = comments.inject(0, :+) { |sum, value| sum + value }
14
- [[name, :comments_count, comments_count]]
15
- end
16
-
17
- def statistics(grouped_stats)
18
- statistics = {}
19
-
20
- grouped_stats.each do |_manifest_name, stats|
21
- stats.each do |_space_manifest, component_manifest, count|
22
- next if count.zero?
23
-
24
- statistics[component_manifest] ||= 0
25
- statistics[component_manifest] += count
6
+ # Public: returns a collection of stats (Hash) for the Participatory Space Home.
7
+ def collection(priority: StatsRegistry::MEDIUM_PRIORITY)
8
+ stats = all_stats(priority:).reject(&:empty?)
9
+ stats = stats.reject { |stat| stat[:data].blank? || stat[:data][0].zero? }
10
+ stats.each_with_object({}) do |stat, hash|
11
+ name = stat[:name]
12
+ if hash[name]
13
+ stat[:data].each_with_index do |value, idx|
14
+ hash[name][:data][idx] ||= 0
15
+ hash[name][:data][idx] += value
16
+ end
17
+ else
18
+ hash[name] = stat
26
19
  end
27
- end
28
- statistics.map { |key, number| { stat_title: key, stat_number: number } }
20
+ end.values
29
21
  end
30
22
 
31
- # Public: returns a collection of stats (Hash) for the Participatory Space Home.
32
- def collection
33
- highlighted_stats = participatory_space_participants_stats
34
- highlighted_stats.concat(participatory_space_followers_stats(priority: StatsRegistry::HIGH_PRIORITY))
35
- highlighted_stats.concat(component_stats(priority: StatsRegistry::HIGH_PRIORITY))
36
- highlighted_stats.concat(component_stats(priority: StatsRegistry::MEDIUM_PRIORITY))
37
- highlighted_stats.concat(comments_stats(participatory_space_sym))
38
- highlighted_stats = highlighted_stats.reject(&:empty?)
39
- highlighted_stats = highlighted_stats.reject { |_stat_manifest, _stat_title, stat_number| stat_number.zero? }
40
- grouped_highlighted_stats = highlighted_stats.group_by(&:first)
41
-
42
- statistics(grouped_highlighted_stats)
23
+ def all_stats(conditions)
24
+ @global_stats ||= {}
25
+ @global_stats[conditions] ||= global_stats(**conditions).concat(component_stats(**conditions))
43
26
  end
44
27
 
45
- def card_collection
46
- card_stats = Decidim.stats.only([:followers_count, :votings_count])
47
- .filter(priority: StatsRegistry::HIGH_PRIORITY)
48
- .with_context(participatory_space)
49
- .map { |stat_title, stat_number| [participatory_space_sym, stat_title, stat_number] }
50
-
51
- statistics(card_stats.group_by(&:first))
52
- end
28
+ # Public: returns the entity where to limit the stats on.
29
+ # Usually, this is a Participatory Space or an Organization.
30
+ def scope_entity = raise NotImplementedError
53
31
 
54
32
  private
55
33
 
56
- def participatory_space = raise "Not implemented"
57
-
58
- def participatory_space_sym = raise "Not implemented"
59
-
60
- def participatory_space_participants_stats
61
- Decidim.stats.only([:participants_count]).with_context(participatory_space)
62
- .map { |stat_title, stat_number| [participatory_space_sym, stat_title, stat_number] }
34
+ def global_stats(conditions)
35
+ Decidim.stats.filter(**conditions).with_context(scope_entity).map do |stat|
36
+ stat[:data] = [stat[:data]] unless stat[:data].is_a?(Array)
37
+ stat
38
+ end
63
39
  end
64
40
 
65
41
  def component_stats(conditions)
66
42
  Decidim.component_manifests.map do |component_manifest|
67
- component_manifest.stats.except([:proposals_accepted])
43
+ component_manifest.stats
68
44
  .filter(conditions)
69
45
  .with_context(published_components)
70
- .map { |stat_title, stat_number| [component_manifest.name, stat_title, stat_number] }.flatten
71
- end
72
- end
73
-
74
- def participatory_space_followers_stats(conditions)
75
- Decidim.stats.only([:followers_count])
76
- .filter(conditions)
77
- .with_context(participatory_space)
78
- .map { |stat_title, stat_number| [participatory_space_sym, stat_title, stat_number] }
46
+ .map do |stat|
47
+ stat[:data] = [stat[:data]] unless stat[:data].is_a?(Array)
48
+ stat
49
+ end
50
+ end.flatten
79
51
  end
80
52
 
53
+ # Override if the scope_entity is not a Participatory Space or an Organization.
81
54
  def published_components
82
- @published_components ||= Component.where(participatory_space:).published
55
+ @published_components ||= if scope_entity.is_a?(Decidim::Organization)
56
+ scope_entity.published_components
57
+ elsif scope_entity.is_a?(Decidim::ParticipatoryProcessGroup)
58
+ Component.where(participatory_space: scope_entity.participatory_processes).published
59
+ else
60
+ Component.where(participatory_space: scope_entity).published
61
+ end
83
62
  end
84
63
  end
85
64
  end
@@ -4,11 +4,15 @@ module Decidim
4
4
  #
5
5
  # Decorator for taxonomies.
6
6
  #
7
- class TaxonomyPresenter < SimpleDelegator
7
+ class TaxonomyPresenter < ResourcePresenter
8
8
  include Decidim::TranslationsHelper
9
9
 
10
10
  def translated_name
11
11
  @translated_name ||= translated_attribute name
12
12
  end
13
+
14
+ def title(html_escape: false, all_locales: false)
15
+ super(name, html_escape, all_locales)
16
+ end
13
17
  end
14
18
  end
@@ -73,12 +73,6 @@ module Decidim
73
73
  true
74
74
  end
75
75
 
76
- def has_tooltip?
77
- return if respond_to?(:deleted?) && deleted?
78
-
79
- true
80
- end
81
-
82
76
  private
83
77
 
84
78
  def decidim
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This query counts registered users from a collection of organizations
5
+ # in an optional interval of time.
6
+ class AuthorizedUsers < Decidim::Query
7
+ def initialize(organization:, handlers: [], strict: false)
8
+ @organization = organization
9
+ @valid_types = organization.available_authorizations
10
+ @handlers = strict ? handlers : handlers&.select { |type| @valid_types.include?(type) } || []
11
+ @users = organization.users.not_deleted.not_blocked.confirmed
12
+ end
13
+
14
+ def query
15
+ return @users if @handlers.blank?
16
+
17
+ verified_users = Decidim::Authorization.select(:decidim_user_id)
18
+ .where(decidim_user_id: @users.select(:id))
19
+ .where.not(granted_at: nil)
20
+ .where(name: @handlers)
21
+ .group(:decidim_user_id)
22
+ .having("COUNT(distinct name) = ?", @handlers.count)
23
+ @users = @users.where(id: verified_users)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class InactiveUsersQuery < Decidim::Query
5
+ attr_reader :scope
6
+
7
+ def initialize(scope = Decidim::User.not_deleted)
8
+ @scope = scope
9
+ end
10
+
11
+ def for_first_warning(cutoff_date)
12
+ scope
13
+ .where("(current_sign_in_at <= :cutoff OR current_sign_in_at IS NULL) AND created_at <= :cutoff", cutoff: cutoff_date)
14
+ .where.not("extended_data ? 'inactivity_notification'")
15
+ end
16
+
17
+ def for_last_warning(cutoff_date)
18
+ scope
19
+ .where("(extended_data->'inactivity_notification'->>'notification_type') = 'first'")
20
+ .where("(extended_data->'inactivity_notification'->>'sent_at')::timestamp <= ?", cutoff_date)
21
+ .where("current_sign_in_at IS NULL OR current_sign_in_at <= (extended_data->'inactivity_notification'->>'sent_at')::timestamp")
22
+ end
23
+
24
+ def for_removal(cutoff_date)
25
+ scope
26
+ .where("(extended_data->'inactivity_notification'->>'notification_type') = 'second'")
27
+ .where("(extended_data->'inactivity_notification'->>'sent_at')::timestamp <= ?", cutoff_date)
28
+ .where("current_sign_in_at IS NULL OR current_sign_in_at <= (extended_data->'inactivity_notification'->>'sent_at')::timestamp")
29
+ end
30
+ end
31
+ end
@@ -32,7 +32,7 @@ module Decidim
32
32
  def query
33
33
  query = base_query
34
34
 
35
- query = query.where(user:) if user
35
+ query = query.where(user_id: user.id, user_type: user.class.name) if user
36
36
  query = query.where(resource_type: resource_name) if resource_name.present?
37
37
 
38
38
  query = filter_follows(query)
@@ -71,7 +71,7 @@ module Decidim
71
71
  followed_users = follows.where(decidim_followable_type: "Decidim::UserBaseEntity")
72
72
  return [] if followed_users.empty?
73
73
 
74
- [Decidim::ActionLog.arel_table[:decidim_user_id].in(followed_users.map(&:decidim_followable_id))]
74
+ [Decidim::ActionLog.arel_table[:user_id].in(followed_users.map(&:decidim_followable_id))]
75
75
  end
76
76
 
77
77
  def followed_spaces_conditions(follows)
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class StatsFollowersCount < Decidim::Query
5
+ def initialize(participatory_space)
6
+ @participatory_space = participatory_space
7
+ end
8
+
9
+ def query
10
+ space_query + components_query
11
+ end
12
+
13
+ private
14
+
15
+ attr_reader :participatory_space
16
+
17
+ def components_query
18
+ Decidim.component_manifests.sum do |component|
19
+ component.stats
20
+ .filter(tag: :followers)
21
+ .with_context(space_components)
22
+ .map { |_name, value| value }
23
+ .compact_blank
24
+ .sum
25
+ end
26
+ end
27
+
28
+ def space_query
29
+ Decidim.participatory_space_manifests.sum do |space|
30
+ space.stats
31
+ .filter(tag: :followers)
32
+ .with_context(participatory_space_items)
33
+ .map { |_name, value| value }
34
+ .compact_blank
35
+ .sum
36
+ end
37
+ end
38
+
39
+ def space_components
40
+ @space_components ||= Decidim::Component.where(participatory_space:).published
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class StatsParticipantsCount < Decidim::Query
5
+ def initialize(participatory_space)
6
+ @participatory_space = participatory_space
7
+ end
8
+
9
+ def query
10
+ [
11
+ comments_query,
12
+ debates_query,
13
+ meetings_query,
14
+ likes_query,
15
+ project_votes_query,
16
+ proposals_query,
17
+ proposal_votes_query,
18
+ survey_response_query
19
+ ].flatten.uniq.count
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :participatory_space
25
+
26
+ def comments_query
27
+ return [] unless Decidim.module_installed?(:comments)
28
+
29
+ Decidim::Comments::Comment
30
+ .where(participatory_space:)
31
+ .pluck(:decidim_author_id)
32
+ .uniq
33
+ end
34
+
35
+ def debates_query
36
+ return [] unless Decidim.module_installed?(:debates)
37
+
38
+ Decidim::Debates::Debate
39
+ .where(component: space_components, decidim_author_type: Decidim::UserBaseEntity.name)
40
+ .not_hidden
41
+ .pluck(:decidim_author_id)
42
+ .uniq
43
+ end
44
+
45
+ def meetings_query
46
+ return [] unless Decidim.module_installed?(:meetings)
47
+
48
+ meetings = Decidim::Meetings::Meeting.where(component: space_components).not_hidden
49
+ registrations = Decidim::Meetings::Registration.where(decidim_meeting_id: meetings).pluck(:decidim_user_id)
50
+ organizers = meetings.where(decidim_author_type: Decidim::UserBaseEntity.name).pluck(:decidim_author_id)
51
+
52
+ [registrations, organizers].flatten.uniq
53
+ end
54
+
55
+ def likes_query
56
+ Decidim::Like
57
+ .where(resource: space_components)
58
+ .pluck(:decidim_author_id)
59
+ .uniq
60
+ end
61
+
62
+ def proposals_query
63
+ return [] unless Decidim.module_installed?(:proposals)
64
+
65
+ Decidim::Coauthorship
66
+ .where(coauthorable: proposals_components, decidim_author_type: Decidim::UserBaseEntity.name)
67
+ .pluck(:decidim_author_id)
68
+ .uniq
69
+ end
70
+
71
+ def proposal_votes_query
72
+ return [] unless Decidim.module_installed?(:proposals)
73
+
74
+ Decidim::Proposals::ProposalVote
75
+ .where(proposal: proposals_components)
76
+ .final
77
+ .pluck(:decidim_author_id)
78
+ .uniq
79
+ end
80
+
81
+ def project_votes_query
82
+ return [] unless Decidim.module_installed?(:budgets)
83
+
84
+ Decidim::Budgets::Order.joins(budget: [:component])
85
+ .where(budget: { decidim_components: { id: space_components.pluck(:id) } })
86
+ .pluck(:decidim_user_id)
87
+ .uniq
88
+ end
89
+
90
+ def survey_response_query
91
+ Decidim::Forms::Response.newsletter_participant_ids(space_components)
92
+ end
93
+
94
+ def space_components
95
+ @space_components ||= Decidim::Component.where(participatory_space:).published
96
+ end
97
+
98
+ def proposals_components
99
+ @proposals_components ||= Decidim::Proposals::FilteredProposals.for(space_components).published.not_hidden
100
+ end
101
+ end
102
+ end
@@ -19,11 +19,7 @@ module Decidim
19
19
  profile_url: presented.profile_url,
20
20
  direct_messages_enabled: (resource.direct_message_types != "followed-only"),
21
21
  deleted: presented.deleted?,
22
- badge: presented.badge,
23
- groups: {
24
- id: resource.accepted_user_groups.collect(&:id),
25
- name: resource.accepted_user_groups.collect(&:name)
26
- }
22
+ badge: presented.badge
27
23
  }
28
24
  end
29
25
 
@@ -25,7 +25,6 @@ module Decidim
25
25
  updated_at: resource.updated_at,
26
26
  published_at: resource.published_at,
27
27
  follows_count: resource.follows_count,
28
- hashtag: resource.hashtag,
29
28
  short_description: resource.short_description,
30
29
  description: resource.description,
31
30
  promoted: resource.promoted
@@ -45,7 +45,8 @@ module Decidim
45
45
  # Returns the newly created `Decidim::ActionLog` resource.
46
46
  def log!
47
47
  Decidim::ActionLog.create!(
48
- user:,
48
+ user_id: user.id,
49
+ user_type: user.class.name,
49
50
  organization:,
50
51
  action:,
51
52
  resource:,
@@ -82,22 +82,6 @@ module Decidim
82
82
  diff
83
83
  end
84
84
 
85
- def parse_user_group_changeset(attribute, values, type, diff)
86
- return unless diff
87
-
88
- old_user_group = Decidim::UserGroup.find_by(id: values[0])
89
- new_user_group = Decidim::UserGroup.find_by(id: values[1])
90
-
91
- diff.update(
92
- attribute => {
93
- type:,
94
- label: I18n.t(attribute, scope: i18n_scope),
95
- old_value: old_user_group ? translated_attribute(old_user_group.name) : "",
96
- new_value: new_user_group ? translated_attribute(new_user_group.name) : ""
97
- }
98
- )
99
- end
100
-
101
85
  def parse_scope_changeset(attribute, values, type, diff)
102
86
  return unless diff
103
87
 
@@ -118,7 +102,6 @@ module Decidim
118
102
  return parse_i18n_changeset(attribute, values, type, diff) if [:i18n, :i18n_html].include?(type)
119
103
 
120
104
  return parse_scope_changeset(attribute, values, type, diff) if type == :scope
121
- return parse_user_group_changeset(attribute, values, type, diff) if type == :user_group
122
105
 
123
106
  diff.update(
124
107
  attribute => {
@@ -171,6 +171,10 @@ module Decidim
171
171
  EngineRouter.main_proxy(component).root_path
172
172
  end
173
173
 
174
+ def authorization_path
175
+ @authorization_path ||= onboarding_data["authorization_path"].presence
176
+ end
177
+
174
178
  def expired?
175
179
  return unless ephemeral?
176
180
 
@@ -60,7 +60,7 @@ module Decidim
60
60
  collection = export_manifest.collection.call(organization)
61
61
  exporter = Decidim::Exporters::CSV.new(collection, export_manifest.serializer)
62
62
 
63
- get_help_definition(:core, exporter, export_manifest) unless collection.empty?
63
+ get_help_definition(:core, exporter, export_manifest, collection.count) unless collection.empty?
64
64
 
65
65
  exporter.export
66
66
  end
@@ -98,7 +98,8 @@ module Decidim
98
98
 
99
99
  collection.push(filename)
100
100
 
101
- get_help_definition(:components, exporter, export_manifest) unless collection.empty?
101
+ collection_count = exported.read.split("\n").count - 1
102
+ get_help_definition(:components, exporter, export_manifest, collection_count) unless collection.empty?
102
103
  end
103
104
  end
104
105
  end
@@ -121,22 +122,26 @@ module Decidim
121
122
  end
122
123
  serializer = export_manifest.open_data_serializer.nil? ? export_manifest.serializer : export_manifest.open_data_serializer
123
124
  exporter = Decidim::Exporters::CSV.new(collection, serializer)
124
- get_help_definition(:spaces, exporter, export_manifest) unless collection.empty?
125
+ get_help_definition(:spaces, exporter, export_manifest, collection.count) unless collection.empty?
125
126
 
126
127
  exporter.export
127
128
  end
128
129
 
129
- def get_help_definition(manifest_type, exporter, export_manifest)
130
+ def get_help_definition(manifest_type, exporter, export_manifest, collection_count)
130
131
  help_definition[manifest_type] = {} if help_definition[manifest_type].nil?
131
132
  help_definition[manifest_type][export_manifest.name] = {} if help_definition[manifest_type][export_manifest.name].blank?
133
+ help_definition[manifest_type][export_manifest.name][:headers] = {} if help_definition[manifest_type][export_manifest.name][:headers].blank?
132
134
  exporter.headers_without_locales.each do |header|
133
- help_definition[manifest_type][export_manifest.name][header] = I18n.t("decidim.open_data.help.#{export_manifest.name}.#{header}")
135
+ help_definition[manifest_type][export_manifest.name][:headers][header] = I18n.t("decidim.open_data.help.#{export_manifest.name}.#{header}")
134
136
  end
137
+ help_definition[manifest_type][export_manifest.name][:collection_count] = 0 if help_definition[manifest_type][export_manifest.name][:collection_count].nil?
138
+ help_definition[manifest_type][export_manifest.name][:collection_count] += collection_count
135
139
  end
136
140
 
137
141
  def readme
138
142
  "# #{I18n.t("decidim.open_data.help.core.title", organization: translated_attribute(organization.name))}\n\n
139
143
  #{I18n.t("decidim.open_data.help.core.description")}\n\n
144
+ #{I18n.t("decidim.open_data.help.core.generated_on_date", date: I18n.l(Time.current, format: :decidim_short))}\n\n
140
145
  #{core_readme}
141
146
  #{space_readme}
142
147
  #{component_readme}
@@ -147,8 +152,9 @@ module Decidim
147
152
  return unless help_definition.fetch(:core, false)
148
153
 
149
154
  readme_file = "## #{I18n.t("decidim.open_data.help.core.main")}\n\n"
150
- help_definition.fetch(:core, []).each do |element, headers|
151
- readme_file << "### #{element}\n\n"
155
+ help_definition.fetch(:core, []).each do |element, metadata|
156
+ headers = metadata[:headers]
157
+ readme_file << "### #{element} (#{I18n.t("decidim.open_data.help.core.resources", count: metadata[:collection_count])})\n\n"
152
158
 
153
159
  headers.each do |header, help_value|
154
160
  readme_file << "* #{header}: #{help_value}\n"
@@ -164,8 +170,9 @@ module Decidim
164
170
 
165
171
  readme_file = "## #{I18n.t("decidim.open_data.help.core.spaces")}\n\n"
166
172
 
167
- help_definition.fetch(:spaces, []).each do |space, headers|
168
- readme_file << "### #{space}\n\n"
173
+ help_definition.fetch(:spaces, []).each do |space, metadata|
174
+ headers = metadata[:headers]
175
+ readme_file << "### #{space} (#{I18n.t("decidim.open_data.help.core.resources", count: metadata[:collection_count])})\n\n"
169
176
 
170
177
  headers.each do |header, help_value|
171
178
  readme_file << "* #{header}: #{help_value}\n"
@@ -181,8 +188,9 @@ module Decidim
181
188
 
182
189
  readme_file = "## #{I18n.t("decidim.open_data.help.core.components")}\n\n"
183
190
 
184
- help_definition.fetch(:components, []).each do |component, headers|
185
- readme_file << "### #{component}\n\n"
191
+ help_definition.fetch(:components, []).each do |component, metadata|
192
+ headers = metadata[:headers]
193
+ readme_file << "### #{component} (#{I18n.t("decidim.open_data.help.core.resources", count: metadata[:collection_count])})\n\n"
186
194
 
187
195
  headers.each do |header, help_value|
188
196
  readme_file << "* #{header}: #{help_value}\n"
@@ -19,7 +19,8 @@ module Decidim
19
19
  #
20
20
  # @return [Array<Net::HTTPCreated>, nil] the result of the dispatch or nil if user or subscription are empty
21
21
  def perform(notification, title = nil)
22
- return unless Rails.application.secrets.dig(:vapid, :enabled)
22
+ return if Decidim.vapid_public_key.blank?
23
+
23
24
  raise ArgumentError, "Need to provide a title if the notification is a PushNotificationMessage" if notification.is_a?(Decidim::PushNotificationMessage) && title.nil?
24
25
 
25
26
  user = notification.user
@@ -66,8 +67,8 @@ module Decidim
66
67
  p256dh: subscription["p256dh"],
67
68
  auth: subscription["auth"],
68
69
  vapid: {
69
- public_key: Rails.application.secrets.vapid[:public_key],
70
- private_key: Rails.application.secrets.vapid[:private_key]
70
+ public_key: Decidim.vapid_public_key,
71
+ private_key: Decidim.vapid_private_key
71
72
  }
72
73
  }
73
74
  end
@@ -127,7 +127,7 @@ module Decidim
127
127
  end
128
128
 
129
129
  def log(action, user, resource, extra_log_info = {})
130
- return unless user.is_a?(Decidim::User)
130
+ return unless user.is_a?(Decidim::UserBaseEntity)
131
131
  # If the record is not valid, it may not yet have an ID causing an
132
132
  # exception when trying to save the log record.
133
133
  return if resource.nil?