decidim-core 0.30.3 → 0.31.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (777) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -4
  3. data/app/cells/decidim/activity_cell.rb +0 -3
  4. data/app/cells/decidim/address/show.erb +1 -0
  5. data/app/cells/decidim/address_cell.rb +7 -1
  6. data/app/cells/decidim/amendable/amend_button_card/show.erb +2 -2
  7. data/app/cells/decidim/author/avatar.erb +1 -7
  8. data/app/cells/decidim/author/likes.erb +4 -0
  9. data/app/cells/decidim/author/name.erb +1 -5
  10. data/app/cells/decidim/author/show.erb +45 -19
  11. data/app/cells/decidim/author_cell.rb +5 -28
  12. data/app/cells/decidim/badge_cell.rb +1 -7
  13. data/app/cells/decidim/card_cell.rb +2 -12
  14. data/app/cells/decidim/card_metadata_cell.rb +4 -4
  15. data/app/cells/decidim/coauthorships_cell.rb +1 -1
  16. data/app/cells/decidim/collapsible_authors/show.erb +1 -1
  17. data/app/cells/decidim/content_blocks/hero_cell.rb +23 -4
  18. data/app/cells/decidim/content_blocks/hero_settings_form/show.erb +16 -2
  19. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +6 -6
  20. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +28 -1
  21. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form/show.erb +27 -0
  22. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form_cell.rb +13 -0
  23. data/app/cells/decidim/content_blocks/highlighted_elements_for_component_settings_form/show.erb +9 -2
  24. data/app/cells/decidim/content_blocks/html_settings_form/show.erb +3 -1
  25. data/app/cells/decidim/content_blocks/last_activity_cell.rb +1 -1
  26. data/app/cells/decidim/content_blocks/last_activity_settings_form/show.erb +3 -1
  27. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity_cell.rb +1 -1
  28. data/app/cells/decidim/content_blocks/participatory_space_extra_data/recent_users.erb +1 -1
  29. data/app/cells/decidim/content_blocks/participatory_space_hero/show.erb +0 -5
  30. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +1 -13
  31. data/app/cells/decidim/content_blocks/participatory_space_hero_settings_form/show.erb +10 -3
  32. data/app/cells/decidim/content_blocks/participatory_space_last_activity/content.erb +1 -1
  33. data/app/cells/decidim/content_blocks/participatory_space_last_activity/recent_avatars.erb +1 -1
  34. data/app/cells/decidim/content_blocks/participatory_space_last_activity_cell.rb +3 -3
  35. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +17 -5
  36. data/app/cells/decidim/content_blocks/participatory_space_main_data_cell.rb +4 -0
  37. data/app/cells/decidim/content_blocks/stats/show.erb +2 -3
  38. data/app/cells/decidim/data_consent/modal.erb +1 -1
  39. data/app/cells/decidim/like_block/show.erb +3 -0
  40. data/app/cells/decidim/{endorsement_block_cell.rb → like_block_cell.rb} +2 -2
  41. data/app/cells/decidim/like_buttons/button_content.erb +2 -0
  42. data/app/cells/decidim/like_buttons/show.erb +17 -0
  43. data/app/cells/decidim/{endorsement_buttons → like_buttons}/verification_modal.erb +3 -3
  44. data/app/cells/decidim/like_buttons_cell.rb +77 -0
  45. data/app/cells/decidim/likers_list/empty.erb +3 -0
  46. data/app/cells/decidim/{endorsers_list → likers_list}/full.erb +3 -3
  47. data/app/cells/decidim/likers_list/show.erb +20 -0
  48. data/app/cells/decidim/likers_list_cell.rb +64 -0
  49. data/app/cells/decidim/nav_links/show.erb +1 -1
  50. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  51. data/app/cells/decidim/onboarding_action_message_cell.rb +1 -1
  52. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +0 -8
  53. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +0 -8
  54. data/app/cells/decidim/profile/details.erb +1 -1
  55. data/app/cells/decidim/profile/tabs.erb +1 -1
  56. data/app/cells/decidim/profile_actions/show.erb +0 -1
  57. data/app/cells/decidim/profile_actions_cell.rb +5 -91
  58. data/app/cells/decidim/profile_cell.rb +4 -39
  59. data/app/cells/decidim/report_button/content.erb +2 -0
  60. data/app/cells/decidim/report_button/flag_modal.erb +1 -1
  61. data/app/cells/decidim/report_button_cell.rb +1 -1
  62. data/app/cells/decidim/report_user_button/flag_modal.erb +1 -1
  63. data/app/cells/decidim/resource_history_cell.rb +2 -1
  64. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  65. data/app/cells/decidim/share_button_cell.rb +1 -1
  66. data/app/cells/decidim/share_text_widget/modal.erb +16 -0
  67. data/app/cells/decidim/share_text_widget/show.erb +2 -0
  68. data/app/cells/decidim/share_text_widget_cell.rb +27 -0
  69. data/app/cells/decidim/share_widget/modal.erb +19 -8
  70. data/app/cells/decidim/share_widget/qr_code_modal.erb +26 -0
  71. data/app/cells/decidim/share_widget/show.erb +1 -0
  72. data/app/cells/decidim/share_widget_cell.rb +10 -6
  73. data/app/cells/decidim/statistic/show.erb +23 -5
  74. data/app/cells/decidim/statistic_cell.rb +28 -3
  75. data/app/cells/decidim/tab_panels/show.erb +1 -1
  76. data/app/cells/decidim/user_profile/show.erb +1 -1
  77. data/app/cells/decidim/user_profile_cell.rb +1 -9
  78. data/app/cells/decidim/version_author_cell.rb +0 -7
  79. data/app/commands/decidim/amendable/accept.rb +1 -3
  80. data/app/commands/decidim/amendable/create_draft.rb +2 -3
  81. data/app/commands/decidim/amendable/update_draft.rb +2 -3
  82. data/app/commands/decidim/create_ephemeral_user.rb +7 -1
  83. data/app/commands/decidim/create_omniauth_registration.rb +8 -7
  84. data/app/commands/decidim/create_report.rb +9 -1
  85. data/app/commands/decidim/destroy_account.rb +0 -5
  86. data/app/commands/decidim/like_resource.rb +52 -0
  87. data/app/commands/decidim/messaging/reply_to_conversation.rb +2 -21
  88. data/app/commands/decidim/messaging/start_conversation.rb +2 -21
  89. data/app/commands/decidim/unlike_resource.rb +34 -0
  90. data/app/commands/decidim/update_account.rb +1 -1
  91. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +6 -2
  92. data/app/controllers/concerns/decidim/user_profile.rb +0 -1
  93. data/app/controllers/decidim/account_controller.rb +1 -1
  94. data/app/controllers/decidim/amendments_controller.rb +4 -5
  95. data/app/controllers/decidim/application_controller.rb +2 -1
  96. data/app/controllers/decidim/devise/confirmations_controller.rb +0 -5
  97. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -1
  98. data/app/controllers/decidim/devise/passwords_controller.rb +1 -1
  99. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  100. data/app/controllers/decidim/doorkeeper/authorizations_controller.rb +19 -1
  101. data/app/controllers/decidim/download_your_data_controller.rb +2 -2
  102. data/app/controllers/decidim/likes_controller.rb +57 -0
  103. data/app/controllers/decidim/links_controller.rb +1 -0
  104. data/app/controllers/decidim/messaging/conversations_controller.rb +1 -8
  105. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  106. data/app/controllers/decidim/notifications_settings_controller.rb +2 -2
  107. data/app/controllers/decidim/pages_controller.rb +0 -1
  108. data/app/controllers/decidim/profiles_controller.rb +2 -57
  109. data/app/controllers/decidim/qr_controller.rb +73 -0
  110. data/app/controllers/decidim/resource_autocomplete_controller.rb +56 -0
  111. data/app/controllers/decidim/user_activities_controller.rb +0 -1
  112. data/app/events/decidim/resource_liked_event.rb +36 -0
  113. data/app/forms/decidim/amendable/create_form.rb +0 -1
  114. data/app/forms/decidim/amendable/edit_form.rb +0 -1
  115. data/app/forms/decidim/amendable/form.rb +4 -4
  116. data/app/forms/decidim/ephemeral_user_form.rb +1 -0
  117. data/app/forms/decidim/notifications_settings_form.rb +1 -1
  118. data/app/forms/decidim/omniauth_registration_form.rb +1 -1
  119. data/app/forms/decidim/upload_validation_form.rb +9 -1
  120. data/app/helpers/decidim/amendments_helper.rb +1 -2
  121. data/app/helpers/decidim/animations_helper.rb +14 -0
  122. data/app/helpers/decidim/decidim_form_helper.rb +17 -6
  123. data/app/helpers/decidim/layout_helper.rb +1 -15
  124. data/app/helpers/decidim/likeable_helper.rb +46 -0
  125. data/app/helpers/decidim/messaging/conversation_helper.rb +1 -1
  126. data/app/helpers/decidim/omniauth_helper.rb +1 -1
  127. data/app/helpers/decidim/qr_code_helper.rb +37 -0
  128. data/app/helpers/decidim/rich_text_editor_helper.rb +0 -1
  129. data/app/helpers/decidim/sanitize_helper.rb +5 -5
  130. data/app/helpers/decidim/social_share_button_helper.rb +11 -10
  131. data/app/jobs/decidim/delete_inactive_participants_job.rb +41 -0
  132. data/app/jobs/decidim/process_inactive_participant_job.rb +48 -0
  133. data/app/mailers/decidim/participants_account_mailer.rb +38 -0
  134. data/app/mailers/decidim/user_group_mailer.rb +49 -0
  135. data/app/models/decidim/action_log.rb +3 -5
  136. data/app/models/decidim/amendment.rb +1 -1
  137. data/app/models/decidim/attachment_collection.rb +2 -0
  138. data/app/models/decidim/authorization_transfer.rb +0 -1
  139. data/app/models/decidim/coauthorship.rb +1 -1
  140. data/app/models/decidim/component.rb +4 -1
  141. data/app/models/decidim/{endorsement.rb → like.rb} +4 -4
  142. data/app/models/decidim/messaging/conversation.rb +3 -5
  143. data/app/models/decidim/messaging/message.rb +3 -15
  144. data/app/models/decidim/omniauth_provider.rb +1 -1
  145. data/app/models/decidim/organization.rb +3 -8
  146. data/app/models/decidim/participatory_space_role_config/{valuator.rb → evaluator.rb} +1 -1
  147. data/app/models/decidim/reminder_record.rb +1 -1
  148. data/app/models/decidim/searchable_resource.rb +16 -0
  149. data/app/models/decidim/taxonomy.rb +6 -1
  150. data/app/models/decidim/user.rb +32 -15
  151. data/app/models/decidim/user_base_entity.rb +2 -2
  152. data/app/packs/entrypoints/decidim_conference_diploma.scss +2 -2
  153. data/app/packs/entrypoints/decidim_core.scss +2 -2
  154. data/app/packs/entrypoints/decidim_editor.js +0 -4
  155. data/app/packs/entrypoints/decidim_map.scss +2 -2
  156. data/app/packs/entrypoints/decidim_overrides.scss +1 -1
  157. data/app/packs/entrypoints/decidim_qr.js +1 -0
  158. data/app/packs/images/decidim/remixicon.symbol.svg +3 -3
  159. data/app/packs/src/decidim/a11y.js +1 -120
  160. data/app/packs/src/decidim/append_redirect_url_to_modals.js +1 -1
  161. data/app/packs/src/decidim/attachments/file_or_link_tabs.js +1 -1
  162. data/app/packs/src/decidim/confirm.js +27 -20
  163. data/app/packs/src/decidim/controllers/.keep +0 -0
  164. data/app/packs/src/decidim/controllers/accordion/controller.js +100 -0
  165. data/app/packs/src/decidim/controllers/account_form/account_form.test.js +423 -0
  166. data/app/packs/src/decidim/controllers/account_form/controller.js +69 -0
  167. data/app/packs/src/decidim/{input_character_counter.js → controllers/character_counter/controller.js} +90 -106
  168. data/app/packs/src/decidim/controllers/clipboard_copy/clipboard_copy.test.js +305 -0
  169. data/app/packs/src/decidim/controllers/clipboard_copy/controller.js +403 -0
  170. data/app/packs/src/decidim/controllers/date_picker/controller.js +12 -0
  171. data/app/packs/src/decidim/controllers/delete_account_form/controller.js +45 -0
  172. data/app/packs/src/decidim/controllers/delete_account_form/delete_account_form.test.js +216 -0
  173. data/app/packs/src/decidim/controllers/dropdown/controller.js +125 -0
  174. data/app/packs/src/decidim/controllers/editor/controller.js +11 -0
  175. data/app/packs/src/decidim/controllers/emoji/controller.js +26 -0
  176. data/app/packs/src/decidim/{input_emoji.js → controllers/emoji/emoji.js} +1 -15
  177. data/app/packs/src/decidim/{form_filter.js → controllers/form_filter/controller.js} +68 -51
  178. data/app/packs/src/decidim/controllers/form_filter/form_filter.test.js +648 -0
  179. data/app/packs/src/decidim/controllers/form_validator/controller.js +23 -0
  180. data/app/packs/src/decidim/controllers/form_validator/form_validator.js +789 -0
  181. data/app/packs/src/decidim/controllers/form_validator/form_validator.test.js +685 -0
  182. data/app/packs/src/decidim/controllers/impersonation_warning/controller.js +137 -0
  183. data/app/packs/src/decidim/controllers/impersonation_warning/impersonation.test.js +382 -0
  184. data/app/packs/src/decidim/controllers/input_tags/controller.js +28 -0
  185. data/app/packs/src/decidim/controllers/mention/controller.js +243 -0
  186. data/app/packs/src/decidim/controllers/mention/input_mentions.test.js +562 -0
  187. data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +215 -0
  188. data/app/packs/src/decidim/controllers/multiple_mentions/input_multiple_mentions.test.js +645 -0
  189. data/app/packs/src/decidim/controllers/notification_action/controller.js +210 -0
  190. data/app/packs/src/decidim/controllers/notification_action/notification_action.test.js +388 -0
  191. data/app/packs/src/decidim/controllers/password_toggler/controller.js +232 -0
  192. data/app/packs/src/decidim/controllers/password_toggler/password_toggler.test.js +229 -0
  193. data/app/packs/src/decidim/controllers/report_form/controller.js +184 -0
  194. data/app/packs/src/decidim/controllers/report_form/report_form_manager.test.js +511 -0
  195. data/app/packs/src/decidim/controllers/scroll_to_last/controller.js +9 -0
  196. data/app/packs/src/decidim/controllers/scroll_to_last/scroll_to_last_child.test.js +225 -0
  197. data/app/packs/src/decidim/controllers/sticky_buttons/controller.js +55 -0
  198. data/app/packs/src/decidim/controllers/sticky_buttons/sticky_buttons.test.js +334 -0
  199. data/app/packs/src/decidim/controllers/sticky_header/controller.js +116 -0
  200. data/app/packs/src/decidim/controllers/sticky_header/sticky_header.test.js +320 -0
  201. data/app/packs/src/decidim/controllers/toggle/controller.js +111 -0
  202. data/app/packs/src/decidim/controllers/toggle/toggle.test.js +260 -0
  203. data/app/packs/src/decidim/controllers/tooltip/controller.js +287 -0
  204. data/app/packs/src/decidim/controllers/tooltip/tooltip.test.js +380 -0
  205. data/app/packs/src/decidim/controllers/user_registration_form/controller.js +160 -0
  206. data/app/packs/src/decidim/controllers/user_registration_form/omniauth_registration_form.test.js +441 -0
  207. data/app/packs/src/decidim/controllers/user_registration_form/user_registration_form.test.js +386 -0
  208. data/app/packs/src/decidim/data_consent/index.js +1 -1
  209. data/app/packs/src/decidim/datalist_select.js +1 -1
  210. data/app/packs/src/decidim/datepicker/form_datepicker.js +1 -1
  211. data/app/packs/src/decidim/datepicker/generate_datepicker.js +2 -2
  212. data/app/packs/src/decidim/datepicker/generate_timepicker.js +2 -2
  213. data/app/packs/src/decidim/direct_uploads/upload_field.js +3 -5
  214. data/app/packs/src/decidim/direct_uploads/upload_modal.js +1 -1
  215. data/app/packs/src/decidim/dropdown_menu.js +1 -1
  216. data/app/packs/src/decidim/editor/common/input_dialog.js +1 -1
  217. data/app/packs/src/decidim/editor/common/suggestion.js +10 -2
  218. data/app/packs/src/decidim/editor/common/upload_dialog.js +1 -1
  219. data/app/packs/src/decidim/editor/extensions/decidim_kit/index.js +7 -7
  220. data/app/packs/src/decidim/editor/extensions/emoji/index.js +2 -3
  221. data/app/packs/src/decidim/editor/extensions/image/index.js +1 -1
  222. data/app/packs/src/decidim/editor/extensions/image/node_view.js +1 -1
  223. data/app/packs/src/decidim/editor/extensions/link/bubble_menu.js +1 -1
  224. data/app/packs/src/decidim/editor/extensions/link/index.js +1 -1
  225. data/app/packs/src/decidim/editor/extensions/mention/index.js +1 -2
  226. data/app/packs/src/decidim/editor/extensions/mention_resource/index.js +69 -0
  227. data/app/packs/src/decidim/editor/extensions/video_embed/index.js +1 -1
  228. data/app/packs/src/decidim/editor/index.js +6 -5
  229. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +1 -2
  230. data/app/packs/src/decidim/editor/test/extensions/emoji.test.js +17 -0
  231. data/app/packs/src/decidim/editor/test/extensions/heading.test.js +2 -2
  232. data/app/packs/src/decidim/editor/toolbar.js +1 -1
  233. data/app/packs/src/decidim/form_attachments.js +1 -1
  234. data/app/packs/src/decidim/geocoding/attach_input.js +3 -0
  235. data/app/packs/src/decidim/geocoding/provider/here.js +1 -1
  236. data/app/packs/src/decidim/geocoding/provider/photon.js +1 -1
  237. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +2 -2
  238. data/app/packs/src/decidim/geocoding.js +2 -2
  239. data/app/packs/src/decidim/index.js +127 -95
  240. data/app/packs/src/decidim/map/integration/forms.js +1 -1
  241. data/app/packs/src/decidim/map/legacy.js +1 -1
  242. data/app/packs/src/decidim/map/provider/default.js +1 -1
  243. data/app/packs/src/decidim/map/provider/here.js +1 -1
  244. data/app/packs/src/decidim/map.js +1 -1
  245. data/app/packs/src/decidim/{external_link.js → refactor/implementation/external_link.js} +1 -1
  246. data/app/packs/src/decidim/{onboarding_pending_action.js → refactor/integration/onboarding_pending_action.js} +4 -4
  247. data/app/packs/src/decidim/{check_boxes_tree.js → refactor/moved/check_boxes_tree.js} +25 -9
  248. data/app/packs/src/decidim/{i18n.test.js → refactor/moved/i18n.test.js} +1 -1
  249. data/app/packs/src/decidim/{icon.js → refactor/moved/icon.js} +2 -0
  250. data/app/packs/src/decidim/refactor/support/stimulus.js +39 -0
  251. data/app/packs/src/decidim/refactor/test/configuration.test.js +360 -0
  252. data/app/packs/src/decidim/{external_domain_warning.test.js → refactor/test/external_domain_warning.test.js} +1 -1
  253. data/app/packs/src/decidim/{external_link.test.js → refactor/test/external_link.test.js} +1 -1
  254. data/app/packs/src/decidim/results_listing.js +2 -2
  255. data/app/packs/src/decidim/security/selfxss_warning.js +1 -1
  256. data/app/packs/src/decidim/session_timeouter.js +1 -1
  257. data/app/packs/src/decidim/sw/push-permissions.js +1 -1
  258. data/app/packs/src/decidim/utilities/dom.js +1 -1
  259. data/app/packs/stylesheets/decidim/_accordion.scss +37 -3
  260. data/app/packs/stylesheets/decidim/_author.scss +7 -22
  261. data/app/packs/stylesheets/decidim/_buttons.scss +4 -0
  262. data/app/packs/stylesheets/decidim/_callout.scss +1 -1
  263. data/app/packs/stylesheets/decidim/_cards.scss +1 -1
  264. data/app/packs/stylesheets/decidim/_content_blocks.scss +1 -1
  265. data/app/packs/stylesheets/decidim/_cookies.scss +1 -1
  266. data/app/packs/stylesheets/decidim/_datepicker.scss +0 -4
  267. data/app/packs/stylesheets/decidim/_dropdown.scss +56 -19
  268. data/app/packs/stylesheets/decidim/_forms.scss +6 -6
  269. data/app/packs/stylesheets/decidim/_header.scss +17 -1
  270. data/app/packs/stylesheets/decidim/_labels.scss +1 -1
  271. data/app/packs/stylesheets/decidim/_layout.scss +12 -2
  272. data/app/packs/stylesheets/decidim/{_endorsers_list.scss → _likes_list.scss} +1 -1
  273. data/app/packs/stylesheets/decidim/_modal.scss +5 -1
  274. data/app/packs/stylesheets/decidim/_modal_share.scss +83 -9
  275. data/app/packs/stylesheets/decidim/_modal_update.scss +1 -5
  276. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +1 -1
  277. data/app/packs/stylesheets/decidim/_rich_text.scss +13 -0
  278. data/app/packs/stylesheets/decidim/_statistics.scss +35 -3
  279. data/app/packs/stylesheets/decidim/_tooltip.scss +1 -1
  280. data/app/packs/stylesheets/decidim/_typography.scss +6 -0
  281. data/app/packs/stylesheets/decidim/_wizard_steps.scss +1 -1
  282. data/app/packs/stylesheets/decidim/application.scss +76 -76
  283. data/app/packs/stylesheets/decidim/editor.scss +11 -12
  284. data/app/packs/stylesheets/decidim/legacy/email.scss +6 -5
  285. data/app/packs/stylesheets/decidim/map.scss +5 -3
  286. data/app/packs/stylesheets/decidim/qr.scss +65 -0
  287. data/app/permissions/decidim/default_permissions.rb +16 -0
  288. data/app/permissions/decidim/permissions.rb +5 -26
  289. data/app/presenters/decidim/admin_log/base_user_presenter.rb +2 -2
  290. data/app/presenters/decidim/admin_log/organization_presenter.rb +0 -15
  291. data/app/presenters/decidim/home_stats_presenter.rb +4 -54
  292. data/app/presenters/decidim/log/base_presenter.rb +1 -1
  293. data/app/presenters/decidim/menu_item_presenter.rb +10 -3
  294. data/app/presenters/decidim/official_author_presenter.rb +0 -4
  295. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +0 -4
  296. data/app/presenters/decidim/resource_locator_presenter.rb +15 -4
  297. data/app/presenters/decidim/resource_presenter.rb +8 -8
  298. data/app/presenters/decidim/stats_presenter.rb +39 -60
  299. data/app/presenters/decidim/taxonomy_presenter.rb +5 -1
  300. data/app/presenters/decidim/user_presenter.rb +0 -6
  301. data/app/queries/decidim/authorized_users.rb +26 -0
  302. data/app/queries/decidim/inactive_users_query.rb +31 -0
  303. data/app/queries/decidim/public_activities.rb +2 -2
  304. data/app/queries/decidim/stats_followers_count.rb +43 -0
  305. data/app/queries/decidim/stats_participants_count.rb +102 -0
  306. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +1 -5
  307. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +0 -1
  308. data/app/services/decidim/action_logger.rb +2 -1
  309. data/app/services/decidim/base_diff_renderer.rb +0 -17
  310. data/app/services/decidim/onboarding_manager.rb +4 -0
  311. data/app/services/decidim/open_data_exporter.rb +19 -11
  312. data/app/services/decidim/send_push_notification.rb +4 -3
  313. data/app/services/decidim/traceability.rb +1 -1
  314. data/app/validators/etiquette_validator.rb +7 -0
  315. data/app/validators/translated_etiquette_validator.rb +1 -0
  316. data/app/views/decidim/account/_old_password_field.html.erb +1 -1
  317. data/app/views/decidim/account/_password_fields.html.erb +1 -1
  318. data/app/views/decidim/account/delete.html.erb +1 -1
  319. data/app/views/decidim/account/show.html.erb +3 -3
  320. data/app/views/decidim/amendments/edit_draft.html.erb +0 -4
  321. data/app/views/decidim/amendments/new.html.erb +0 -4
  322. data/app/views/decidim/amendments/preview_draft.html.erb +1 -1
  323. data/app/views/decidim/application/_accordion_section.html.erb +1 -1
  324. data/app/views/decidim/application/_collection.html.erb +1 -1
  325. data/app/views/decidim/application/_radio_accordion.html.erb +30 -0
  326. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +1 -1
  327. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +1 -1
  328. data/app/views/decidim/devise/registrations/new.html.erb +1 -1
  329. data/app/views/decidim/devise/shared/_links.html.erb +1 -1
  330. data/app/views/decidim/doorkeeper/authorizations/new.html.erb +39 -8
  331. data/app/views/decidim/errors/internal_server_error.html.erb +1 -0
  332. data/app/views/decidim/likes/update_buttons_and_counters.js.erb +21 -0
  333. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +2 -2
  334. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +1 -1
  335. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  336. data/app/views/decidim/messaging/conversations/create.js.erb +0 -1
  337. data/app/views/decidim/messaging/conversations/new.html.erb +1 -1
  338. data/app/views/decidim/messaging/conversations/show.html.erb +1 -1
  339. data/app/views/decidim/notifications_settings/show.html.erb +3 -3
  340. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  341. data/app/views/decidim/pages/index.html.erb +1 -1
  342. data/app/views/decidim/participants_account_mailer/inactivity_notification.html.erb +13 -0
  343. data/app/views/decidim/participants_account_mailer/removal_notification.html.erb +11 -0
  344. data/app/views/decidim/profiles/show.html.erb +1 -1
  345. data/app/views/decidim/qr/show.html.erb +28 -0
  346. data/app/views/decidim/searches/_filters.html.erb +18 -2
  347. data/app/views/decidim/searches/index.html.erb +5 -2
  348. data/app/views/decidim/shared/_confirm_modal.html.erb +5 -3
  349. data/app/views/decidim/shared/_filters.html.erb +2 -2
  350. data/app/views/decidim/shared/_orders.html.erb +1 -1
  351. data/app/views/decidim/shared/_resource_actions.html.erb +8 -5
  352. data/app/views/decidim/user_activities/index.html.erb +1 -1
  353. data/app/views/decidim/user_group_mailer/notify_deprecation_to_member.html.erb +18 -0
  354. data/app/views/decidim/user_group_mailer/notify_deprecation_to_owner.html.erb +19 -0
  355. data/app/views/decidim/user_group_mailer/notify_user_group_patched.html.erb +21 -0
  356. data/app/views/layouts/decidim/_head.html.erb +15 -12
  357. data/app/views/layouts/decidim/_impersonation_warning.html.erb +1 -1
  358. data/app/views/layouts/decidim/_js_configuration.html.erb +17 -19
  359. data/app/views/layouts/decidim/_meta_tags_context.html.erb +3 -0
  360. data/app/views/layouts/decidim/_offline_banner.html.erb +1 -1
  361. data/app/views/layouts/decidim/_wrapper.html.erb +8 -6
  362. data/app/views/layouts/decidim/footer/_focus_mode_main.html.erb +7 -0
  363. data/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +1 -1
  364. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +12 -2
  365. data/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +24 -0
  366. data/app/views/layouts/decidim/header/_main.html.erb +28 -22
  367. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +1 -1
  368. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +18 -18
  369. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +1 -1
  370. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +1 -1
  371. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +1 -1
  372. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +1 -1
  373. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +1 -1
  374. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +1 -1
  375. data/app/views/layouts/decidim/mailer.html.erb +2 -2
  376. data/app/views/layouts/decidim/newsletter_base.html.erb +2 -2
  377. data/app/views/layouts/decidim/shared/_layout_two_col.html.erb +3 -1
  378. data/app/views/layouts/decidim/shared/_layout_user_profile.html.erb +7 -3
  379. data/config/assets.rb +3 -3
  380. data/config/initializers/devise.rb +8 -0
  381. data/config/initializers/omniauth.rb +1 -1
  382. data/config/locales/ar.yml +0 -209
  383. data/config/locales/bg.yml +0 -238
  384. data/config/locales/bs-BA.yml +0 -30
  385. data/config/locales/ca-IT.yml +122 -286
  386. data/config/locales/ca.yml +122 -286
  387. data/config/locales/cs.yml +84 -284
  388. data/config/locales/de.yml +102 -285
  389. data/config/locales/el.yml +0 -224
  390. data/config/locales/en.yml +122 -286
  391. data/config/locales/eo.yml +0 -2
  392. data/config/locales/es-MX.yml +122 -286
  393. data/config/locales/es-PY.yml +122 -286
  394. data/config/locales/es.yml +122 -286
  395. data/config/locales/eu.yml +114 -287
  396. data/config/locales/fi-plain.yml +112 -286
  397. data/config/locales/fi.yml +112 -286
  398. data/config/locales/fr-CA.yml +85 -275
  399. data/config/locales/fr.yml +85 -275
  400. data/config/locales/ga-IE.yml +0 -28
  401. data/config/locales/gl.yml +0 -140
  402. data/config/locales/hu.yml +0 -237
  403. data/config/locales/id-ID.yml +0 -136
  404. data/config/locales/is-IS.yml +0 -14
  405. data/config/locales/it.yml +1 -234
  406. data/config/locales/ja.yml +97 -282
  407. data/config/locales/lb.yml +0 -189
  408. data/config/locales/lt.yml +0 -240
  409. data/config/locales/lv.yml +0 -186
  410. data/config/locales/nl.yml +0 -189
  411. data/config/locales/no.yml +0 -189
  412. data/config/locales/pl.yml +0 -244
  413. data/config/locales/pt-BR.yml +0 -213
  414. data/config/locales/pt.yml +0 -189
  415. data/config/locales/ro-RO.yml +54 -218
  416. data/config/locales/ru.yml +0 -62
  417. data/config/locales/sk.yml +0 -164
  418. data/config/locales/sr-CS.yml +0 -31
  419. data/config/locales/sv.yml +80 -263
  420. data/config/locales/tr-TR.yml +0 -189
  421. data/config/locales/uk.yml +0 -23
  422. data/config/locales/zh-CN.yml +0 -180
  423. data/config/locales/zh-TW.yml +0 -229
  424. data/config/routes.rb +3 -36
  425. data/db/migrate/20250217192438_convert_user_groups_into_users.rb +56 -0
  426. data/db/migrate/20250221085317_add_user_type_to_action_logs.rb +12 -0
  427. data/db/migrate/20250221090905_create_decidim_api_jwt_denylist.rb +11 -0
  428. data/db/migrate/20250221091348_add_api_key_to_decidim_api_user.rb +7 -0
  429. data/db/migrate/20250327143657_remove_metrics_content_blocks.rb +9 -0
  430. data/db/migrate/20250401153444_enable_pkce.rb +8 -0
  431. data/db/migrate/20250416130426_rename_doorkeeper_scopes.rb +25 -0
  432. data/db/migrate/20250515105231_rename_endorsements_to_likes.rb +62 -0
  433. data/db/migrate/20250523104311_move_cta_to_hero_content_block.rb +34 -0
  434. data/db/migrate/20250527122040_move_highlighted_content_banner_settings_to_content_block.rb +69 -0
  435. data/db/migrate/20250603103953_add_refresh_tokens_enabled_to_doorkeeper_applications.rb +7 -0
  436. data/db/migrate/20250609073104_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb +10 -0
  437. data/db/migrate/20250613122148_remove_hashtag_table_from_core.rb +7 -0
  438. data/decidim-core.gemspec +4 -4
  439. data/{app/helpers → lib}/decidim/action_authorization_helper.rb +5 -4
  440. data/lib/decidim/amendable.rb +4 -4
  441. data/lib/decidim/api/functions/user_entity_finder.rb +1 -1
  442. data/lib/decidim/api/input_filters/component_input_filter.rb +3 -3
  443. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +0 -21
  444. data/lib/decidim/api/input_sorts/has_likeable_input_sort.rb +15 -0
  445. data/lib/decidim/api/interfaces/attachable_collection_interface.rb +13 -0
  446. data/lib/decidim/api/interfaces/author_interface.rb +1 -2
  447. data/lib/decidim/api/interfaces/authorable_interface.rb +2 -2
  448. data/lib/decidim/api/interfaces/coauthorable_interface.rb +1 -1
  449. data/lib/decidim/api/interfaces/component_interface.rb +6 -0
  450. data/lib/decidim/api/interfaces/followable_interface.rb +13 -0
  451. data/lib/decidim/api/interfaces/likeable_interface.rb +19 -0
  452. data/lib/decidim/api/interfaces/localizable_interface.rb +18 -0
  453. data/lib/decidim/api/interfaces/participatory_space_interface.rb +6 -8
  454. data/lib/decidim/api/interfaces/referable_interface.rb +13 -0
  455. data/lib/decidim/api/interfaces/timestamps_interface.rb +0 -1
  456. data/lib/decidim/api/interfaces/traceable_interface.rb +1 -1
  457. data/lib/decidim/api/types/attachment_collection_type.rb +14 -0
  458. data/lib/decidim/api/types/organization_type.rb +3 -1
  459. data/lib/decidim/api/types/session_type.rb +0 -5
  460. data/lib/decidim/api/types/statistic_type.rb +29 -3
  461. data/lib/decidim/api/types/trace_version_type.rb +1 -1
  462. data/lib/decidim/api/types/user_type.rb +1 -2
  463. data/lib/decidim/api_response_helper.rb +12 -0
  464. data/lib/decidim/asset_router/storage.rb +2 -4
  465. data/lib/decidim/assets/tailwind/instance.rb +1 -1
  466. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +4 -3
  467. data/lib/decidim/attribute_encryptor.rb +1 -1
  468. data/lib/decidim/attributes/time_with_zone.rb +1 -1
  469. data/lib/decidim/authorable.rb +5 -34
  470. data/lib/decidim/coauthorable.rb +13 -31
  471. data/lib/decidim/content_parsers/blob_parser.rb +1 -1
  472. data/lib/decidim/content_parsers/mention_resource_parser.rb +23 -0
  473. data/lib/decidim/content_parsers/tag_parser.rb +2 -2
  474. data/lib/decidim/content_parsers/user_parser.rb +2 -2
  475. data/lib/decidim/content_parsers.rb +14 -2
  476. data/lib/decidim/content_processor.rb +1 -1
  477. data/lib/decidim/content_renderers/mention_resource_renderer.rb +77 -0
  478. data/lib/decidim/content_renderers.rb +1 -2
  479. data/lib/decidim/core/api.rb +7 -8
  480. data/lib/decidim/core/content_blocks/registry_manager.rb +19 -5
  481. data/lib/decidim/core/engine.rb +72 -104
  482. data/lib/decidim/core/menu.rb +0 -7
  483. data/lib/decidim/core/seeds.rb +11 -39
  484. data/lib/decidim/core/test/factories.rb +22 -121
  485. data/lib/decidim/core/test/shared_examples/authorable.rb +0 -17
  486. data/lib/decidim/core/test/shared_examples/coauthorable.rb +5 -48
  487. data/lib/decidim/core/test/shared_examples/comments_examples.rb +7 -56
  488. data/lib/decidim/core/test/shared_examples/likeable.rb +22 -0
  489. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +16 -3
  490. data/lib/decidim/core/test/shared_examples/map_examples.rb +1 -1
  491. data/lib/decidim/core/test/shared_examples/oauth_application_examples.rb +137 -0
  492. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +0 -18
  493. data/lib/decidim/core/test/shared_examples/permissions.rb +0 -46
  494. data/lib/decidim/core/test/shared_examples/reports_examples.rb +2 -2
  495. data/lib/decidim/core/test/shared_examples/{resource_endorsed_event_examples.rb → resource_liked_event_examples.rb} +7 -7
  496. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +0 -14
  497. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +8 -34
  498. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +79 -0
  499. data/lib/decidim/core/test/shared_examples/system_like_resource_examples.rb +192 -0
  500. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +2 -2
  501. data/lib/decidim/core/test/shared_examples/{with_endorsable_permissions_examples.rb → with_likeable_permissions_examples.rb} +22 -22
  502. data/lib/decidim/core/test.rb +6 -9
  503. data/lib/decidim/core/version.rb +1 -1
  504. data/lib/decidim/core.rb +237 -88
  505. data/lib/decidim/deprecations.rb +1 -1
  506. data/lib/decidim/download_your_data_serializers.rb +6 -3
  507. data/lib/decidim/env.rb +3 -1
  508. data/lib/decidim/events.rb +0 -1
  509. data/lib/decidim/form_builder.rb +26 -43
  510. data/lib/decidim/gamification/badge_scorer.rb +0 -2
  511. data/lib/decidim/gamification.rb +1 -1
  512. data/lib/decidim/has_conversations.rb +0 -44
  513. data/lib/decidim/has_workflows.rb +42 -0
  514. data/lib/decidim/icon_registry.rb +4 -4
  515. data/lib/decidim/legacy_form_builder.rb +17 -2
  516. data/lib/decidim/likeable.rb +24 -0
  517. data/lib/decidim/manifest_registry.rb +1 -1
  518. data/lib/decidim/map/provider/dynamic_map/here.rb +0 -19
  519. data/lib/decidim/map/provider/static_map/here.rb +2 -10
  520. data/lib/decidim/menu.rb +1 -1
  521. data/lib/decidim/moderation_tools.rb +1 -1
  522. data/lib/decidim/mutation_registry.rb +17 -0
  523. data/lib/decidim/newsletter_encryptor.rb +1 -1
  524. data/lib/decidim/oauth/token_generator.rb +35 -0
  525. data/lib/decidim/oauth.rb +7 -0
  526. data/lib/decidim/organization_settings.rb +2 -10
  527. data/lib/decidim/paddable.rb +1 -1
  528. data/lib/decidim/participatory_space_resourceable.rb +2 -2
  529. data/lib/decidim/participatory_space_user.rb +1 -1
  530. data/lib/decidim/pdf_signature_example.rb +108 -0
  531. data/lib/decidim/query.rb +1 -1
  532. data/lib/decidim/query_extensions.rb +0 -33
  533. data/lib/decidim/reportable.rb +1 -1
  534. data/lib/decidim/searchable.rb +4 -2
  535. data/lib/decidim/seeds.rb +8 -0
  536. data/lib/decidim/settings_manifest.rb +3 -2
  537. data/lib/decidim/{webpacker → shakapacker}/configuration.rb +4 -4
  538. data/lib/decidim/{webpacker → shakapacker}/runner.rb +3 -3
  539. data/lib/decidim/shakapacker/shakapacker.rb +8 -0
  540. data/lib/decidim/{webpacker → shakapacker}/shakapacker.yml +3 -1
  541. data/lib/decidim/{webpacker → shakapacker}/webpack/custom.js +1 -1
  542. data/lib/decidim/shakapacker.rb +34 -0
  543. data/lib/decidim/social_share_service_manifest.rb +7 -12
  544. data/lib/decidim/stats_registry.rb +15 -3
  545. data/{app/helpers → lib}/decidim/tooltip_helper.rb +3 -3
  546. data/lib/decidim/url_option_resolver.rb +1 -1
  547. data/lib/decidim/view_model.rb +0 -3
  548. data/lib/decidim/webpacker.rb +11 -20
  549. data/lib/decidim/workflow_registry.rb +61 -0
  550. data/lib/tasks/decidim_participants_tasks.rake +22 -0
  551. data/lib/tasks/{decidim_webpacker_tasks.rake → decidim_shakapacker_tasks.rake} +35 -33
  552. data/lib/tasks/decidim_tasks.rake +4 -1
  553. data/lib/tasks/decidim_taxonomies.rake +0 -34
  554. data/lib/tasks/upgrade/clean.rake +1 -1
  555. data/lib/tasks/upgrade/decidim_action_log_valuation_assignment.rake +13 -0
  556. data/lib/tasks/upgrade/decidim_change_valuator_tasks.rake +12 -0
  557. data/lib/tasks/upgrade/{decidim_deduplicate_endorsements.rake → decidim_deduplicate_likes.rake} +10 -10
  558. data/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake +2 -2
  559. data/lib/tasks/upgrade/decidim_paper_trail_valuation_assignment.rake +13 -0
  560. data/lib/tasks/upgrade/user_groups_migration.rake +188 -0
  561. metadata +204 -255
  562. data/app/cells/decidim/author/endorsements.erb +0 -4
  563. data/app/cells/decidim/author/profile_minicard.erb +0 -30
  564. data/app/cells/decidim/content_blocks/organization_metrics_cell.rb +0 -21
  565. data/app/cells/decidim/content_blocks/participatory_space_metrics/content.erb +0 -18
  566. data/app/cells/decidim/content_blocks/participatory_space_metrics_cell.rb +0 -43
  567. data/app/cells/decidim/endorsement_block/show.erb +0 -3
  568. data/app/cells/decidim/endorsement_buttons/button_content.erb +0 -2
  569. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +0 -7
  570. data/app/cells/decidim/endorsement_buttons/show.erb +0 -17
  571. data/app/cells/decidim/endorsement_buttons_cell.rb +0 -87
  572. data/app/cells/decidim/endorsers_list/empty.erb +0 -3
  573. data/app/cells/decidim/endorsers_list/show.erb +0 -20
  574. data/app/cells/decidim/endorsers_list_cell.rb +0 -64
  575. data/app/cells/decidim/group_admins/show.erb +0 -34
  576. data/app/cells/decidim/group_admins_cell.rb +0 -8
  577. data/app/cells/decidim/group_members/show.erb +0 -46
  578. data/app/cells/decidim/group_members_cell.rb +0 -8
  579. data/app/cells/decidim/groups/show.erb +0 -14
  580. data/app/cells/decidim/groups_cell.rb +0 -22
  581. data/app/cells/decidim/members/show.erb +0 -12
  582. data/app/cells/decidim/members_cell.rb +0 -34
  583. data/app/cells/decidim/profile_actions/dropdown_actions.erb +0 -21
  584. data/app/cells/decidim/represent_user_group/show.erb +0 -11
  585. data/app/cells/decidim/represent_user_group_cell.rb +0 -46
  586. data/app/cells/decidim/user_conversation/conversation_header.erb +0 -14
  587. data/app/cells/decidim/user_conversation/messages.erb +0 -1
  588. data/app/cells/decidim/user_conversation/new.erb +0 -6
  589. data/app/cells/decidim/user_conversation/reply.erb +0 -9
  590. data/app/cells/decidim/user_conversation/show.erb +0 -19
  591. data/app/cells/decidim/user_conversation/start.erb +0 -12
  592. data/app/cells/decidim/user_conversation_cell.rb +0 -62
  593. data/app/cells/decidim/user_conversations/new_conversation_button.erb +0 -20
  594. data/app/cells/decidim/user_conversations/show.erb +0 -13
  595. data/app/cells/decidim/user_conversations_cell.rb +0 -28
  596. data/app/cells/decidim/user_group_pending_invitations_list/show.erb +0 -28
  597. data/app/cells/decidim/user_group_pending_invitations_list_cell.rb +0 -26
  598. data/app/cells/decidim/user_group_pending_requests_list/show.erb +0 -27
  599. data/app/cells/decidim/user_group_pending_requests_list_cell.rb +0 -26
  600. data/app/commands/decidim/accept_group_invitation.rb +0 -43
  601. data/app/commands/decidim/accept_user_group_join_request.rb +0 -53
  602. data/app/commands/decidim/create_user_group.rb +0 -73
  603. data/app/commands/decidim/demote_membership.rb +0 -57
  604. data/app/commands/decidim/endorse_resource.rb +0 -66
  605. data/app/commands/decidim/invite_user_to_group.rb +0 -63
  606. data/app/commands/decidim/join_user_group.rb +0 -57
  607. data/app/commands/decidim/leave_user_group.rb +0 -47
  608. data/app/commands/decidim/promote_membership.rb +0 -55
  609. data/app/commands/decidim/reject_group_invitation.rb +0 -42
  610. data/app/commands/decidim/reject_user_group_join_request.rb +0 -53
  611. data/app/commands/decidim/remove_user_from_group.rb +0 -53
  612. data/app/commands/decidim/unendorse_resource.rb +0 -39
  613. data/app/commands/decidim/update_user_group.rb +0 -72
  614. data/app/controllers/concerns/decidim/user_groups.rb +0 -23
  615. data/app/controllers/decidim/endorsements_controller.rb +0 -71
  616. data/app/controllers/decidim/group_email_confirmations_controller.rb +0 -32
  617. data/app/controllers/decidim/group_invites_controller.rb +0 -104
  618. data/app/controllers/decidim/group_members_controller.rb +0 -75
  619. data/app/controllers/decidim/groups_controller.rb +0 -99
  620. data/app/controllers/decidim/own_user_groups_controller.rb +0 -15
  621. data/app/controllers/decidim/user_conversations_controller.rb +0 -133
  622. data/app/controllers/decidim/user_group_join_requests_controller.rb +0 -72
  623. data/app/events/decidim/demoted_membership_event.rb +0 -28
  624. data/app/events/decidim/invited_to_group_event.rb +0 -62
  625. data/app/events/decidim/join_request_accepted_event.rb +0 -28
  626. data/app/events/decidim/join_request_created_event.rb +0 -28
  627. data/app/events/decidim/join_request_rejected_event.rb +0 -28
  628. data/app/events/decidim/promoted_to_admin_event.rb +0 -28
  629. data/app/events/decidim/removed_from_group_event.rb +0 -28
  630. data/app/events/decidim/resource_endorsed_event.rb +0 -36
  631. data/app/events/decidim/user_group_admin_event.rb +0 -37
  632. data/app/events/decidim/user_group_created_event.rb +0 -6
  633. data/app/events/decidim/user_group_updated_event.rb +0 -6
  634. data/app/forms/decidim/invite_user_to_group_form.rb +0 -29
  635. data/app/forms/decidim/user_group_form.rb +0 -87
  636. data/app/helpers/decidim/cta_button_helper.rb +0 -31
  637. data/app/helpers/decidim/endorsable_helper.rb +0 -84
  638. data/app/helpers/decidim/twitter_search_helper.rb +0 -14
  639. data/app/helpers/decidim/user_group_helper.rb +0 -22
  640. data/app/jobs/decidim/metric_job.rb +0 -15
  641. data/app/models/decidim/metric.rb +0 -25
  642. data/app/models/decidim/user_group.rb +0 -217
  643. data/app/models/decidim/user_group_membership.rb +0 -17
  644. data/app/packs/entrypoints/decidim_widget.js +0 -1
  645. data/app/packs/src/decidim/abide_form_validator_fixer.js +0 -44
  646. data/app/packs/src/decidim/account_form.js +0 -96
  647. data/app/packs/src/decidim/append_elements.js +0 -6
  648. data/app/packs/src/decidim/back_to_list.js +0 -26
  649. data/app/packs/src/decidim/change_report_form_behavior.js +0 -45
  650. data/app/packs/src/decidim/clipboard.js +0 -128
  651. data/app/packs/src/decidim/editor/extensions/hashtag/index.js +0 -66
  652. data/app/packs/src/decidim/editor/extensions/heading/index.js +0 -33
  653. data/app/packs/src/decidim/editor/test/extensions/hashtag.test.js +0 -105
  654. data/app/packs/src/decidim/form_filter.component_for_testing.js +0 -7
  655. data/app/packs/src/decidim/form_validator.js +0 -56
  656. data/app/packs/src/decidim/gallery.js +0 -5
  657. data/app/packs/src/decidim/impersonation.js +0 -23
  658. data/app/packs/src/decidim/input_autojump.js +0 -38
  659. data/app/packs/src/decidim/input_hashtags.js +0 -91
  660. data/app/packs/src/decidim/input_mentions.js +0 -143
  661. data/app/packs/src/decidim/input_multiple_mentions.js +0 -115
  662. data/app/packs/src/decidim/input_tags.js +0 -16
  663. data/app/packs/src/decidim/notifications_actions.js +0 -40
  664. data/app/packs/src/decidim/password_toggler.js +0 -104
  665. data/app/packs/src/decidim/remote_tooltips.js +0 -38
  666. data/app/packs/src/decidim/responsive_horizontal_tabs.js +0 -12
  667. data/app/packs/src/decidim/scroll_to_last_child.js +0 -14
  668. data/app/packs/src/decidim/slug_form.js +0 -9
  669. data/app/packs/src/decidim/sticky_footer.js +0 -48
  670. data/app/packs/src/decidim/sticky_header.js +0 -62
  671. data/app/packs/src/decidim/toggle.js +0 -37
  672. data/app/packs/src/decidim/tooltips.js +0 -152
  673. data/app/packs/src/decidim/user_registrations.js +0 -65
  674. data/app/packs/src/decidim/vizzs/areachart.js +0 -251
  675. data/app/packs/src/decidim/vizzs/index.js +0 -82
  676. data/app/packs/src/decidim/widget.js +0 -14
  677. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  678. data/app/packs/stylesheets/decidim/_metrics.scss +0 -70
  679. data/app/packs/stylesheets/decidim/_modal_identities.scss +0 -23
  680. data/app/presenters/decidim/admin_log/user_group_presenter.rb +0 -31
  681. data/app/presenters/decidim/hashtag_presenter.rb +0 -37
  682. data/app/presenters/decidim/metric_charts_presenter.rb +0 -92
  683. data/app/presenters/decidim/metric_object_presenter.rb +0 -32
  684. data/app/presenters/decidim/user_group_presenter.rb +0 -38
  685. data/app/queries/decidim/metric_manage.rb +0 -81
  686. data/app/queries/decidim/metric_measure.rb +0 -36
  687. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +0 -26
  688. data/app/queries/decidim/metrics/followers_metric_manage.rb +0 -65
  689. data/app/queries/decidim/metrics/participants_metric_manage.rb +0 -79
  690. data/app/queries/decidim/metrics/reported_users_metric_manage.rb +0 -26
  691. data/app/queries/decidim/metrics/user_reports_metric_manage.rb +0 -26
  692. data/app/queries/decidim/metrics/users_metric_manage.rb +0 -26
  693. data/app/queries/decidim/user_groups/accepted_memberships.rb +0 -36
  694. data/app/queries/decidim/user_groups/accepted_user_groups.rb +0 -38
  695. data/app/queries/decidim/user_groups/accepted_users.rb +0 -36
  696. data/app/queries/decidim/user_groups/admin_memberships.rb +0 -37
  697. data/app/queries/decidim/user_groups/invited_memberships.rb +0 -36
  698. data/app/queries/decidim/user_groups/manageable_user_groups.rb +0 -39
  699. data/app/queries/decidim/user_groups/member_memberships.rb +0 -37
  700. data/app/resolvers/decidim/core/metric_resolver.rb +0 -71
  701. data/app/resolvers/decidim/hashtags_resolver.rb +0 -15
  702. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +0 -22
  703. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +0 -38
  704. data/app/views/decidim/endorsements/_identity.html.erb +0 -4
  705. data/app/views/decidim/endorsements/identities.html.erb +0 -18
  706. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +0 -25
  707. data/app/views/decidim/group_invites/index.html.erb +0 -26
  708. data/app/views/decidim/groups/_form.html.erb +0 -17
  709. data/app/views/decidim/groups/edit.html.erb +0 -19
  710. data/app/views/decidim/groups/new.html.erb +0 -23
  711. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_conversation.html.erb +0 -17
  712. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_message.html.erb +0 -17
  713. data/app/views/decidim/messaging/conversation_mailer/new_group_conversation.html.erb +0 -17
  714. data/app/views/decidim/messaging/conversation_mailer/new_group_message.html.erb +0 -17
  715. data/app/views/decidim/own_user_groups/index.html.erb +0 -10
  716. data/app/views/decidim/shared/_extended_navigation_bar.html.erb +0 -50
  717. data/app/views/decidim/user_conversations/index.html.erb +0 -4
  718. data/app/views/decidim/user_conversations/show.html.erb +0 -4
  719. data/app/views/decidim/user_conversations/update.js.erb +0 -8
  720. data/config/initializers/new_framework_defaults_7_0.rb +0 -145
  721. data/lib/decidim/api/input_filters/has_hastaggable_input_filter.rb +0 -15
  722. data/lib/decidim/api/input_sorts/has_endorsable_input_sort.rb +0 -15
  723. data/lib/decidim/api/interfaces/endorsable_interface.rb +0 -19
  724. data/lib/decidim/api/types/hashtag_type.rb +0 -13
  725. data/lib/decidim/api/types/metric_history_type.rb +0 -20
  726. data/lib/decidim/api/types/metric_type.rb +0 -13
  727. data/lib/decidim/api/types/user_group_type.rb +0 -55
  728. data/lib/decidim/content_parsers/hashtag_parser.rb +0 -66
  729. data/lib/decidim/content_parsers/user_group_parser.rb +0 -33
  730. data/lib/decidim/content_renderers/hashtag_renderer.rb +0 -78
  731. data/lib/decidim/content_renderers/user_group_renderer.rb +0 -31
  732. data/lib/decidim/core/test/shared_examples/amendable_interface_examples.rb +0 -14
  733. data/lib/decidim/core/test/shared_examples/amendable_proposals_interface_examples.rb +0 -50
  734. data/lib/decidim/core/test/shared_examples/assembly_announcements_examples.rb +0 -38
  735. data/lib/decidim/core/test/shared_examples/attachable_interface_examples.rb +0 -16
  736. data/lib/decidim/core/test/shared_examples/authorable_interface_examples.rb +0 -59
  737. data/lib/decidim/core/test/shared_examples/categories_container_examples.rb +0 -22
  738. data/lib/decidim/core/test/shared_examples/categorizable_interface_examples.rb +0 -27
  739. data/lib/decidim/core/test/shared_examples/coauthorable_interface_examples.rb +0 -91
  740. data/lib/decidim/core/test/shared_examples/endorsable.rb +0 -69
  741. data/lib/decidim/core/test/shared_examples/endorsable_interface_examples.rb +0 -22
  742. data/lib/decidim/core/test/shared_examples/fingerprintable_interface_examples.rb +0 -17
  743. data/lib/decidim/core/test/shared_examples/input_filter_examples.rb +0 -118
  744. data/lib/decidim/core/test/shared_examples/input_sort_examples.rb +0 -126
  745. data/lib/decidim/core/test/shared_examples/metric_manage_shared_context.rb +0 -9
  746. data/lib/decidim/core/test/shared_examples/participatory_space_resourcable_interface_examples.rb +0 -43
  747. data/lib/decidim/core/test/shared_examples/process_announcements_examples.rb +0 -37
  748. data/lib/decidim/core/test/shared_examples/scopable_interface_examples.rb +0 -19
  749. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +0 -298
  750. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +0 -20
  751. data/lib/decidim/core/test/shared_examples/timestamps_interface_examples.rb +0 -21
  752. data/lib/decidim/core/test/shared_examples/traceable_interface_examples.rb +0 -47
  753. data/lib/decidim/download_your_data_serializers/download_your_data_user_group_serializer.rb +0 -21
  754. data/lib/decidim/endorsable.rb +0 -29
  755. data/lib/decidim/events/user_group_event.rb +0 -43
  756. data/lib/decidim/hashtag.rb +0 -13
  757. data/lib/decidim/metric_manifest.rb +0 -35
  758. data/lib/decidim/metric_operation.rb +0 -58
  759. data/lib/decidim/metric_operation_manifest.rb +0 -21
  760. data/lib/decidim/metric_registry.rb +0 -109
  761. data/lib/gem_overrides/shakapacker/runner.rb +0 -9
  762. data/lib/tasks/decidim_metrics_tasks.rake +0 -89
  763. /data/app/cells/decidim/{endorsement_buttons/disabled_endorsements.erb → like_buttons/disabled_likes.erb} +0 -0
  764. /data/app/packs/src/decidim/{configuration.js → refactor/implementation/configuration.js} +0 -0
  765. /data/app/packs/src/decidim/{external_domain_warning.js → refactor/implementation/external_domain_warning.js} +0 -0
  766. /data/app/packs/src/decidim/{autocomplete.js → refactor/moved/autocomplete.js} +0 -0
  767. /data/app/packs/src/decidim/{delayed.js → refactor/moved/delayed.js} +0 -0
  768. /data/app/packs/src/decidim/{focus_guard.js → refactor/moved/focus_guard.js} +0 -0
  769. /data/app/packs/src/decidim/{history.js → refactor/moved/history.js} +0 -0
  770. /data/app/packs/src/decidim/{i18n.js → refactor/moved/i18n.js} +0 -0
  771. /data/lib/decidim/core/test/shared_examples/{endorsements_controller_shared_context.rb → likes_controller_shared_context.rb} +0 -0
  772. /data/{app/helpers → lib}/decidim/resource_helper.rb +0 -0
  773. /data/lib/decidim/{webpacker → shakapacker}/esbuild.config.js +0 -0
  774. /data/lib/decidim/{webpacker → shakapacker}/postcss.config.js +0 -0
  775. /data/lib/decidim/{webpacker → shakapacker}/tsconfig.json +0 -0
  776. /data/lib/decidim/{webpacker → shakapacker}/webpack/.modernizrrc +0 -0
  777. /data/lib/decidim/{webpacker → shakapacker}/webpack/webpack.config.js +0 -0
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- # The form object that handles the data behind creating a user group.
5
- class UserGroupForm < Form
6
- include Decidim::HasUploadValidations
7
-
8
- mimic :group
9
-
10
- attribute :name
11
- attribute :nickname
12
- attribute :email
13
- attribute :avatar, Decidim::Attributes::Blob
14
- attribute :about
15
- attribute :document_number
16
- attribute :phone
17
-
18
- validates :name, presence: true
19
- validates :name, format: { with: Decidim::UserBaseEntity::REGEXP_NAME }
20
- validates :email, presence: true, "valid_email_2/email": { disposable: true }
21
- validates :nickname, presence: true
22
-
23
- validates :nickname, length: { maximum: Decidim::User.nickname_max_length, allow_blank: true }
24
- validates :nickname, format: { with: Decidim::UserBaseEntity::REGEXP_NICKNAME }
25
- validates :avatar, passthru: { to: Decidim::UserGroup }
26
-
27
- validate :unique_document_number
28
- validate :unique_email
29
- validate :unique_name
30
- validate :unique_nickname
31
-
32
- alias organization current_organization
33
-
34
- private
35
-
36
- def unique_document_number
37
- return if document_number.blank?
38
-
39
- errors.add :document_number, :taken if UserGroup
40
- .with_document_number(
41
- context.current_organization,
42
- document_number
43
- )
44
- .where.not(id:)
45
- .present?
46
- end
47
-
48
- def unique_email
49
- return true if Decidim::UserBaseEntity
50
- .where(
51
- organization: context.current_organization,
52
- email:
53
- )
54
- .where.not(id:)
55
- .empty?
56
-
57
- errors.add :email, :taken
58
- false
59
- end
60
-
61
- def unique_name
62
- return true if Decidim::UserBaseEntity
63
- .where(
64
- organization: context.current_organization,
65
- name:
66
- )
67
- .where.not(id:)
68
- .empty?
69
-
70
- errors.add :name, :taken
71
- false
72
- end
73
-
74
- def unique_nickname
75
- return true if Decidim::UserBaseEntity
76
- .where(
77
- organization: context.current_organization,
78
- nickname:
79
- )
80
- .where.not(id:)
81
- .empty?
82
-
83
- errors.add :nickname, :taken
84
- false
85
- end
86
- end
87
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- # A Helper to render the Call To Action button.
5
- module CtaButtonHelper
6
- # Renders the Call To Action button. Link and text can be configured
7
- # per organization.
8
- def cta_button_text
9
- translated_attribute(current_organization.cta_button_text).presence || t("decidim.pages.home.hero.participate")
10
- end
11
-
12
- def cta_button
13
- link_to cta_button_text, cta_button_path, class: "hero-cta button expanded large button--sc", title: t("decidim.pages.home.hero.participate_title")
14
- end
15
-
16
- # Finds the CTA button path to reuse it in other places.
17
- def cta_button_path
18
- if current_organization.cta_button_path.present?
19
- "/#{current_organization.cta_button_path}"
20
- elsif Decidim::ParticipatoryProcess.where(organization: current_organization).published.any?
21
- decidim_participatory_processes.participatory_processes_path
22
- elsif current_user
23
- decidim.account_path
24
- elsif current_organization.sign_up_enabled?
25
- decidim.new_user_registration_path
26
- else
27
- decidim.new_user_session_path
28
- end
29
- end
30
- end
31
- end
@@ -1,84 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- # A Helper for views with Endorsable resources.
5
- module EndorsableHelper
6
- #
7
- # Public: Checks if the given resource has been endorsed by all identities of the user.
8
- #
9
- # @param resource: The resource from which endorsements will be checked against.
10
- # @param user: The user whose identities and endorsements will be checked against.
11
- #
12
- def fully_endorsed?(resource, user)
13
- return false unless user
14
-
15
- user_group_endorsements = Decidim::UserGroups::ManageableUserGroups.for(user).verified.all? { |user_group| resource.endorsed_by?(user, user_group) }
16
-
17
- user_group_endorsements && resource.endorsed_by?(user)
18
- end
19
-
20
- # Public: Checks if endorsement are enabled in this step.
21
- #
22
- # Returns true if enabled, false otherwise.
23
- def endorsements_enabled?
24
- current_settings.endorsements_enabled
25
- end
26
-
27
- # Public: Checks if endorsements are blocked in this step.
28
- #
29
- # Returns true if blocked, false otherwise.
30
- def endorsements_blocked?
31
- current_settings.endorsements_blocked
32
- end
33
-
34
- # Public: Checks if the current user is allowed to endorse in this step.
35
- #
36
- # Returns true if the current user can endorse, false otherwise.
37
- def current_user_can_endorse?
38
- current_user && endorsements_enabled? && !endorsements_blocked?
39
- end
40
-
41
- # Public: Checks if the card for endorsements should be rendered.
42
- #
43
- # Returns true if the endorsements card should be rendered, false otherwise.
44
- def show_endorsements_card?
45
- endorsements_enabled?
46
- end
47
-
48
- # produces the path that should be POST to create an endorsement
49
- def path_to_create_endorsement(resource, user_group = nil)
50
- endorsements_path(resource_id: resource.to_gid.to_param,
51
- user_group_id: user_group&.id,
52
- authenticity_token: form_authenticity_token)
53
- end
54
-
55
- # Produces the path that should be DELETE to destroy an endorsement.
56
- def path_to_destroy_endorsement(resource, user_group = nil)
57
- endorsement_path(resource.to_gid.to_param,
58
- user_group_id: user_group&.id,
59
- authenticity_token: form_authenticity_token)
60
- end
61
-
62
- # Renders an identity for endorsement.
63
- #
64
- # Parameters:
65
- # resources - The endorsable resource.
66
- # user - The user that is endorsing at the end (mandatory).
67
- # user_group - The user_group on behalf of which the endorsement is being done (optional).
68
- def render_endorsement_identity(resource, user, user_group = nil)
69
- if user_group
70
- presenter = Decidim::UserGroupPresenter.new(user_group)
71
- selected = resource.endorsed_by?(user, user_group)
72
- else
73
- presenter = Decidim::UserPresenter.new(user)
74
- selected = resource.endorsed_by?(user)
75
- end
76
- http_method = selected ? :delete : :post
77
- render partial: "decidim/endorsements/identity", locals:
78
- { identity: presenter, selected:,
79
- http_method:,
80
- create_url: path_to_create_endorsement(resource, user_group),
81
- destroy_url: path_to_destroy_endorsement(resource, user_group) }
82
- end
83
- end
84
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module TwitterSearchHelper
5
- # Builds the URL for Twitter's hashtag search.
6
- #
7
- # @param hashtag [String] The hashtag to search
8
- #
9
- # @return [String]
10
- def twitter_hashtag_url(hashtag)
11
- format("https://twitter.com/hashtag/%{hashtag}?src=hash", hashtag:)
12
- end
13
- end
14
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module UserGroupHelper
5
- # Renders a user_group select field in a form.
6
- # form - FormBuilder object
7
- # name - attribute user_group_id
8
- # options - A hash used to modify the behavior of the select field.
9
- #
10
- # Returns nothing.
11
- def user_group_select_field(form, name, options = {})
12
- user_groups = Decidim::UserGroups::ManageableUserGroups.for(current_user).verified
13
- form.select(
14
- name,
15
- user_groups.map { |g| [g.name, g.id] },
16
- selected: @form.user_group_id.presence,
17
- include_blank: current_user.name,
18
- label: options.has_key?(:label) ? options[:label] : true
19
- )
20
- end
21
- end
22
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- class MetricJob < ApplicationJob
5
- queue_as :metrics
6
-
7
- def perform(manager_class, organization_id, day = nil)
8
- organization = Decidim::Organization.find_by(id: organization_id)
9
- return unless organization
10
-
11
- metric = manager_class.constantize.new(day, organization)
12
- metric.save if metric.valid?
13
- end
14
- end
15
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- # A Metric is a registry that holds cumulative and quantity value by day, category, participatory_space, category, an a related object
5
- class Metric < ApplicationRecord
6
- # ParticipatorySpace, RelatedObject and Category are optional relationships because not all metric objects need them
7
- # For example, User is only related to an organization, but a Proposal can have all of them
8
- belongs_to :organization, foreign_key: "decidim_organization_id", class_name: "Decidim::Organization"
9
- belongs_to :participatory_space, foreign_type: "participatory_space_type", polymorphic: true, optional: true
10
- belongs_to :related_object, foreign_type: "related_object_type", polymorphic: true, optional: true
11
- belongs_to :category, foreign_key: "decidim_category_id", class_name: "Decidim::Category", optional: true
12
- belongs_to :taxonomy, foreign_key: "decidim_taxonomy_id", class_name: "Decidim::Taxonomy", optional: true
13
-
14
- validates :day, uniqueness: { scope:
15
- [
16
- :metric_type,
17
- :decidim_organization_id,
18
- :participatory_space_type,
19
- :participatory_space_id,
20
- :related_object_type,
21
- :related_object_id,
22
- :decidim_taxonomy_id
23
- ] }
24
- end
25
- end
@@ -1,217 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "devise/models/decidim_validatable"
4
- require "valid_email2"
5
-
6
- module Decidim
7
- # A UserGroup is an organization of participants
8
- class UserGroup < UserBaseEntity
9
- include Decidim::Traceable
10
- include Decidim::DownloadYourData
11
- include Decidim::ActsAsAuthor
12
- include Decidim::UserReportable
13
- include Decidim::Searchable
14
-
15
- has_many :memberships, class_name: "Decidim::UserGroupMembership", foreign_key: :decidim_user_group_id, dependent: :destroy
16
- has_many :users, through: :memberships, class_name: "Decidim::User", foreign_key: :decidim_user_id
17
- has_many :managers,
18
- -> { where(decidim_user_group_memberships: { role: [:creator, :admin] }) },
19
- through: :memberships,
20
- class_name: "Decidim::User",
21
- foreign_key: :decidim_user_id,
22
- source: :user
23
-
24
- validates :name, presence: true, uniqueness: { scope: :decidim_organization_id }, unless: -> { blocked? }
25
-
26
- validate :correct_state
27
- validate :unique_document_number, if: :has_document_number?
28
-
29
- devise :confirmable, :decidim_validatable, confirmation_keys: [:decidim_organization_id, :email]
30
-
31
- scope :verified, -> { where.not("extended_data->>'verified_at' IS ?", nil) }
32
- scope :not_verified, -> { where("extended_data->>'verified_at' IS ?", nil) }
33
- scope :rejected, -> { where.not("extended_data->>'rejected_at' IS ?", nil) }
34
- scope :pending, -> { where("extended_data->>'rejected_at' IS ? AND extended_data->>'verified_at' IS ?", nil, nil) }
35
-
36
- searchable_fields(
37
- {
38
- organization_id: :decidim_organization_id,
39
- A: :name,
40
- datetime: :created_at
41
- },
42
- index_on_create: ->(user_group) { !user_group.deleted? },
43
- index_on_update: ->(user_group) { !user_group.deleted? }
44
- )
45
-
46
- def self.with_document_number(organization, number)
47
- where(decidim_organization_id: organization.id)
48
- .where("extended_data->>'document_number' = ?", number)
49
- end
50
-
51
- def non_deleted_memberships
52
- memberships.where(decidim_users: { deleted_at: nil })
53
- end
54
-
55
- # Returns the presenter for this author, to be used in the views.
56
- # Required by ActsAsAuthor.
57
- def presenter
58
- Decidim::UserGroupPresenter.new(self)
59
- end
60
-
61
- def self.log_presenter_class_for(_log)
62
- Decidim::AdminLog::UserGroupPresenter
63
- end
64
-
65
- # Public: Checks if the user group is verified.
66
- def verified?
67
- verified_at.present?
68
- end
69
-
70
- # Public: Checks if the user group is rejected.
71
- def rejected?
72
- rejected_at.present?
73
- end
74
-
75
- # Public: Checks if the user group is pending.
76
- def pending?
77
- verified_at.blank? && rejected_at.blank?
78
- end
79
-
80
- # Check if the group has been deleted or not
81
- def deleted?
82
- deleted_at.present?
83
- end
84
-
85
- def self.user_collection(user)
86
- user.user_groups
87
- end
88
-
89
- def self.export_serializer
90
- Decidim::DownloadYourDataSerializers::DownloadYourDataUserGroupSerializer
91
- end
92
-
93
- def document_number
94
- extended_data["document_number"]
95
- end
96
-
97
- def phone
98
- extended_data["phone"]
99
- end
100
-
101
- def rejected_at
102
- extended_data["rejected_at"]
103
- end
104
-
105
- def verified_at
106
- extended_data["verified_at"]
107
- end
108
-
109
- def reject!
110
- extended_data["verified_at"] = nil
111
- extended_data["rejected_at"] = Time.current
112
- save!
113
- end
114
-
115
- def verify!
116
- extended_data["verified_at"] = Time.current
117
- extended_data["rejected_at"] = nil
118
- save!
119
- end
120
-
121
- # sugar for the memberships query
122
- def accepted_memberships
123
- UserGroups::AcceptedMemberships.for(self)
124
- end
125
-
126
- # easy way to return all the users accepted in this group
127
- def accepted_users
128
- accepted_memberships.map(&:user)
129
- end
130
-
131
- # Currently, groups always accept conversations from anyone.
132
- # This may change in the future in case the desired behaviour
133
- # is to check if all (or any) of the administrators accepts conversations
134
- # or there is simply and option for this in the group preferences.
135
- def accepts_conversation?(_user)
136
- true
137
- end
138
-
139
- def unread_messages_count_for(user)
140
- @unread_messages_count_for ||= {}
141
- @unread_messages_count_for[user.id] ||= Decidim::Messaging::Conversation.user_collection(self).unread_messages_by(user).count
142
- end
143
-
144
- def self.state_eq(value)
145
- send(value.to_sym) if %w(all pending rejected verified).include?(value)
146
- end
147
-
148
- def self.ransackable_scopes(_auth = nil)
149
- [:state_eq]
150
- end
151
-
152
- scope :sort_by_users_count_asc, lambda {
153
- order("users_count ASC NULLS FIRST")
154
- }
155
-
156
- scope :sort_by_users_count_desc, lambda {
157
- order("users_count DESC NULLS LAST")
158
- }
159
-
160
- def self.sort_by_document_number_asc
161
- order(Arel.sql("extended_data->>'document_number' ASC"))
162
- end
163
-
164
- def self.sort_by_document_number_desc
165
- order(Arel.sql("extended_data->>'document_number' DESC"))
166
- end
167
-
168
- def self.sort_by_phone_asc
169
- order(Arel.sql("extended_data->>'phone' ASC"))
170
- end
171
-
172
- def self.sort_by_phone_desc
173
- order(Arel.sql("extended_data->>'phone' DESC"))
174
- end
175
-
176
- def self.sort_by_state_asc
177
- order(Arel.sql("extended_data->>'rejected_at' ASC, extended_data->>'verified_at' ASC, deleted_at ASC"))
178
- end
179
-
180
- def self.sort_by_state_desc
181
- order(Arel.sql("extended_data->>'rejected_at' DESC, extended_data->>'verified_at' DESC, deleted_at DESC"))
182
- end
183
-
184
- private
185
-
186
- # Private: Checks if the state user group is correct.
187
- def correct_state
188
- errors.add(:base, :invalid) if verified? && rejected?
189
- end
190
-
191
- def unique_document_number
192
- is_repeated = self
193
- .class
194
- .with_document_number(organization, document_number)
195
- .where.not(id:)
196
- .any?
197
-
198
- errors.add(:document_number, :taken) if is_repeated
199
- end
200
-
201
- def has_document_number?
202
- document_number.present?
203
- end
204
-
205
- # Overrides method in `Decidim::Validatable`, as user groups do not have a
206
- # password.
207
- def password_required?
208
- false
209
- end
210
-
211
- # Overrides method in `Decidim::Validatable`, as user groups do not have a
212
- # password.
213
- def password
214
- nil
215
- end
216
- end
217
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- # A UserGroupMembership associate user with user groups
5
- class UserGroupMembership < ApplicationRecord
6
- belongs_to :user, class_name: "Decidim::User", foreign_key: :decidim_user_id
7
- belongs_to :user_group, class_name: "Decidim::UserGroup", foreign_key: :decidim_user_group_id
8
-
9
- ROLES = %w(creator admin member requested invited).freeze
10
- validates :role, inclusion: { in: ROLES }
11
- validates :role, uniqueness: { scope: [:role, :decidim_user_group_id] }, if: :creator?
12
-
13
- def creator?
14
- role.to_s == "creator"
15
- end
16
- end
17
- end
@@ -1 +0,0 @@
1
- import "src/decidim/widget"
@@ -1,44 +0,0 @@
1
- /**
2
- * This script modifies the behavior of Abide form validation to address the issue of form validation errors
3
- * appearing prematurely in input fields.
4
- *
5
- * The primary goal is to hide error messages until the input field loses focus.
6
- */
7
-
8
- class AbideFormValidatorFixer {
9
- initialize() {
10
- const forms = document.querySelectorAll("main [data-live-validate='true']");
11
-
12
- forms.forEach((form) => {
13
- if (this.isElementVisible(form)) {
14
- this.setupForm(form);
15
- }
16
- });
17
- }
18
-
19
- isElementVisible(element) {
20
- return element.offsetParent !== null && getComputedStyle(element).display !== "none";
21
- }
22
-
23
- setupForm(form) {
24
- const inputs = form.querySelectorAll("input");
25
-
26
- inputs.forEach((input) => {
27
- const errorElement = input.closest("label")?.querySelector(".form-error") || input.parentElement.querySelector(".form-error");
28
- if (!errorElement) {
29
- return;
30
- }
31
- form.removeAttribute("data-live-validate");
32
- input.addEventListener("input", this.hideErrorElement.bind(this, errorElement));
33
- });
34
- }
35
-
36
- hideErrorElement(errorElement) {
37
- errorElement.classList.remove("is-visible");
38
- }
39
- }
40
-
41
- document.addEventListener("DOMContentLoaded", () => {
42
- const validatorFixer = new AbideFormValidatorFixer();
43
- validatorFixer.initialize();
44
- });
@@ -1,96 +0,0 @@
1
- import PasswordToggler from "src/decidim/password_toggler";
2
-
3
- const initializeAccountForm = () => {
4
- const newPasswordPanel = document.getElementById("panel-password");
5
- const oldPasswordPanel = document.getElementById("panel-old-password");
6
- const emailField = document.querySelector("input[type='email']");
7
- if (!newPasswordPanel || !emailField) {
8
- return;
9
- }
10
-
11
- const originalEmail = emailField.dataset.original;
12
- let emailChanged = originalEmail !== emailField.value;
13
- let newPwVisible = false;
14
-
15
- const toggleNewPassword = () => {
16
- const input = newPasswordPanel.querySelector("input")
17
- if (newPwVisible) {
18
- input.required = true;
19
- } else {
20
- input.required = false;
21
- input.value = "";
22
- }
23
- };
24
- const toggleOldPassword = () => {
25
- if (!oldPasswordPanel) {
26
- return;
27
- }
28
-
29
- const input = oldPasswordPanel.querySelector("input");
30
- if (emailChanged || newPwVisible) {
31
- oldPasswordPanel.classList.remove("hidden");
32
- input.required = true;
33
- } else {
34
- oldPasswordPanel.classList.add("hidden");
35
- input.required = false;
36
- }
37
- }
38
-
39
- const observer = new MutationObserver(() => {
40
- let ariaHiddenValue = newPasswordPanel.getAttribute("aria-hidden");
41
- newPwVisible = ariaHiddenValue === "false";
42
-
43
- toggleNewPassword();
44
- toggleOldPassword();
45
- });
46
- observer.observe(newPasswordPanel, { attributes: true });
47
-
48
- emailField.addEventListener("change", () => {
49
- emailChanged = emailField.value !== originalEmail;
50
- toggleOldPassword();
51
- });
52
- };
53
-
54
- /**
55
- * Since the delete account has a modal to confirm it we need to copy the content of the
56
- * reason field to the hidden field in the form inside the modal.
57
- *
58
- * @return {void}
59
- */
60
- const initializeDeleteAccount = () => {
61
- const $deleteAccountForm = $(".delete-account");
62
- const $deleteAccountModalForm = $(".delete-account-modal");
63
-
64
- if ($deleteAccountForm.length < 1) {
65
- return;
66
- }
67
-
68
- const $openModalButton = $(".open-modal-button");
69
-
70
- $openModalButton.on("click", (event) => {
71
- try {
72
- const reasonValue = $deleteAccountForm.find("textarea#delete_account_delete_reason").val();
73
- $deleteAccountModalForm.find("input#delete_account_delete_reason").val(reasonValue);
74
- } catch (error) {
75
- console.error(error); // eslint-disable-line no-console
76
- }
77
-
78
- event.preventDefault();
79
- event.stopPropagation();
80
- return false;
81
- });
82
- };
83
-
84
- const initializeOldPasswordToggler = () => {
85
- const oldUserPassword = document.querySelector(".old-user-password");
86
-
87
- if (oldUserPassword) {
88
- new PasswordToggler(oldUserPassword).init();
89
- }
90
- }
91
-
92
- $(() => {
93
- initializeAccountForm();
94
- initializeDeleteAccount();
95
- initializeOldPasswordToggler();
96
- });
@@ -1,6 +0,0 @@
1
- import "@zeitiger/appendaround"
2
-
3
- $(() => {
4
- let $appendableElements = $(".js-append");
5
- $appendableElements.appendAround();
6
- })