decidim-core 0.30.2 → 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 (774) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -4
  3. data/app/cells/decidim/activity_cell.rb +0 -3
  4. data/app/cells/decidim/address/show.erb +1 -0
  5. data/app/cells/decidim/address_cell.rb +7 -1
  6. data/app/cells/decidim/amendable/amend_button_card/show.erb +2 -2
  7. data/app/cells/decidim/author/likes.erb +4 -0
  8. data/app/cells/decidim/author/show.erb +1 -3
  9. data/app/cells/decidim/author_cell.rb +5 -28
  10. data/app/cells/decidim/badge_cell.rb +1 -7
  11. data/app/cells/decidim/card_cell.rb +2 -12
  12. data/app/cells/decidim/card_metadata_cell.rb +4 -4
  13. data/app/cells/decidim/coauthorships_cell.rb +1 -1
  14. data/app/cells/decidim/collapsible_authors/show.erb +1 -1
  15. data/app/cells/decidim/content_blocks/hero_cell.rb +23 -4
  16. data/app/cells/decidim/content_blocks/hero_settings_form/show.erb +16 -2
  17. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +6 -6
  18. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +28 -1
  19. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form/show.erb +27 -0
  20. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form_cell.rb +13 -0
  21. data/app/cells/decidim/content_blocks/highlighted_elements_for_component_settings_form/show.erb +9 -2
  22. data/app/cells/decidim/content_blocks/html_settings_form/show.erb +3 -1
  23. data/app/cells/decidim/content_blocks/last_activity_cell.rb +1 -1
  24. data/app/cells/decidim/content_blocks/last_activity_settings_form/show.erb +3 -1
  25. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity_cell.rb +1 -1
  26. data/app/cells/decidim/content_blocks/participatory_space_extra_data/recent_users.erb +1 -1
  27. data/app/cells/decidim/content_blocks/participatory_space_hero/show.erb +0 -5
  28. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +1 -13
  29. data/app/cells/decidim/content_blocks/participatory_space_hero_settings_form/show.erb +10 -3
  30. data/app/cells/decidim/content_blocks/participatory_space_last_activity/content.erb +1 -1
  31. data/app/cells/decidim/content_blocks/participatory_space_last_activity/recent_avatars.erb +1 -1
  32. data/app/cells/decidim/content_blocks/participatory_space_last_activity_cell.rb +3 -3
  33. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +17 -5
  34. data/app/cells/decidim/content_blocks/participatory_space_main_data_cell.rb +4 -0
  35. data/app/cells/decidim/content_blocks/stats/show.erb +2 -3
  36. data/app/cells/decidim/data_consent/modal.erb +1 -1
  37. data/app/cells/decidim/like_block/show.erb +3 -0
  38. data/app/cells/decidim/{endorsement_block_cell.rb → like_block_cell.rb} +2 -2
  39. data/app/cells/decidim/like_buttons/button_content.erb +2 -0
  40. data/app/cells/decidim/like_buttons/show.erb +17 -0
  41. data/app/cells/decidim/{endorsement_buttons → like_buttons}/verification_modal.erb +3 -3
  42. data/app/cells/decidim/like_buttons_cell.rb +77 -0
  43. data/app/cells/decidim/likers_list/empty.erb +3 -0
  44. data/app/cells/decidim/{endorsers_list → likers_list}/full.erb +3 -3
  45. data/app/cells/decidim/likers_list/show.erb +20 -0
  46. data/app/cells/decidim/likers_list_cell.rb +64 -0
  47. data/app/cells/decidim/nav_links/show.erb +1 -1
  48. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  49. data/app/cells/decidim/onboarding_action_message_cell.rb +1 -1
  50. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +0 -8
  51. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +0 -8
  52. data/app/cells/decidim/profile/details.erb +1 -1
  53. data/app/cells/decidim/profile/tabs.erb +1 -1
  54. data/app/cells/decidim/profile_actions/show.erb +0 -1
  55. data/app/cells/decidim/profile_actions_cell.rb +5 -91
  56. data/app/cells/decidim/profile_cell.rb +4 -39
  57. data/app/cells/decidim/report_button/content.erb +2 -0
  58. data/app/cells/decidim/report_button/flag_modal.erb +1 -1
  59. data/app/cells/decidim/report_button_cell.rb +1 -1
  60. data/app/cells/decidim/report_user_button/flag_modal.erb +1 -1
  61. data/app/cells/decidim/resource_history_cell.rb +2 -1
  62. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  63. data/app/cells/decidim/share_button_cell.rb +1 -1
  64. data/app/cells/decidim/share_text_widget/modal.erb +16 -0
  65. data/app/cells/decidim/share_text_widget/show.erb +2 -0
  66. data/app/cells/decidim/share_text_widget_cell.rb +27 -0
  67. data/app/cells/decidim/share_widget/modal.erb +19 -8
  68. data/app/cells/decidim/share_widget/qr_code_modal.erb +26 -0
  69. data/app/cells/decidim/share_widget/show.erb +1 -0
  70. data/app/cells/decidim/share_widget_cell.rb +10 -6
  71. data/app/cells/decidim/statistic/show.erb +23 -5
  72. data/app/cells/decidim/statistic_cell.rb +28 -3
  73. data/app/cells/decidim/tab_panels/show.erb +1 -1
  74. data/app/cells/decidim/user_profile/show.erb +1 -1
  75. data/app/cells/decidim/user_profile_cell.rb +1 -9
  76. data/app/cells/decidim/version_author_cell.rb +0 -7
  77. data/app/commands/decidim/amendable/accept.rb +1 -3
  78. data/app/commands/decidim/amendable/create_draft.rb +2 -3
  79. data/app/commands/decidim/amendable/update_draft.rb +2 -3
  80. data/app/commands/decidim/create_ephemeral_user.rb +7 -1
  81. data/app/commands/decidim/create_omniauth_registration.rb +8 -7
  82. data/app/commands/decidim/create_report.rb +9 -1
  83. data/app/commands/decidim/destroy_account.rb +0 -5
  84. data/app/commands/decidim/like_resource.rb +52 -0
  85. data/app/commands/decidim/messaging/reply_to_conversation.rb +2 -21
  86. data/app/commands/decidim/messaging/start_conversation.rb +2 -21
  87. data/app/commands/decidim/unlike_resource.rb +34 -0
  88. data/app/commands/decidim/update_account.rb +1 -1
  89. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +6 -2
  90. data/app/controllers/concerns/decidim/user_profile.rb +0 -1
  91. data/app/controllers/decidim/account_controller.rb +1 -1
  92. data/app/controllers/decidim/amendments_controller.rb +4 -5
  93. data/app/controllers/decidim/application_controller.rb +2 -1
  94. data/app/controllers/decidim/devise/confirmations_controller.rb +0 -5
  95. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -1
  96. data/app/controllers/decidim/devise/passwords_controller.rb +1 -1
  97. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  98. data/app/controllers/decidim/doorkeeper/authorizations_controller.rb +19 -1
  99. data/app/controllers/decidim/download_your_data_controller.rb +2 -2
  100. data/app/controllers/decidim/likes_controller.rb +57 -0
  101. data/app/controllers/decidim/links_controller.rb +1 -0
  102. data/app/controllers/decidim/messaging/conversations_controller.rb +1 -8
  103. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  104. data/app/controllers/decidim/notifications_settings_controller.rb +2 -2
  105. data/app/controllers/decidim/pages_controller.rb +0 -1
  106. data/app/controllers/decidim/profiles_controller.rb +2 -57
  107. data/app/controllers/decidim/qr_controller.rb +73 -0
  108. data/app/controllers/decidim/resource_autocomplete_controller.rb +56 -0
  109. data/app/controllers/decidim/user_activities_controller.rb +0 -1
  110. data/app/events/decidim/resource_liked_event.rb +36 -0
  111. data/app/forms/decidim/amendable/create_form.rb +0 -1
  112. data/app/forms/decidim/amendable/edit_form.rb +0 -1
  113. data/app/forms/decidim/amendable/form.rb +4 -4
  114. data/app/forms/decidim/ephemeral_user_form.rb +1 -0
  115. data/app/forms/decidim/notifications_settings_form.rb +1 -1
  116. data/app/forms/decidim/omniauth_registration_form.rb +1 -1
  117. data/app/forms/decidim/upload_validation_form.rb +9 -1
  118. data/app/helpers/decidim/amendments_helper.rb +1 -2
  119. data/app/helpers/decidim/animations_helper.rb +14 -0
  120. data/app/helpers/decidim/decidim_form_helper.rb +17 -6
  121. data/app/helpers/decidim/layout_helper.rb +1 -15
  122. data/app/helpers/decidim/likeable_helper.rb +46 -0
  123. data/app/helpers/decidim/messaging/conversation_helper.rb +1 -1
  124. data/app/helpers/decidim/omniauth_helper.rb +1 -1
  125. data/app/helpers/decidim/qr_code_helper.rb +37 -0
  126. data/app/helpers/decidim/rich_text_editor_helper.rb +0 -1
  127. data/app/helpers/decidim/sanitize_helper.rb +5 -5
  128. data/app/helpers/decidim/social_share_button_helper.rb +11 -10
  129. data/app/jobs/decidim/delete_inactive_participants_job.rb +41 -0
  130. data/app/jobs/decidim/process_inactive_participant_job.rb +48 -0
  131. data/app/mailers/decidim/participants_account_mailer.rb +38 -0
  132. data/app/mailers/decidim/user_group_mailer.rb +28 -0
  133. data/app/models/decidim/action_log.rb +3 -5
  134. data/app/models/decidim/amendment.rb +1 -1
  135. data/app/models/decidim/attachment_collection.rb +2 -0
  136. data/app/models/decidim/authorization_transfer.rb +0 -1
  137. data/app/models/decidim/coauthorship.rb +1 -1
  138. data/app/models/decidim/component.rb +4 -1
  139. data/app/models/decidim/{endorsement.rb → like.rb} +4 -4
  140. data/app/models/decidim/messaging/conversation.rb +3 -5
  141. data/app/models/decidim/messaging/message.rb +3 -15
  142. data/app/models/decidim/omniauth_provider.rb +1 -1
  143. data/app/models/decidim/organization.rb +3 -8
  144. data/app/models/decidim/participatory_space_role_config/{valuator.rb → evaluator.rb} +1 -1
  145. data/app/models/decidim/reminder_record.rb +1 -1
  146. data/app/models/decidim/searchable_resource.rb +16 -0
  147. data/app/models/decidim/taxonomy.rb +6 -1
  148. data/app/models/decidim/user.rb +32 -15
  149. data/app/models/decidim/user_base_entity.rb +2 -2
  150. data/app/packs/entrypoints/decidim_conference_diploma.scss +2 -2
  151. data/app/packs/entrypoints/decidim_core.scss +2 -2
  152. data/app/packs/entrypoints/decidim_editor.js +0 -4
  153. data/app/packs/entrypoints/decidim_map.scss +2 -2
  154. data/app/packs/entrypoints/decidim_overrides.scss +1 -1
  155. data/app/packs/entrypoints/decidim_qr.js +1 -0
  156. data/app/packs/images/decidim/remixicon.symbol.svg +3 -3
  157. data/app/packs/src/decidim/a11y.js +1 -120
  158. data/app/packs/src/decidim/append_redirect_url_to_modals.js +1 -1
  159. data/app/packs/src/decidim/attachments/file_or_link_tabs.js +1 -1
  160. data/app/packs/src/decidim/confirm.js +27 -20
  161. data/app/packs/src/decidim/controllers/.keep +0 -0
  162. data/app/packs/src/decidim/controllers/accordion/controller.js +100 -0
  163. data/app/packs/src/decidim/controllers/account_form/account_form.test.js +423 -0
  164. data/app/packs/src/decidim/controllers/account_form/controller.js +69 -0
  165. data/app/packs/src/decidim/{input_character_counter.js → controllers/character_counter/controller.js} +90 -106
  166. data/app/packs/src/decidim/controllers/clipboard_copy/clipboard_copy.test.js +305 -0
  167. data/app/packs/src/decidim/controllers/clipboard_copy/controller.js +403 -0
  168. data/app/packs/src/decidim/controllers/date_picker/controller.js +12 -0
  169. data/app/packs/src/decidim/controllers/delete_account_form/controller.js +45 -0
  170. data/app/packs/src/decidim/controllers/delete_account_form/delete_account_form.test.js +216 -0
  171. data/app/packs/src/decidim/controllers/dropdown/controller.js +125 -0
  172. data/app/packs/src/decidim/controllers/editor/controller.js +8 -0
  173. data/app/packs/src/decidim/controllers/emoji/controller.js +26 -0
  174. data/app/packs/src/decidim/{input_emoji.js → controllers/emoji/emoji.js} +1 -15
  175. data/app/packs/src/decidim/{form_filter.js → controllers/form_filter/controller.js} +68 -51
  176. data/app/packs/src/decidim/controllers/form_filter/form_filter.test.js +648 -0
  177. data/app/packs/src/decidim/controllers/form_validator/controller.js +23 -0
  178. data/app/packs/src/decidim/controllers/form_validator/form_validator.js +789 -0
  179. data/app/packs/src/decidim/controllers/form_validator/form_validator.test.js +685 -0
  180. data/app/packs/src/decidim/controllers/impersonation_warning/controller.js +137 -0
  181. data/app/packs/src/decidim/controllers/impersonation_warning/impersonation.test.js +382 -0
  182. data/app/packs/src/decidim/controllers/input_tags/controller.js +28 -0
  183. data/app/packs/src/decidim/controllers/mention/controller.js +243 -0
  184. data/app/packs/src/decidim/controllers/mention/input_mentions.test.js +562 -0
  185. data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +215 -0
  186. data/app/packs/src/decidim/controllers/multiple_mentions/input_multiple_mentions.test.js +645 -0
  187. data/app/packs/src/decidim/controllers/notification_action/controller.js +210 -0
  188. data/app/packs/src/decidim/controllers/notification_action/notification_action.test.js +388 -0
  189. data/app/packs/src/decidim/controllers/password_toggler/controller.js +232 -0
  190. data/app/packs/src/decidim/controllers/password_toggler/password_toggler.test.js +229 -0
  191. data/app/packs/src/decidim/controllers/report_form/controller.js +184 -0
  192. data/app/packs/src/decidim/controllers/report_form/report_form_manager.test.js +511 -0
  193. data/app/packs/src/decidim/controllers/scroll_to_last/controller.js +9 -0
  194. data/app/packs/src/decidim/controllers/scroll_to_last/scroll_to_last_child.test.js +225 -0
  195. data/app/packs/src/decidim/controllers/sticky_buttons/controller.js +55 -0
  196. data/app/packs/src/decidim/controllers/sticky_buttons/sticky_buttons.test.js +334 -0
  197. data/app/packs/src/decidim/controllers/sticky_header/controller.js +116 -0
  198. data/app/packs/src/decidim/controllers/sticky_header/sticky_header.test.js +320 -0
  199. data/app/packs/src/decidim/controllers/toggle/controller.js +111 -0
  200. data/app/packs/src/decidim/controllers/toggle/toggle.test.js +260 -0
  201. data/app/packs/src/decidim/controllers/tooltip/controller.js +287 -0
  202. data/app/packs/src/decidim/controllers/tooltip/tooltip.test.js +380 -0
  203. data/app/packs/src/decidim/controllers/user_registration_form/controller.js +160 -0
  204. data/app/packs/src/decidim/controllers/user_registration_form/omniauth_registration_form.test.js +441 -0
  205. data/app/packs/src/decidim/controllers/user_registration_form/user_registration_form.test.js +386 -0
  206. data/app/packs/src/decidim/data_consent/index.js +1 -1
  207. data/app/packs/src/decidim/datalist_select.js +1 -1
  208. data/app/packs/src/decidim/datepicker/form_datepicker.js +1 -1
  209. data/app/packs/src/decidim/datepicker/generate_datepicker.js +2 -2
  210. data/app/packs/src/decidim/datepicker/generate_timepicker.js +2 -2
  211. data/app/packs/src/decidim/direct_uploads/upload_field.js +3 -5
  212. data/app/packs/src/decidim/direct_uploads/upload_modal.js +1 -1
  213. data/app/packs/src/decidim/dropdown_menu.js +1 -1
  214. data/app/packs/src/decidim/editor/common/input_dialog.js +1 -1
  215. data/app/packs/src/decidim/editor/common/suggestion.js +10 -2
  216. data/app/packs/src/decidim/editor/common/upload_dialog.js +1 -1
  217. data/app/packs/src/decidim/editor/extensions/decidim_kit/index.js +7 -7
  218. data/app/packs/src/decidim/editor/extensions/emoji/index.js +2 -3
  219. data/app/packs/src/decidim/editor/extensions/image/index.js +1 -1
  220. data/app/packs/src/decidim/editor/extensions/image/node_view.js +1 -1
  221. data/app/packs/src/decidim/editor/extensions/link/bubble_menu.js +1 -1
  222. data/app/packs/src/decidim/editor/extensions/link/index.js +1 -1
  223. data/app/packs/src/decidim/editor/extensions/mention/index.js +1 -2
  224. data/app/packs/src/decidim/editor/extensions/mention_resource/index.js +69 -0
  225. data/app/packs/src/decidim/editor/extensions/video_embed/index.js +1 -1
  226. data/app/packs/src/decidim/editor/index.js +6 -5
  227. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +1 -2
  228. data/app/packs/src/decidim/editor/test/extensions/emoji.test.js +17 -0
  229. data/app/packs/src/decidim/editor/test/extensions/heading.test.js +2 -2
  230. data/app/packs/src/decidim/editor/toolbar.js +1 -1
  231. data/app/packs/src/decidim/form_attachments.js +1 -1
  232. data/app/packs/src/decidim/geocoding/attach_input.js +3 -0
  233. data/app/packs/src/decidim/geocoding/provider/here.js +1 -1
  234. data/app/packs/src/decidim/geocoding/provider/photon.js +1 -1
  235. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +2 -2
  236. data/app/packs/src/decidim/geocoding.js +2 -2
  237. data/app/packs/src/decidim/index.js +127 -95
  238. data/app/packs/src/decidim/map/integration/forms.js +1 -1
  239. data/app/packs/src/decidim/map/legacy.js +1 -1
  240. data/app/packs/src/decidim/map/provider/default.js +1 -1
  241. data/app/packs/src/decidim/map/provider/here.js +1 -1
  242. data/app/packs/src/decidim/map.js +1 -1
  243. data/app/packs/src/decidim/{external_link.js → refactor/implementation/external_link.js} +1 -1
  244. data/app/packs/src/decidim/{onboarding_pending_action.js → refactor/integration/onboarding_pending_action.js} +4 -4
  245. data/app/packs/src/decidim/{check_boxes_tree.js → refactor/moved/check_boxes_tree.js} +24 -9
  246. data/app/packs/src/decidim/{i18n.test.js → refactor/moved/i18n.test.js} +1 -1
  247. data/app/packs/src/decidim/{icon.js → refactor/moved/icon.js} +2 -0
  248. data/app/packs/src/decidim/refactor/support/stimulus.js +39 -0
  249. data/app/packs/src/decidim/refactor/test/configuration.test.js +360 -0
  250. data/app/packs/src/decidim/{external_domain_warning.test.js → refactor/test/external_domain_warning.test.js} +1 -1
  251. data/app/packs/src/decidim/{external_link.test.js → refactor/test/external_link.test.js} +1 -1
  252. data/app/packs/src/decidim/results_listing.js +2 -2
  253. data/app/packs/src/decidim/security/selfxss_warning.js +1 -1
  254. data/app/packs/src/decidim/session_timeouter.js +1 -1
  255. data/app/packs/src/decidim/sw/push-permissions.js +1 -1
  256. data/app/packs/src/decidim/utilities/dom.js +1 -1
  257. data/app/packs/stylesheets/decidim/_accordion.scss +37 -3
  258. data/app/packs/stylesheets/decidim/_author.scss +0 -21
  259. data/app/packs/stylesheets/decidim/_buttons.scss +4 -0
  260. data/app/packs/stylesheets/decidim/_callout.scss +1 -1
  261. data/app/packs/stylesheets/decidim/_cards.scss +1 -1
  262. data/app/packs/stylesheets/decidim/_content_blocks.scss +1 -1
  263. data/app/packs/stylesheets/decidim/_cookies.scss +1 -1
  264. data/app/packs/stylesheets/decidim/_datepicker.scss +0 -4
  265. data/app/packs/stylesheets/decidim/_dropdown.scss +56 -19
  266. data/app/packs/stylesheets/decidim/_forms.scss +6 -6
  267. data/app/packs/stylesheets/decidim/_header.scss +17 -1
  268. data/app/packs/stylesheets/decidim/_labels.scss +1 -1
  269. data/app/packs/stylesheets/decidim/_layout.scss +12 -2
  270. data/app/packs/stylesheets/decidim/{_endorsers_list.scss → _likes_list.scss} +1 -1
  271. data/app/packs/stylesheets/decidim/_modal.scss +5 -1
  272. data/app/packs/stylesheets/decidim/_modal_share.scss +83 -9
  273. data/app/packs/stylesheets/decidim/_modal_update.scss +1 -5
  274. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +1 -1
  275. data/app/packs/stylesheets/decidim/_rich_text.scss +13 -0
  276. data/app/packs/stylesheets/decidim/_statistics.scss +35 -3
  277. data/app/packs/stylesheets/decidim/_tooltip.scss +1 -1
  278. data/app/packs/stylesheets/decidim/_typography.scss +6 -0
  279. data/app/packs/stylesheets/decidim/_wizard_steps.scss +1 -1
  280. data/app/packs/stylesheets/decidim/application.scss +76 -76
  281. data/app/packs/stylesheets/decidim/editor.scss +11 -12
  282. data/app/packs/stylesheets/decidim/legacy/email.scss +6 -5
  283. data/app/packs/stylesheets/decidim/map.scss +5 -3
  284. data/app/packs/stylesheets/decidim/qr.scss +65 -0
  285. data/app/permissions/decidim/default_permissions.rb +16 -0
  286. data/app/permissions/decidim/permissions.rb +5 -26
  287. data/app/presenters/decidim/admin_log/base_user_presenter.rb +2 -2
  288. data/app/presenters/decidim/admin_log/organization_presenter.rb +0 -15
  289. data/app/presenters/decidim/home_stats_presenter.rb +4 -54
  290. data/app/presenters/decidim/log/base_presenter.rb +1 -1
  291. data/app/presenters/decidim/menu_item_presenter.rb +10 -3
  292. data/app/presenters/decidim/official_author_presenter.rb +0 -4
  293. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +0 -4
  294. data/app/presenters/decidim/resource_locator_presenter.rb +15 -4
  295. data/app/presenters/decidim/resource_presenter.rb +8 -8
  296. data/app/presenters/decidim/stats_presenter.rb +39 -60
  297. data/app/presenters/decidim/taxonomy_presenter.rb +5 -1
  298. data/app/presenters/decidim/user_presenter.rb +0 -6
  299. data/app/queries/decidim/authorized_users.rb +26 -0
  300. data/app/queries/decidim/inactive_users_query.rb +31 -0
  301. data/app/queries/decidim/public_activities.rb +2 -2
  302. data/app/queries/decidim/stats_followers_count.rb +43 -0
  303. data/app/queries/decidim/stats_participants_count.rb +102 -0
  304. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +1 -5
  305. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +0 -1
  306. data/app/services/decidim/action_logger.rb +2 -1
  307. data/app/services/decidim/base_diff_renderer.rb +0 -17
  308. data/app/services/decidim/onboarding_manager.rb +4 -0
  309. data/app/services/decidim/open_data_exporter.rb +19 -11
  310. data/app/services/decidim/send_push_notification.rb +4 -3
  311. data/app/services/decidim/traceability.rb +1 -1
  312. data/app/validators/etiquette_validator.rb +7 -0
  313. data/app/validators/translated_etiquette_validator.rb +1 -0
  314. data/app/views/decidim/account/_old_password_field.html.erb +1 -1
  315. data/app/views/decidim/account/_password_fields.html.erb +1 -1
  316. data/app/views/decidim/account/delete.html.erb +1 -1
  317. data/app/views/decidim/account/show.html.erb +3 -3
  318. data/app/views/decidim/amendments/edit_draft.html.erb +0 -4
  319. data/app/views/decidim/amendments/new.html.erb +0 -4
  320. data/app/views/decidim/amendments/preview_draft.html.erb +1 -1
  321. data/app/views/decidim/application/_accordion_section.html.erb +1 -1
  322. data/app/views/decidim/application/_collection.html.erb +1 -1
  323. data/app/views/decidim/application/_radio_accordion.html.erb +30 -0
  324. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +1 -1
  325. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +1 -1
  326. data/app/views/decidim/devise/registrations/new.html.erb +1 -1
  327. data/app/views/decidim/devise/shared/_links.html.erb +1 -1
  328. data/app/views/decidim/doorkeeper/authorizations/new.html.erb +39 -8
  329. data/app/views/decidim/errors/internal_server_error.html.erb +1 -0
  330. data/app/views/decidim/likes/update_buttons_and_counters.js.erb +21 -0
  331. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +2 -2
  332. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +1 -1
  333. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  334. data/app/views/decidim/messaging/conversations/create.js.erb +0 -1
  335. data/app/views/decidim/messaging/conversations/new.html.erb +1 -1
  336. data/app/views/decidim/messaging/conversations/show.html.erb +1 -1
  337. data/app/views/decidim/notifications_settings/show.html.erb +3 -3
  338. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  339. data/app/views/decidim/pages/index.html.erb +1 -1
  340. data/app/views/decidim/participants_account_mailer/inactivity_notification.html.erb +13 -0
  341. data/app/views/decidim/participants_account_mailer/removal_notification.html.erb +11 -0
  342. data/app/views/decidim/profiles/show.html.erb +1 -1
  343. data/app/views/decidim/qr/show.html.erb +28 -0
  344. data/app/views/decidim/searches/_filters.html.erb +18 -2
  345. data/app/views/decidim/searches/index.html.erb +5 -2
  346. data/app/views/decidim/shared/_confirm_modal.html.erb +5 -3
  347. data/app/views/decidim/shared/_filters.html.erb +2 -2
  348. data/app/views/decidim/shared/_orders.html.erb +1 -1
  349. data/app/views/decidim/shared/_resource_actions.html.erb +8 -5
  350. data/app/views/decidim/user_activities/index.html.erb +1 -1
  351. data/app/views/decidim/user_group_mailer/notify_deprecation_to_member.html.erb +15 -0
  352. data/app/views/decidim/user_group_mailer/notify_deprecation_to_owner.html.erb +22 -0
  353. data/app/views/layouts/decidim/_head.html.erb +15 -12
  354. data/app/views/layouts/decidim/_impersonation_warning.html.erb +1 -1
  355. data/app/views/layouts/decidim/_js_configuration.html.erb +17 -19
  356. data/app/views/layouts/decidim/_meta_tags_context.html.erb +3 -0
  357. data/app/views/layouts/decidim/_offline_banner.html.erb +1 -1
  358. data/app/views/layouts/decidim/_wrapper.html.erb +8 -6
  359. data/app/views/layouts/decidim/footer/_focus_mode_main.html.erb +7 -0
  360. data/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +1 -1
  361. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +12 -2
  362. data/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +24 -0
  363. data/app/views/layouts/decidim/header/_main.html.erb +28 -22
  364. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +1 -1
  365. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +18 -18
  366. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +1 -1
  367. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +1 -1
  368. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +1 -1
  369. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +1 -1
  370. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +1 -1
  371. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +1 -1
  372. data/app/views/layouts/decidim/mailer.html.erb +2 -2
  373. data/app/views/layouts/decidim/newsletter_base.html.erb +2 -2
  374. data/app/views/layouts/decidim/shared/_layout_two_col.html.erb +3 -1
  375. data/app/views/layouts/decidim/shared/_layout_user_profile.html.erb +7 -3
  376. data/config/assets.rb +3 -3
  377. data/config/initializers/devise.rb +8 -0
  378. data/config/initializers/omniauth.rb +1 -1
  379. data/config/locales/ar.yml +0 -209
  380. data/config/locales/bg.yml +0 -238
  381. data/config/locales/bs-BA.yml +0 -30
  382. data/config/locales/ca-IT.yml +112 -286
  383. data/config/locales/ca.yml +112 -286
  384. data/config/locales/cs.yml +85 -279
  385. data/config/locales/de.yml +112 -285
  386. data/config/locales/el.yml +0 -224
  387. data/config/locales/en.yml +112 -286
  388. data/config/locales/eo.yml +0 -2
  389. data/config/locales/es-MX.yml +112 -286
  390. data/config/locales/es-PY.yml +112 -286
  391. data/config/locales/es.yml +112 -286
  392. data/config/locales/eu.yml +125 -299
  393. data/config/locales/fi-plain.yml +112 -286
  394. data/config/locales/fi.yml +112 -286
  395. data/config/locales/fr-CA.yml +85 -275
  396. data/config/locales/fr.yml +85 -275
  397. data/config/locales/ga-IE.yml +0 -28
  398. data/config/locales/gl.yml +0 -140
  399. data/config/locales/hu.yml +0 -237
  400. data/config/locales/id-ID.yml +0 -136
  401. data/config/locales/is-IS.yml +0 -14
  402. data/config/locales/it.yml +1 -234
  403. data/config/locales/ja.yml +108 -282
  404. data/config/locales/lb.yml +0 -189
  405. data/config/locales/lt.yml +0 -240
  406. data/config/locales/lv.yml +0 -186
  407. data/config/locales/nl.yml +0 -189
  408. data/config/locales/no.yml +0 -189
  409. data/config/locales/pl.yml +0 -244
  410. data/config/locales/pt-BR.yml +0 -213
  411. data/config/locales/pt.yml +0 -189
  412. data/config/locales/ro-RO.yml +54 -218
  413. data/config/locales/ru.yml +0 -62
  414. data/config/locales/sk.yml +0 -164
  415. data/config/locales/sr-CS.yml +0 -31
  416. data/config/locales/sv.yml +80 -263
  417. data/config/locales/tr-TR.yml +0 -189
  418. data/config/locales/uk.yml +0 -23
  419. data/config/locales/zh-CN.yml +0 -180
  420. data/config/locales/zh-TW.yml +0 -229
  421. data/config/routes.rb +3 -36
  422. data/db/migrate/20250217192438_convert_user_groups_into_users.rb +38 -0
  423. data/db/migrate/20250221085317_add_user_type_to_action_logs.rb +12 -0
  424. data/db/migrate/20250221090905_create_decidim_api_jwt_denylist.rb +11 -0
  425. data/db/migrate/20250221091348_add_api_key_to_decidim_api_user.rb +7 -0
  426. data/db/migrate/20250327143657_remove_metrics_content_blocks.rb +9 -0
  427. data/db/migrate/20250401153444_enable_pkce.rb +8 -0
  428. data/db/migrate/20250416130426_rename_doorkeeper_scopes.rb +25 -0
  429. data/db/migrate/20250515105231_rename_endorsements_to_likes.rb +62 -0
  430. data/db/migrate/20250523104311_move_cta_to_hero_content_block.rb +34 -0
  431. data/db/migrate/20250527122040_move_highlighted_content_banner_settings_to_content_block.rb +69 -0
  432. data/db/migrate/20250603103953_add_refresh_tokens_enabled_to_doorkeeper_applications.rb +7 -0
  433. data/db/migrate/20250609073104_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb +10 -0
  434. data/db/migrate/20250613122148_remove_hashtag_table_from_core.rb +7 -0
  435. data/decidim-core.gemspec +4 -4
  436. data/{app/helpers → lib}/decidim/action_authorization_helper.rb +5 -4
  437. data/lib/decidim/amendable.rb +4 -4
  438. data/lib/decidim/api/functions/user_entity_finder.rb +1 -1
  439. data/lib/decidim/api/input_filters/component_input_filter.rb +3 -3
  440. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +0 -21
  441. data/lib/decidim/api/input_sorts/has_likeable_input_sort.rb +15 -0
  442. data/lib/decidim/api/interfaces/attachable_collection_interface.rb +13 -0
  443. data/lib/decidim/api/interfaces/author_interface.rb +1 -2
  444. data/lib/decidim/api/interfaces/authorable_interface.rb +2 -2
  445. data/lib/decidim/api/interfaces/coauthorable_interface.rb +1 -1
  446. data/lib/decidim/api/interfaces/component_interface.rb +6 -0
  447. data/lib/decidim/api/interfaces/followable_interface.rb +13 -0
  448. data/lib/decidim/api/interfaces/likeable_interface.rb +19 -0
  449. data/lib/decidim/api/interfaces/localizable_interface.rb +18 -0
  450. data/lib/decidim/api/interfaces/participatory_space_interface.rb +6 -8
  451. data/lib/decidim/api/interfaces/referable_interface.rb +13 -0
  452. data/lib/decidim/api/interfaces/timestamps_interface.rb +0 -1
  453. data/lib/decidim/api/interfaces/traceable_interface.rb +1 -1
  454. data/lib/decidim/api/types/attachment_collection_type.rb +14 -0
  455. data/lib/decidim/api/types/organization_type.rb +3 -1
  456. data/lib/decidim/api/types/session_type.rb +0 -5
  457. data/lib/decidim/api/types/statistic_type.rb +29 -3
  458. data/lib/decidim/api/types/trace_version_type.rb +1 -1
  459. data/lib/decidim/api/types/user_type.rb +1 -2
  460. data/lib/decidim/api_response_helper.rb +12 -0
  461. data/lib/decidim/asset_router/storage.rb +2 -4
  462. data/lib/decidim/assets/tailwind/instance.rb +1 -1
  463. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +4 -3
  464. data/lib/decidim/attribute_encryptor.rb +1 -1
  465. data/lib/decidim/attributes/time_with_zone.rb +1 -1
  466. data/lib/decidim/authorable.rb +5 -34
  467. data/lib/decidim/coauthorable.rb +13 -31
  468. data/lib/decidim/content_parsers/blob_parser.rb +1 -1
  469. data/lib/decidim/content_parsers/mention_resource_parser.rb +23 -0
  470. data/lib/decidim/content_parsers/tag_parser.rb +2 -2
  471. data/lib/decidim/content_parsers/user_parser.rb +2 -2
  472. data/lib/decidim/content_parsers.rb +14 -2
  473. data/lib/decidim/content_processor.rb +1 -1
  474. data/lib/decidim/content_renderers/mention_resource_renderer.rb +77 -0
  475. data/lib/decidim/content_renderers.rb +1 -2
  476. data/lib/decidim/core/api.rb +7 -8
  477. data/lib/decidim/core/content_blocks/registry_manager.rb +19 -5
  478. data/lib/decidim/core/engine.rb +72 -104
  479. data/lib/decidim/core/menu.rb +0 -7
  480. data/lib/decidim/core/seeds.rb +11 -39
  481. data/lib/decidim/core/test/factories.rb +22 -121
  482. data/lib/decidim/core/test/shared_examples/authorable.rb +0 -17
  483. data/lib/decidim/core/test/shared_examples/coauthorable.rb +5 -48
  484. data/lib/decidim/core/test/shared_examples/comments_examples.rb +7 -56
  485. data/lib/decidim/core/test/shared_examples/likeable.rb +22 -0
  486. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +16 -3
  487. data/lib/decidim/core/test/shared_examples/map_examples.rb +1 -1
  488. data/lib/decidim/core/test/shared_examples/oauth_application_examples.rb +137 -0
  489. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +0 -18
  490. data/lib/decidim/core/test/shared_examples/permissions.rb +0 -46
  491. data/lib/decidim/core/test/shared_examples/reports_examples.rb +2 -2
  492. data/lib/decidim/core/test/shared_examples/{resource_endorsed_event_examples.rb → resource_liked_event_examples.rb} +7 -7
  493. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +0 -14
  494. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +8 -34
  495. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +79 -0
  496. data/lib/decidim/core/test/shared_examples/system_like_resource_examples.rb +192 -0
  497. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +2 -2
  498. data/lib/decidim/core/test/shared_examples/{with_endorsable_permissions_examples.rb → with_likeable_permissions_examples.rb} +22 -22
  499. data/lib/decidim/core/test.rb +6 -9
  500. data/lib/decidim/core/version.rb +1 -1
  501. data/lib/decidim/core.rb +237 -88
  502. data/lib/decidim/deprecations.rb +1 -1
  503. data/lib/decidim/download_your_data_serializers.rb +6 -3
  504. data/lib/decidim/env.rb +3 -1
  505. data/lib/decidim/events.rb +0 -1
  506. data/lib/decidim/form_builder.rb +26 -43
  507. data/lib/decidim/gamification/badge_scorer.rb +0 -2
  508. data/lib/decidim/gamification.rb +1 -1
  509. data/lib/decidim/has_conversations.rb +0 -44
  510. data/lib/decidim/has_workflows.rb +42 -0
  511. data/lib/decidim/icon_registry.rb +4 -4
  512. data/lib/decidim/legacy_form_builder.rb +17 -2
  513. data/lib/decidim/likeable.rb +24 -0
  514. data/lib/decidim/manifest_registry.rb +1 -1
  515. data/lib/decidim/map/provider/dynamic_map/here.rb +0 -19
  516. data/lib/decidim/map/provider/static_map/here.rb +2 -10
  517. data/lib/decidim/menu.rb +1 -1
  518. data/lib/decidim/moderation_tools.rb +1 -1
  519. data/lib/decidim/mutation_registry.rb +17 -0
  520. data/lib/decidim/newsletter_encryptor.rb +1 -1
  521. data/lib/decidim/oauth/token_generator.rb +35 -0
  522. data/lib/decidim/oauth.rb +7 -0
  523. data/lib/decidim/organization_settings.rb +2 -10
  524. data/lib/decidim/paddable.rb +1 -1
  525. data/lib/decidim/participatory_space_resourceable.rb +2 -2
  526. data/lib/decidim/participatory_space_user.rb +1 -1
  527. data/lib/decidim/pdf_signature_example.rb +108 -0
  528. data/lib/decidim/query.rb +1 -1
  529. data/lib/decidim/query_extensions.rb +0 -33
  530. data/lib/decidim/reportable.rb +1 -1
  531. data/lib/decidim/searchable.rb +4 -2
  532. data/lib/decidim/seeds.rb +8 -0
  533. data/lib/decidim/settings_manifest.rb +3 -2
  534. data/lib/decidim/{webpacker → shakapacker}/configuration.rb +4 -4
  535. data/lib/decidim/{webpacker → shakapacker}/runner.rb +3 -3
  536. data/lib/decidim/shakapacker/shakapacker.rb +8 -0
  537. data/lib/decidim/{webpacker → shakapacker}/shakapacker.yml +3 -1
  538. data/lib/decidim/{webpacker → shakapacker}/webpack/custom.js +1 -1
  539. data/lib/decidim/shakapacker.rb +34 -0
  540. data/lib/decidim/social_share_service_manifest.rb +7 -12
  541. data/lib/decidim/stats_registry.rb +15 -3
  542. data/{app/helpers → lib}/decidim/tooltip_helper.rb +3 -3
  543. data/lib/decidim/url_option_resolver.rb +1 -1
  544. data/lib/decidim/view_model.rb +0 -3
  545. data/lib/decidim/webpacker.rb +11 -20
  546. data/lib/decidim/workflow_registry.rb +61 -0
  547. data/lib/tasks/decidim_participants_tasks.rake +22 -0
  548. data/lib/tasks/{decidim_webpacker_tasks.rake → decidim_shakapacker_tasks.rake} +35 -33
  549. data/lib/tasks/decidim_tasks.rake +4 -1
  550. data/lib/tasks/decidim_taxonomies.rake +0 -34
  551. data/lib/tasks/upgrade/clean.rake +1 -1
  552. data/lib/tasks/upgrade/decidim_action_log_valuation_assignment.rake +13 -0
  553. data/lib/tasks/upgrade/decidim_change_valuator_tasks.rake +12 -0
  554. data/lib/tasks/upgrade/{decidim_deduplicate_endorsements.rake → decidim_deduplicate_likes.rake} +10 -10
  555. data/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake +2 -2
  556. data/lib/tasks/upgrade/decidim_paper_trail_valuation_assignment.rake +13 -0
  557. data/lib/tasks/upgrade/user_groups_migration.rake +155 -0
  558. metadata +204 -256
  559. data/app/cells/decidim/author/endorsements.erb +0 -4
  560. data/app/cells/decidim/author/profile_minicard.erb +0 -30
  561. data/app/cells/decidim/content_blocks/organization_metrics_cell.rb +0 -21
  562. data/app/cells/decidim/content_blocks/participatory_space_metrics/content.erb +0 -18
  563. data/app/cells/decidim/content_blocks/participatory_space_metrics_cell.rb +0 -43
  564. data/app/cells/decidim/endorsement_block/show.erb +0 -3
  565. data/app/cells/decidim/endorsement_buttons/button_content.erb +0 -2
  566. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +0 -7
  567. data/app/cells/decidim/endorsement_buttons/show.erb +0 -17
  568. data/app/cells/decidim/endorsement_buttons_cell.rb +0 -87
  569. data/app/cells/decidim/endorsers_list/empty.erb +0 -3
  570. data/app/cells/decidim/endorsers_list/show.erb +0 -20
  571. data/app/cells/decidim/endorsers_list_cell.rb +0 -64
  572. data/app/cells/decidim/group_admins/show.erb +0 -34
  573. data/app/cells/decidim/group_admins_cell.rb +0 -8
  574. data/app/cells/decidim/group_members/show.erb +0 -46
  575. data/app/cells/decidim/group_members_cell.rb +0 -8
  576. data/app/cells/decidim/groups/show.erb +0 -14
  577. data/app/cells/decidim/groups_cell.rb +0 -22
  578. data/app/cells/decidim/members/show.erb +0 -12
  579. data/app/cells/decidim/members_cell.rb +0 -34
  580. data/app/cells/decidim/profile_actions/dropdown_actions.erb +0 -21
  581. data/app/cells/decidim/represent_user_group/show.erb +0 -11
  582. data/app/cells/decidim/represent_user_group_cell.rb +0 -46
  583. data/app/cells/decidim/user_conversation/conversation_header.erb +0 -14
  584. data/app/cells/decidim/user_conversation/messages.erb +0 -1
  585. data/app/cells/decidim/user_conversation/new.erb +0 -6
  586. data/app/cells/decidim/user_conversation/reply.erb +0 -9
  587. data/app/cells/decidim/user_conversation/show.erb +0 -19
  588. data/app/cells/decidim/user_conversation/start.erb +0 -12
  589. data/app/cells/decidim/user_conversation_cell.rb +0 -62
  590. data/app/cells/decidim/user_conversations/new_conversation_button.erb +0 -20
  591. data/app/cells/decidim/user_conversations/show.erb +0 -13
  592. data/app/cells/decidim/user_conversations_cell.rb +0 -28
  593. data/app/cells/decidim/user_group_pending_invitations_list/show.erb +0 -28
  594. data/app/cells/decidim/user_group_pending_invitations_list_cell.rb +0 -26
  595. data/app/cells/decidim/user_group_pending_requests_list/show.erb +0 -27
  596. data/app/cells/decidim/user_group_pending_requests_list_cell.rb +0 -26
  597. data/app/commands/decidim/accept_group_invitation.rb +0 -43
  598. data/app/commands/decidim/accept_user_group_join_request.rb +0 -53
  599. data/app/commands/decidim/create_user_group.rb +0 -73
  600. data/app/commands/decidim/demote_membership.rb +0 -57
  601. data/app/commands/decidim/endorse_resource.rb +0 -66
  602. data/app/commands/decidim/invite_user_to_group.rb +0 -63
  603. data/app/commands/decidim/join_user_group.rb +0 -57
  604. data/app/commands/decidim/leave_user_group.rb +0 -47
  605. data/app/commands/decidim/promote_membership.rb +0 -55
  606. data/app/commands/decidim/reject_group_invitation.rb +0 -42
  607. data/app/commands/decidim/reject_user_group_join_request.rb +0 -53
  608. data/app/commands/decidim/remove_user_from_group.rb +0 -53
  609. data/app/commands/decidim/unendorse_resource.rb +0 -39
  610. data/app/commands/decidim/update_user_group.rb +0 -72
  611. data/app/controllers/concerns/decidim/user_groups.rb +0 -23
  612. data/app/controllers/decidim/endorsements_controller.rb +0 -71
  613. data/app/controllers/decidim/group_email_confirmations_controller.rb +0 -32
  614. data/app/controllers/decidim/group_invites_controller.rb +0 -104
  615. data/app/controllers/decidim/group_members_controller.rb +0 -75
  616. data/app/controllers/decidim/groups_controller.rb +0 -99
  617. data/app/controllers/decidim/own_user_groups_controller.rb +0 -15
  618. data/app/controllers/decidim/user_conversations_controller.rb +0 -133
  619. data/app/controllers/decidim/user_group_join_requests_controller.rb +0 -72
  620. data/app/events/decidim/demoted_membership_event.rb +0 -28
  621. data/app/events/decidim/invited_to_group_event.rb +0 -62
  622. data/app/events/decidim/join_request_accepted_event.rb +0 -28
  623. data/app/events/decidim/join_request_created_event.rb +0 -28
  624. data/app/events/decidim/join_request_rejected_event.rb +0 -28
  625. data/app/events/decidim/promoted_to_admin_event.rb +0 -28
  626. data/app/events/decidim/removed_from_group_event.rb +0 -28
  627. data/app/events/decidim/resource_endorsed_event.rb +0 -36
  628. data/app/events/decidim/user_group_admin_event.rb +0 -37
  629. data/app/events/decidim/user_group_created_event.rb +0 -6
  630. data/app/events/decidim/user_group_updated_event.rb +0 -6
  631. data/app/forms/decidim/invite_user_to_group_form.rb +0 -29
  632. data/app/forms/decidim/user_group_form.rb +0 -85
  633. data/app/helpers/decidim/cta_button_helper.rb +0 -31
  634. data/app/helpers/decidim/endorsable_helper.rb +0 -84
  635. data/app/helpers/decidim/twitter_search_helper.rb +0 -14
  636. data/app/helpers/decidim/user_group_helper.rb +0 -22
  637. data/app/jobs/decidim/metric_job.rb +0 -15
  638. data/app/models/decidim/metric.rb +0 -25
  639. data/app/models/decidim/user_group.rb +0 -217
  640. data/app/models/decidim/user_group_membership.rb +0 -17
  641. data/app/packs/entrypoints/decidim_widget.js +0 -1
  642. data/app/packs/src/decidim/abide_form_validator_fixer.js +0 -44
  643. data/app/packs/src/decidim/account_form.js +0 -96
  644. data/app/packs/src/decidim/append_elements.js +0 -6
  645. data/app/packs/src/decidim/back_to_list.js +0 -26
  646. data/app/packs/src/decidim/change_report_form_behavior.js +0 -45
  647. data/app/packs/src/decidim/clipboard.js +0 -128
  648. data/app/packs/src/decidim/editor/extensions/hashtag/index.js +0 -66
  649. data/app/packs/src/decidim/editor/extensions/heading/index.js +0 -33
  650. data/app/packs/src/decidim/editor/test/extensions/hashtag.test.js +0 -105
  651. data/app/packs/src/decidim/form_filter.component_for_testing.js +0 -7
  652. data/app/packs/src/decidim/form_validator.js +0 -56
  653. data/app/packs/src/decidim/gallery.js +0 -5
  654. data/app/packs/src/decidim/impersonation.js +0 -23
  655. data/app/packs/src/decidim/input_autojump.js +0 -38
  656. data/app/packs/src/decidim/input_hashtags.js +0 -91
  657. data/app/packs/src/decidim/input_mentions.js +0 -143
  658. data/app/packs/src/decidim/input_multiple_mentions.js +0 -115
  659. data/app/packs/src/decidim/input_tags.js +0 -16
  660. data/app/packs/src/decidim/notifications_actions.js +0 -40
  661. data/app/packs/src/decidim/password_toggler.js +0 -104
  662. data/app/packs/src/decidim/remote_tooltips.js +0 -38
  663. data/app/packs/src/decidim/responsive_horizontal_tabs.js +0 -12
  664. data/app/packs/src/decidim/scroll_to_last_child.js +0 -14
  665. data/app/packs/src/decidim/slug_form.js +0 -9
  666. data/app/packs/src/decidim/sticky_footer.js +0 -48
  667. data/app/packs/src/decidim/sticky_header.js +0 -62
  668. data/app/packs/src/decidim/toggle.js +0 -37
  669. data/app/packs/src/decidim/tooltips.js +0 -152
  670. data/app/packs/src/decidim/user_registrations.js +0 -65
  671. data/app/packs/src/decidim/vizzs/areachart.js +0 -251
  672. data/app/packs/src/decidim/vizzs/index.js +0 -82
  673. data/app/packs/src/decidim/widget.js +0 -14
  674. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  675. data/app/packs/stylesheets/decidim/_metrics.scss +0 -70
  676. data/app/packs/stylesheets/decidim/_modal_identities.scss +0 -23
  677. data/app/presenters/decidim/admin_log/user_group_presenter.rb +0 -31
  678. data/app/presenters/decidim/hashtag_presenter.rb +0 -37
  679. data/app/presenters/decidim/metric_charts_presenter.rb +0 -92
  680. data/app/presenters/decidim/metric_object_presenter.rb +0 -32
  681. data/app/presenters/decidim/user_group_presenter.rb +0 -38
  682. data/app/queries/decidim/metric_manage.rb +0 -81
  683. data/app/queries/decidim/metric_measure.rb +0 -36
  684. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +0 -26
  685. data/app/queries/decidim/metrics/followers_metric_manage.rb +0 -65
  686. data/app/queries/decidim/metrics/participants_metric_manage.rb +0 -79
  687. data/app/queries/decidim/metrics/reported_users_metric_manage.rb +0 -26
  688. data/app/queries/decidim/metrics/user_reports_metric_manage.rb +0 -26
  689. data/app/queries/decidim/metrics/users_metric_manage.rb +0 -26
  690. data/app/queries/decidim/user_groups/accepted_memberships.rb +0 -36
  691. data/app/queries/decidim/user_groups/accepted_user_groups.rb +0 -38
  692. data/app/queries/decidim/user_groups/accepted_users.rb +0 -36
  693. data/app/queries/decidim/user_groups/admin_memberships.rb +0 -37
  694. data/app/queries/decidim/user_groups/invited_memberships.rb +0 -36
  695. data/app/queries/decidim/user_groups/manageable_user_groups.rb +0 -39
  696. data/app/queries/decidim/user_groups/member_memberships.rb +0 -37
  697. data/app/resolvers/decidim/core/metric_resolver.rb +0 -71
  698. data/app/resolvers/decidim/hashtags_resolver.rb +0 -15
  699. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +0 -22
  700. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +0 -38
  701. data/app/views/decidim/endorsements/_identity.html.erb +0 -4
  702. data/app/views/decidim/endorsements/identities.html.erb +0 -18
  703. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +0 -25
  704. data/app/views/decidim/group_invites/index.html.erb +0 -26
  705. data/app/views/decidim/groups/_form.html.erb +0 -17
  706. data/app/views/decidim/groups/edit.html.erb +0 -19
  707. data/app/views/decidim/groups/new.html.erb +0 -23
  708. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_conversation.html.erb +0 -17
  709. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_message.html.erb +0 -17
  710. data/app/views/decidim/messaging/conversation_mailer/new_group_conversation.html.erb +0 -17
  711. data/app/views/decidim/messaging/conversation_mailer/new_group_message.html.erb +0 -17
  712. data/app/views/decidim/own_user_groups/index.html.erb +0 -10
  713. data/app/views/decidim/shared/_extended_navigation_bar.html.erb +0 -50
  714. data/app/views/decidim/user_conversations/index.html.erb +0 -4
  715. data/app/views/decidim/user_conversations/show.html.erb +0 -4
  716. data/app/views/decidim/user_conversations/update.js.erb +0 -8
  717. data/config/initializers/new_framework_defaults_7_0.rb +0 -145
  718. data/lib/decidim/api/input_filters/has_hastaggable_input_filter.rb +0 -15
  719. data/lib/decidim/api/input_sorts/has_endorsable_input_sort.rb +0 -15
  720. data/lib/decidim/api/interfaces/endorsable_interface.rb +0 -19
  721. data/lib/decidim/api/types/hashtag_type.rb +0 -13
  722. data/lib/decidim/api/types/metric_history_type.rb +0 -20
  723. data/lib/decidim/api/types/metric_type.rb +0 -13
  724. data/lib/decidim/api/types/user_group_type.rb +0 -55
  725. data/lib/decidim/content_parsers/hashtag_parser.rb +0 -66
  726. data/lib/decidim/content_parsers/user_group_parser.rb +0 -33
  727. data/lib/decidim/content_renderers/hashtag_renderer.rb +0 -78
  728. data/lib/decidim/content_renderers/user_group_renderer.rb +0 -31
  729. data/lib/decidim/core/test/shared_examples/amendable_interface_examples.rb +0 -14
  730. data/lib/decidim/core/test/shared_examples/amendable_proposals_interface_examples.rb +0 -50
  731. data/lib/decidim/core/test/shared_examples/assembly_announcements_examples.rb +0 -38
  732. data/lib/decidim/core/test/shared_examples/attachable_interface_examples.rb +0 -16
  733. data/lib/decidim/core/test/shared_examples/authorable_interface_examples.rb +0 -59
  734. data/lib/decidim/core/test/shared_examples/categories_container_examples.rb +0 -22
  735. data/lib/decidim/core/test/shared_examples/categorizable_interface_examples.rb +0 -27
  736. data/lib/decidim/core/test/shared_examples/coauthorable_interface_examples.rb +0 -91
  737. data/lib/decidim/core/test/shared_examples/endorsable.rb +0 -69
  738. data/lib/decidim/core/test/shared_examples/endorsable_interface_examples.rb +0 -22
  739. data/lib/decidim/core/test/shared_examples/fingerprintable_interface_examples.rb +0 -17
  740. data/lib/decidim/core/test/shared_examples/input_filter_examples.rb +0 -118
  741. data/lib/decidim/core/test/shared_examples/input_sort_examples.rb +0 -126
  742. data/lib/decidim/core/test/shared_examples/metric_manage_shared_context.rb +0 -9
  743. data/lib/decidim/core/test/shared_examples/participatory_space_resourcable_interface_examples.rb +0 -43
  744. data/lib/decidim/core/test/shared_examples/process_announcements_examples.rb +0 -37
  745. data/lib/decidim/core/test/shared_examples/scopable_interface_examples.rb +0 -19
  746. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +0 -298
  747. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +0 -20
  748. data/lib/decidim/core/test/shared_examples/timestamps_interface_examples.rb +0 -21
  749. data/lib/decidim/core/test/shared_examples/traceable_interface_examples.rb +0 -47
  750. data/lib/decidim/download_your_data_serializers/download_your_data_user_group_serializer.rb +0 -21
  751. data/lib/decidim/endorsable.rb +0 -29
  752. data/lib/decidim/events/user_group_event.rb +0 -43
  753. data/lib/decidim/hashtag.rb +0 -13
  754. data/lib/decidim/metric_manifest.rb +0 -35
  755. data/lib/decidim/metric_operation.rb +0 -58
  756. data/lib/decidim/metric_operation_manifest.rb +0 -21
  757. data/lib/decidim/metric_registry.rb +0 -109
  758. data/lib/gem_overrides/shakapacker/runner.rb +0 -9
  759. data/lib/tasks/decidim_metrics_tasks.rake +0 -89
  760. /data/app/cells/decidim/{endorsement_buttons/disabled_endorsements.erb → like_buttons/disabled_likes.erb} +0 -0
  761. /data/app/packs/src/decidim/{configuration.js → refactor/implementation/configuration.js} +0 -0
  762. /data/app/packs/src/decidim/{external_domain_warning.js → refactor/implementation/external_domain_warning.js} +0 -0
  763. /data/app/packs/src/decidim/{autocomplete.js → refactor/moved/autocomplete.js} +0 -0
  764. /data/app/packs/src/decidim/{delayed.js → refactor/moved/delayed.js} +0 -0
  765. /data/app/packs/src/decidim/{focus_guard.js → refactor/moved/focus_guard.js} +0 -0
  766. /data/app/packs/src/decidim/{history.js → refactor/moved/history.js} +0 -0
  767. /data/app/packs/src/decidim/{i18n.js → refactor/moved/i18n.js} +0 -0
  768. /data/lib/decidim/core/test/shared_examples/{endorsements_controller_shared_context.rb → likes_controller_shared_context.rb} +0 -0
  769. /data/{app/helpers → lib}/decidim/resource_helper.rb +0 -0
  770. /data/lib/decidim/{webpacker → shakapacker}/esbuild.config.js +0 -0
  771. /data/lib/decidim/{webpacker → shakapacker}/postcss.config.js +0 -0
  772. /data/lib/decidim/{webpacker → shakapacker}/tsconfig.json +0 -0
  773. /data/lib/decidim/{webpacker → shakapacker}/webpack/.modernizrrc +0 -0
  774. /data/lib/decidim/{webpacker → shakapacker}/webpack/webpack.config.js +0 -0
@@ -1,6 +1,5 @@
1
1
  .editor-props {
2
2
  --editor-active-color: #487bda;
3
- --editor-border-color: #ccc;
4
3
  --editor-disabled-color: #eee;
5
4
  --editor-bubble-border-color: #ccc;
6
5
  --editor-bubble-shadow-color: #333;
@@ -8,20 +7,16 @@
8
7
 
9
8
  .editor-suggestions-props {
10
9
  --editor-suggestions-border-color: #000;
11
- --editor-suggestions-background-color: #fff;
12
- --editor-suggestions-selected-highlight-color: #c7c7c7;
10
+ --editor-suggestions-background-color: #eee;
11
+ --editor-suggestions-selected-highlight-color: #ccc;
13
12
  }
14
13
 
15
14
  .editor-active {
16
15
  @apply outline outline-4 outline-[var(--editor-active-color)];
17
16
  }
18
17
 
19
- .editor-border {
20
- @apply border-solid border-[#ccc];
21
- }
22
-
23
18
  .editor-container {
24
- @apply editor-props editor-suggestions-props flex flex-col mt-4 border editor-border;
19
+ @apply editor-props editor-suggestions-props flex flex-col border border-neutral-200 rounded mt-2;
25
20
 
26
21
  &.editor-disabled {
27
22
  .editor-input .ProseMirror {
@@ -30,7 +25,7 @@
30
25
  }
31
26
 
32
27
  .editor-toolbar {
33
- @apply py-1.5 px-2.5 border-0 border-b editor-border;
28
+ @apply py-1.5 px-2.5 border-b border-b-neutral-200;
34
29
 
35
30
  .editor-toolbar-group {
36
31
  @apply inline-block mx-2.5;
@@ -181,7 +176,7 @@
181
176
  }
182
177
 
183
178
  .editor-suggestions {
184
- @apply editor-suggestions-props border border-solid border-[var(--editor-suggestions-border-color)] bg-[var(--editor-suggestions-background-color)];
179
+ @apply editor-suggestions-props border-0 bg-[var(--editor-suggestions-background-color)] max-w-sm drop-shadow-md rounded-md;
185
180
 
186
181
  &:hover {
187
182
  .editor-suggestions-item[data-selected]:not(:hover) {
@@ -190,10 +185,14 @@
190
185
  }
191
186
 
192
187
  .editor-suggestions-item {
193
- @apply block w-full text-left py-2.5 px-1.5 border-0 border-t border-solid border-[var(--editor-suggestions-border-color)] rounded-none;
188
+ @apply block w-full text-left py-[0.375rem] px-1.5 border-0 rounded-none truncate text-sm;
194
189
 
195
190
  &:first-child {
196
- @apply border-t-0;
191
+ @apply rounded-t-md;
192
+ }
193
+
194
+ &:last-child {
195
+ @apply rounded-b-md;
197
196
  }
198
197
 
199
198
  &:hover,
@@ -1,4 +1,5 @@
1
- @import "stylesheets/decidim/legacy/variables";
1
+ @use "sass:meta";
2
+ @use "stylesheets/decidim/legacy/variables";
2
3
 
3
4
  /* Index:
4
5
  1 - Foundation settings
@@ -1190,8 +1191,8 @@ table.button {
1190
1191
  table.button table td {
1191
1192
  text-align: left;
1192
1193
  color: #fefefe;
1193
- background: $primary;
1194
- border: 2px solid $primary;
1194
+ background: variables.$primary;
1195
+ border: 2px solid variables.$primary;
1195
1196
  }
1196
1197
 
1197
1198
  table.button table td a {
@@ -1201,7 +1202,7 @@ table.button table td a {
1201
1202
  text-decoration: none;
1202
1203
  display: inline-block;
1203
1204
  padding: 8px 16px;
1204
- border: 0 solid $primary;
1205
+ border: 0 solid variables.$primary;
1205
1206
  border-radius: 3px;
1206
1207
  }
1207
1208
 
@@ -1290,7 +1291,7 @@ table.button.expanded center {
1290
1291
  table.button:hover table td,
1291
1292
  table.button:visited table td,
1292
1293
  table.button:active table td {
1293
- background: $primary;
1294
+ background: variables.$primary;
1294
1295
  color: #fefefe;
1295
1296
  }
1296
1297
 
@@ -1,6 +1,8 @@
1
- @import "leaflet/dist/leaflet";
2
- @import "leaflet.markercluster/dist/MarkerCluster";
3
- @import "leaflet.markercluster/dist/MarkerCluster.Default";
1
+ @use "sass:meta";
2
+
3
+ @include meta.load-css("leaflet/dist/leaflet");
4
+ @include meta.load-css("leaflet.markercluster/dist/MarkerCluster");
5
+ @include meta.load-css("leaflet.markercluster/dist/MarkerCluster.Default");
4
6
 
5
7
  /* overwrite leaflet and card styles */
6
8
  .leaflet-popup-content-wrapper {
@@ -0,0 +1,65 @@
1
+ @use "sass:meta";
2
+ @use "tailwindcss/base";
3
+ @use "tailwindcss/components";
4
+ @use "tailwindcss/utilities";
5
+
6
+ @layer base {
7
+ @include meta.load-css("stylesheets/decidim/fonts");
8
+ @include meta.load-css("stylesheets/decidim/typography");
9
+ // Keep this in separate file as long as we are maintaining Foundation compatibility
10
+ @include meta.load-css("stylesheets/decidim/rich_text");
11
+ }
12
+
13
+ body {
14
+ @apply text-center mt-16 px-8;
15
+
16
+ > * {
17
+ @apply mx-auto w-full;
18
+ }
19
+
20
+ h1 {
21
+ @apply text-2xl text-black mb-6;
22
+ }
23
+
24
+ h3 {
25
+ @apply text-lg text-black mt-4;
26
+ }
27
+
28
+ .code-qr {
29
+ @apply mx-auto w-[80%] md:w-[40%] lg:w-[20%];
30
+ }
31
+
32
+ .card__grid-img {
33
+ @apply aspect-[21/9] rounded-t overflow-hidden mx-auto w-full lg:w-96 mb-12;
34
+
35
+ img {
36
+ @apply w-full h-full object-cover;
37
+ }
38
+ }
39
+
40
+ .logo {
41
+ @apply mt-10;
42
+
43
+ a {
44
+ @apply inline-block;
45
+
46
+ img {
47
+ @apply h-20 w-full;
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ @media print {
54
+ body {
55
+ zoom: 0.75;
56
+
57
+ h1 {
58
+ @apply text-2xl text-black mb-12;
59
+ }
60
+
61
+ .card__grid-img {
62
+ @apply w-[80%];
63
+ }
64
+ }
65
+ }
@@ -4,6 +4,7 @@ module Decidim
4
4
  # Default permissions class for all components and spaces. It deauthorizes all
5
5
  # actions by any kind of user. Also works as a default implementation so other
6
6
  # components can inherit from it and get some convenience methods.
7
+ # Delegates the admin permission check on :subject and :action to the permissions of each module.
7
8
  class DefaultPermissions
8
9
  include Decidim::UserRoleChecker
9
10
 
@@ -14,6 +15,13 @@ module Decidim
14
15
  end
15
16
 
16
17
  def permissions
18
+ return permission_action if permission_action.scope != target_scope
19
+
20
+ return permission_action unless subject == target_subject
21
+
22
+ permission_method = "can_#{action}?"
23
+ toggle_allow(send(permission_method)) if respond_to?(permission_method, true)
24
+
17
25
  permission_action
18
26
  end
19
27
 
@@ -21,6 +29,14 @@ module Decidim
21
29
 
22
30
  attr_reader :user, :permission_action, :context
23
31
 
32
+ delegate :subject, :action, to: :permission_action
33
+
34
+ def target_scope = ""
35
+
36
+ def target_subject
37
+ raise NotImplementedError "You need to implement target_subject"
38
+ end
39
+
24
40
  def disallow!
25
41
  permission_action.trace(self.class.name, :disallowed)
26
42
  permission_action.disallow!
@@ -21,9 +21,7 @@ module Decidim
21
21
  amend_action?
22
22
  notification_action?
23
23
  conversation_action?
24
- user_group_action?
25
- user_group_invitations_action?
26
- apply_endorsement_permissions if permission_action.subject == :endorsement
24
+ apply_like_permissions if permission_action.subject == :like
27
25
  show_my_location_button?
28
26
 
29
27
  permission_action
@@ -127,10 +125,10 @@ module Decidim
127
125
  toggle_allow(amendment&.amender == user)
128
126
  end
129
127
 
130
- def apply_endorsement_permissions
131
- is_allowed = current_settings.endorsements_enabled &&
132
- !current_settings.endorsements_blocked &&
133
- authorized?(:endorse, resource: context.fetch(:resource, nil))
128
+ def apply_like_permissions
129
+ is_allowed = current_settings.likes_enabled &&
130
+ !current_settings.likes_blocked &&
131
+ authorized?(:like, resource: context.fetch(:resource, nil))
134
132
 
135
133
  toggle_allow(is_allowed)
136
134
  end
@@ -155,25 +153,6 @@ module Decidim
155
153
  toggle_allow(conversation&.participating?(interlocutor))
156
154
  end
157
155
 
158
- def user_group_action?
159
- return unless permission_action.subject == :user_group
160
- return allow! if [:join, :create].include?(permission_action.action)
161
-
162
- user_group = context.fetch(:user_group)
163
-
164
- if permission_action.action == :leave
165
- user_can_leave_group = Decidim::UserGroupMembership.where(user:, user_group:).any?
166
- return toggle_allow(user_can_leave_group)
167
- end
168
-
169
- user_manages_group = Decidim::UserGroups::ManageableUserGroups.for(user).include?(user_group)
170
- toggle_allow(user_manages_group) if permission_action.action == :manage
171
- end
172
-
173
- def user_group_invitations_action?
174
- allow! if permission_action.subject == :user_group_invitations
175
- end
176
-
177
156
  def user_can_preview_component?
178
157
  context[:share_token].present? && Decidim::ShareToken.use!(token_for: component, token: context[:share_token], user:)
179
158
  rescue ActiveRecord::RecordNotFound, StandardError
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  module AdminLog
5
- # This class holds the shared logic for `Decidim::User` and `Decidim::UserGroup`
6
- # presenters for the `AdminLog`.
5
+ # This class holds the shared logic for `Decidim::User`
6
+ # presenter for the `AdminLog`.
7
7
  class BaseUserPresenter < Decidim::Log::BasePresenter
8
8
  private
9
9
 
@@ -19,7 +19,6 @@ module Decidim
19
19
 
20
20
  settings_attributes_mapping
21
21
  .merge(omnipresent_banner_attributes_mapping)
22
- .merge(highlighted_content_banner_attributes_mapping)
23
22
  .merge(appearance_attributes_mapping)
24
23
  .merge(id_documents_attributes_mapping)
25
24
  end
@@ -47,22 +46,8 @@ module Decidim
47
46
  }
48
47
  end
49
48
 
50
- def highlighted_content_banner_attributes_mapping
51
- {
52
- highlighted_content_banner_enabled: :boolean,
53
- highlighted_content_banner_action_url: :string,
54
- highlighted_content_banner_image: :string,
55
- highlighted_content_banner_title: :i18n,
56
- highlighted_content_banner_short_description: :i18n,
57
- highlighted_content_banner_action_title: :i18n,
58
- highlighted_content_banner_action_subtitle: :i18n
59
- }
60
- end
61
-
62
49
  def appearance_attributes_mapping
63
50
  {
64
- cta_button_path: :string,
65
- cta_button_text: :i18n,
66
51
  description: :i18n,
67
52
  logo: :string,
68
53
  header_snippets: :string,
@@ -2,63 +2,13 @@
2
2
 
3
3
  module Decidim
4
4
  # A presenter to render statistics in the homepage.
5
- class HomeStatsPresenter < SimpleDelegator
6
- def organization
5
+ class HomeStatsPresenter < StatsPresenter
6
+ def scope_entity
7
7
  __getobj__.fetch(:organization)
8
8
  end
9
9
 
10
- # Public: Render a collection of primary stats.
11
- def highlighted
12
- highlighted_stats = Decidim.stats.only([:users_count, :processes_count]).with_context(organization).map { |name, data| [name, data] }
13
- highlighted_stats.concat(global_stats(priority: StatsRegistry::HIGH_PRIORITY))
14
- highlighted_stats.concat(component_stats(priority: StatsRegistry::HIGH_PRIORITY))
15
- highlighted_stats = highlighted_stats.reject(&:empty?)
16
- highlighted_stats = highlighted_stats.reject { |_name, data| data.zero? }
17
-
18
- highlighted_stats.map do |name, data|
19
- { stat_title: name, stat_number: data }
20
- end
21
- end
22
-
23
- # Public: Render a collection of stats that are not primary.
24
- def not_highlighted
25
- not_highlighted_stats = global_stats(priority: StatsRegistry::MEDIUM_PRIORITY)
26
- not_highlighted_stats.concat(component_stats(priority: StatsRegistry::MEDIUM_PRIORITY))
27
- not_highlighted_stats = not_highlighted_stats.reject(&:empty?)
28
- not_highlighted_stats = not_highlighted_stats.reject { |_name, data| data.zero? }
29
-
30
- not_highlighted_stats.map do |name, data|
31
- { stat_title: name, stat_number: data }
32
- end
33
- end
34
-
35
- private
36
-
37
- def global_stats(conditions)
38
- Decidim.stats.except([:users_count, :processes_count, :followers_count])
39
- .filter(conditions)
40
- .with_context(organization)
41
- .map { |name, data| [name, data] }
42
- end
43
-
44
- def component_stats(conditions)
45
- stats = {}
46
- Decidim.component_manifests.flat_map do |component|
47
- component
48
- .stats.except([:votes_count])
49
- .filter(conditions)
50
- .with_context(published_components)
51
- .each do |name, data|
52
- stats[name] ||= 0
53
- stats[name] += data
54
- end
55
- end
56
-
57
- stats.to_a
58
- end
59
-
60
- def published_components
61
- @published_components ||= organization.published_components
10
+ def collection(priority: StatsRegistry::HIGH_PRIORITY)
11
+ super
62
12
  end
63
13
  end
64
14
  end
@@ -157,7 +157,7 @@ module Decidim
157
157
  # Returns an HTML-safe String.
158
158
  def present_action_log
159
159
  classes = ["logs__log"] + action_log_extra_classes.to_a
160
- h.content_tag(:div, id: "accordion-#{h.dom_id(action_log)}", class: classes.join(" "), data: { component: "accordion" }) do
160
+ h.content_tag(:div, id: "accordion-#{h.dom_id(action_log)}", class: classes.join(" "), data: { controller: "accordion" }) do
161
161
  h.concat(present_content)
162
162
  h.concat(present_diff)
163
163
  end
@@ -13,6 +13,9 @@ module Decidim
13
13
  # @option options [String] :element_class
14
14
  # The CSS class to be used for the item
15
15
  #
16
+ # @option options [String] :element_wrapper_class
17
+ # The CSS class to be used for the wrapper of the item
18
+ #
16
19
  # @option options [String] :active_class
17
20
  # The CSS class to be used for the active item
18
21
  #
@@ -49,17 +52,21 @@ module Decidim
49
52
  { aria: { current: "page" } }
50
53
  else
51
54
  {}
52
- end
55
+ end.merge({ class: link_classes })
53
56
  end
54
57
 
55
58
  def composed_label
56
59
  icon_name.present? ? icon(icon_name) + label : label
57
60
  end
58
61
 
62
+ def link_classes
63
+ @options.element_class.nil? ? "" : @options.element_class
64
+ end
65
+
59
66
  def link_wrapper_classes
60
- return @options.element_class unless is_active_link?(url, active)
67
+ return @options.element_wrapper_class unless is_active_link?(url, active)
61
68
 
62
- [@options.element_class, active_class].compact.join(" ")
69
+ [@options.element_wrapper_class, active_class].compact.join(" ")
63
70
  end
64
71
 
65
72
  def active_class
@@ -36,9 +36,5 @@ module Decidim
36
36
  def can_be_contacted?
37
37
  false
38
38
  end
39
-
40
- def has_tooltip?
41
- false
42
- end
43
39
  end
44
40
  end
@@ -31,10 +31,6 @@ module Decidim
31
31
  attached_uploader(:non_user_avatar)
32
32
  end
33
33
 
34
- def has_tooltip?
35
- false
36
- end
37
-
38
34
  def deleted?
39
35
  false
40
36
  end
@@ -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