decidim-core 0.31.2 → 0.32.1

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 (516) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -13
  3. data/app/cells/decidim/amendable/amend_button_card/show.erb +2 -2
  4. data/app/cells/decidim/amendable/amend_button_card_cell.rb +1 -1
  5. data/app/cells/decidim/author_cell.rb +0 -4
  6. data/app/cells/decidim/card_metadata_cell.rb +1 -1
  7. data/app/cells/decidim/comments_button_cell.rb +9 -1
  8. data/app/cells/decidim/content_blocks/announcement_settings_form/show.erb +5 -0
  9. data/app/cells/decidim/content_blocks/announcement_settings_form_cell.rb +17 -0
  10. data/app/cells/decidim/content_blocks/cta_settings_form/show.erb +1 -1
  11. data/app/cells/decidim/content_blocks/hero_settings_form/show.erb +1 -1
  12. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +1 -1
  13. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form/show.erb +1 -1
  14. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +5 -1
  15. data/app/cells/decidim/content_blocks/highlighted_participatory_spaces_cell.rb +1 -1
  16. data/app/cells/decidim/content_blocks/how_to_participate/show.erb +1 -1
  17. data/app/cells/decidim/content_blocks/html_cell.rb +1 -1
  18. data/app/cells/decidim/content_blocks/participatory_space_announcement_cell.rb +1 -3
  19. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +1 -5
  20. data/app/cells/decidim/content_blocks/participatory_space_hero_settings_form/show.erb +1 -1
  21. data/app/cells/decidim/content_blocks/static_page/section_cell.rb +1 -1
  22. data/app/cells/decidim/content_blocks/static_page/section_settings_form/show.erb +3 -1
  23. data/app/cells/decidim/content_blocks/static_page/summary_cell.rb +1 -1
  24. data/app/cells/decidim/content_blocks/static_page/summary_settings_form/show.erb +3 -1
  25. data/app/cells/decidim/content_blocks/static_page/two_pane_section_cell.rb +2 -2
  26. data/app/cells/decidim/content_blocks/static_page/two_pane_section_settings_form/show.erb +4 -2
  27. data/app/cells/decidim/data_consent/category.erb +25 -38
  28. data/app/cells/decidim/footer_topics/show.erb +5 -8
  29. data/app/cells/decidim/{participatory_space_private_user → member}/show.erb +6 -6
  30. data/app/cells/decidim/{participatory_space_private_user_cell.rb → member_cell.rb} +1 -5
  31. data/app/cells/decidim/nav_links/show.erb +3 -3
  32. data/app/cells/decidim/onboarding_action_message_cell.rb +1 -0
  33. data/app/cells/decidim/profile/details.erb +1 -1
  34. data/app/cells/decidim/profile_cell.rb +1 -0
  35. data/app/cells/decidim/profile_member_of/show.erb +13 -0
  36. data/app/cells/decidim/profile_member_of_cell.rb +35 -0
  37. data/app/cells/decidim/report_button/already_reported_modal.erb +1 -1
  38. data/app/cells/decidim/report_button/flag_modal.erb +1 -1
  39. data/app/cells/decidim/report_user_button/already_reported_modal.erb +1 -1
  40. data/app/cells/decidim/report_user_button/flag_modal.erb +1 -1
  41. data/app/cells/decidim/resource_types_filter/show.erb +2 -2
  42. data/app/cells/decidim/share_text_widget/modal.erb +1 -1
  43. data/app/cells/decidim/share_widget/qr_code_modal.erb +1 -1
  44. data/app/cells/decidim/tags_cell.rb +1 -1
  45. data/app/cells/decidim/upload_modal/files.erb +5 -1
  46. data/app/cells/decidim/upload_modal_cell.rb +15 -1
  47. data/app/cells/decidim/versions_list/show.erb +25 -0
  48. data/app/commands/decidim/create_follow.rb +3 -5
  49. data/app/commands/decidim/create_user_report.rb +1 -1
  50. data/app/commands/decidim/destroy_account.rb +15 -4
  51. data/app/commands/decidim/multiple_attachments_methods.rb +42 -24
  52. data/app/commands/decidim/search.rb +5 -5
  53. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +1 -1
  54. data/app/controllers/concerns/decidim/devise_controllers.rb +9 -0
  55. data/app/controllers/concerns/decidim/direct_upload.rb +3 -2
  56. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +1 -1
  57. data/app/controllers/concerns/decidim/force_authentication.rb +10 -1
  58. data/app/controllers/concerns/decidim/impersonate_users.rb +4 -0
  59. data/app/controllers/concerns/decidim/locale_switcher.rb +52 -2
  60. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +1 -1
  61. data/app/controllers/concerns/decidim/participatory_space/has_members_page.rb +27 -0
  62. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -5
  63. data/app/controllers/decidim/account_controller.rb +1 -1
  64. data/app/controllers/decidim/amendments_controller.rb +5 -4
  65. data/app/controllers/decidim/components/base_controller.rb +20 -3
  66. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -1
  67. data/app/controllers/decidim/devise/passwords_controller.rb +1 -1
  68. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  69. data/app/controllers/decidim/devise/sessions_controller.rb +1 -1
  70. data/app/controllers/decidim/download_your_data_controller.rb +2 -2
  71. data/app/controllers/decidim/editor_images_controller.rb +1 -1
  72. data/app/controllers/decidim/follows_controller.rb +4 -3
  73. data/app/controllers/decidim/geolocation_controller.rb +1 -1
  74. data/app/controllers/decidim/likes_controller.rb +2 -1
  75. data/app/controllers/decidim/locales_controller.rb +3 -11
  76. data/app/controllers/decidim/messaging/conversations_controller.rb +3 -3
  77. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  78. data/app/controllers/decidim/notifications_settings_controller.rb +1 -1
  79. data/app/controllers/decidim/notifications_subscriptions_controller.rb +8 -0
  80. data/app/controllers/decidim/open_data_controller.rb +1 -1
  81. data/app/controllers/decidim/private_downloads_controller.rb +29 -0
  82. data/app/controllers/decidim/report_users_controller.rb +2 -2
  83. data/app/controllers/decidim/reports_controller.rb +1 -1
  84. data/app/controllers/decidim/user_activities_controller.rb +1 -2
  85. data/app/events/decidim/amendable/amendment_base_event.rb +7 -1
  86. data/app/events/decidim/welcome_notification_event.rb +1 -1
  87. data/app/forms/decidim/upload_validation_form.rb +1 -1
  88. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +1 -0
  89. data/app/helpers/decidim/active_link_to_helper.rb +136 -0
  90. data/app/helpers/decidim/amendments_helper.rb +3 -3
  91. data/app/helpers/decidim/check_boxes_tree_helper.rb +2 -2
  92. data/app/helpers/decidim/component_path_helper.rb +9 -4
  93. data/app/helpers/decidim/filters_helper.rb +0 -2
  94. data/app/helpers/decidim/mailer_helper.rb +36 -0
  95. data/app/helpers/decidim/menu_helper.rb +4 -5
  96. data/app/helpers/decidim/meta_tags_helper.rb +0 -2
  97. data/app/helpers/decidim/newsletters_helper.rb +4 -22
  98. data/app/helpers/decidim/paginate_helper.rb +14 -1
  99. data/app/helpers/decidim/sanitize_helper.rb +1 -0
  100. data/app/helpers/decidim/short_link_helper.rb +5 -5
  101. data/app/helpers/decidim/translations_helper.rb +4 -4
  102. data/app/jobs/decidim/delete_inactive_participants_job.rb +2 -2
  103. data/app/jobs/decidim/find_and_update_descendants_job.rb +8 -2
  104. data/app/jobs/decidim/process_inactive_participant_job.rb +0 -7
  105. data/app/jobs/decidim/update_search_indexes_job.rb +2 -2
  106. data/app/mailers/decidim/application_mailer.rb +11 -2
  107. data/app/mailers/decidim/decidim_devise_mailer.rb +1 -0
  108. data/app/mailers/decidim/delete_user_mailer.rb +14 -0
  109. data/app/mailers/decidim/participants_account_mailer.rb +0 -16
  110. data/app/mailers/decidim/reported_mailer.rb +4 -1
  111. data/app/models/decidim/action_log.rb +1 -1
  112. data/app/models/decidim/attachment.rb +20 -2
  113. data/app/models/decidim/authorization.rb +7 -0
  114. data/app/models/decidim/authorization_transfer.rb +1 -1
  115. data/app/models/decidim/component.rb +6 -9
  116. data/app/models/decidim/content_block.rb +3 -3
  117. data/app/models/decidim/moderation.rb +1 -1
  118. data/app/models/decidim/newsletter.rb +2 -2
  119. data/app/models/decidim/participatory_space/member.rb +55 -0
  120. data/app/models/decidim/private_download.rb +61 -0
  121. data/app/models/decidim/private_export.rb +6 -0
  122. data/app/models/decidim/resource_link.rb +1 -1
  123. data/app/models/decidim/short_link.rb +1 -1
  124. data/app/models/decidim/user.rb +2 -2
  125. data/app/models/decidim/user_base_entity.rb +17 -2
  126. data/app/models/decidim/user_moderation.rb +1 -1
  127. data/app/packs/src/decidim/a11y.js +29 -0
  128. data/app/packs/src/decidim/a11y.test.js +81 -0
  129. data/app/packs/src/decidim/confirm.js +8 -1
  130. data/app/packs/src/decidim/confirm.test.js +225 -0
  131. data/app/packs/src/decidim/controllers/accordion/accordion.test.js +272 -0
  132. data/app/packs/src/decidim/controllers/accordion/controller.js +117 -17
  133. data/app/packs/src/decidim/controllers/assign_role/assign_role.test.js +80 -0
  134. data/app/packs/src/decidim/controllers/assign_role/controller.js +27 -0
  135. data/app/packs/src/decidim/controllers/breadcrumb_truncate/breadcrumb_truncate.test.js +230 -0
  136. data/app/packs/src/decidim/controllers/breadcrumb_truncate/controller.js +172 -0
  137. data/app/packs/src/decidim/controllers/dropdown/controller.js +32 -0
  138. data/app/packs/src/decidim/controllers/dropdown/dropdown.test.js +215 -0
  139. data/app/packs/src/decidim/controllers/form_validator/form_validator.js +9 -8
  140. data/app/packs/src/decidim/controllers/form_validator/form_validator.test.js +28 -1
  141. data/app/packs/src/decidim/controllers/language_change/controller.js +1 -0
  142. data/app/packs/src/decidim/controllers/language_change/language_change.test.js +13 -0
  143. data/app/packs/src/decidim/controllers/main_menu/controller.js +152 -0
  144. data/app/packs/src/decidim/controllers/main_menu/main_menu.test.js +285 -0
  145. data/app/packs/src/decidim/controllers/mention/controller.js +296 -140
  146. data/app/packs/src/decidim/controllers/mention/input_mentions.test.js +120 -457
  147. data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +68 -32
  148. data/app/packs/src/decidim/controllers/multiple_mentions/input_multiple_mentions.test.js +30 -23
  149. data/app/packs/src/decidim/controllers/password_toggler/controller.js +22 -1
  150. data/app/packs/src/decidim/controllers/password_toggler/password_toggler.test.js +11 -20
  151. data/app/packs/src/decidim/datepicker/datepicker_functions.js +26 -0
  152. data/app/packs/src/decidim/datepicker/generate_datepicker.js +3 -14
  153. data/app/packs/src/decidim/datepicker/generate_timepicker.js +3 -2
  154. data/app/packs/src/decidim/datepicker/test/datepicker_functions_adjust_picker_position.test.js +234 -0
  155. data/app/packs/src/decidim/direct_uploads/upload_field.js +4 -4
  156. data/app/packs/src/decidim/direct_uploads/upload_modal.js +12 -7
  157. data/app/packs/src/decidim/editor/common/suggestion.js +4 -2
  158. data/app/packs/src/decidim/editor/extensions/decidim_kit/index.js +4 -1
  159. data/app/packs/src/decidim/editor/extensions/image/index.js +57 -16
  160. data/app/packs/src/decidim/editor/extensions/image/node_view.js +9 -1
  161. data/app/packs/src/decidim/editor/extensions/indent/index.js +9 -0
  162. data/app/packs/src/decidim/editor/extensions/link/bubble_menu.js +34 -6
  163. data/app/packs/src/decidim/editor/extensions/link/index.js +53 -12
  164. data/app/packs/src/decidim/editor/extensions/mention/index.js +18 -5
  165. data/app/packs/src/decidim/editor/extensions/mention_resource/index.js +16 -7
  166. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +13 -4
  167. data/app/packs/src/decidim/editor/test/extensions/heading.test.js +1 -1
  168. data/app/packs/src/decidim/editor/test/extensions/image.test.js +26 -28
  169. data/app/packs/src/decidim/editor/test/extensions/image_links.test.js +161 -0
  170. data/app/packs/src/decidim/editor/test/extensions/mention.test.js +6 -2
  171. data/app/packs/src/decidim/editor/test/extensions/video_embed.test.js +27 -15
  172. data/app/packs/src/decidim/editor/test/helpers.js +8 -10
  173. data/app/packs/src/decidim/editor/test/toolbar/full.test.js +15 -4
  174. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_block.js +8 -4
  175. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_formatting.js +5 -1
  176. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_indent.js +9 -5
  177. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_link.js +5 -1
  178. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_list.js +8 -4
  179. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_styling.js +13 -9
  180. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_content_styling.js +6 -2
  181. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +15 -5
  182. data/app/packs/src/decidim/geocoding/reverse_geocoding.test.js +197 -0
  183. data/app/packs/src/decidim/index.js +4 -4
  184. data/app/packs/src/decidim/map/controller.js +10 -1
  185. data/app/packs/src/decidim/refactor/moved/focus_guard.js +16 -16
  186. data/app/packs/src/decidim/refactor/moved/focus_guard.test.js +136 -0
  187. data/app/packs/src/decidim/sw/push-permissions.js +48 -13
  188. data/app/packs/src/decidim/sw/sw.js +1 -1
  189. data/app/packs/src/decidim/utilities/text.js +6 -6
  190. data/app/packs/stylesheets/decidim/_cards.scss +15 -6
  191. data/app/packs/stylesheets/decidim/_conversations.scss +14 -0
  192. data/app/packs/stylesheets/decidim/_cookies.scss +13 -5
  193. data/app/packs/stylesheets/decidim/_datepicker.scss +0 -8
  194. data/app/packs/stylesheets/decidim/_documents.scss +1 -1
  195. data/app/packs/stylesheets/decidim/_dropdown.scss +22 -32
  196. data/app/packs/stylesheets/decidim/_editor_suggestions.scss +49 -0
  197. data/app/packs/stylesheets/decidim/_flash.scss +1 -1
  198. data/app/packs/stylesheets/decidim/_floating_help.scss +1 -1
  199. data/app/packs/stylesheets/decidim/_footer.scss +27 -31
  200. data/app/packs/stylesheets/decidim/_forms.scss +5 -1
  201. data/app/packs/stylesheets/decidim/_header.scss +183 -48
  202. data/app/packs/stylesheets/decidim/_language_chooser.scss +79 -0
  203. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +1 -1
  204. data/app/packs/stylesheets/decidim/_rich_text.scss +17 -0
  205. data/app/packs/stylesheets/decidim/_tom_select.scss +23 -0
  206. data/app/packs/stylesheets/decidim/application.scss +3 -0
  207. data/app/packs/stylesheets/decidim/editor.scss +12 -33
  208. data/app/packs/stylesheets/decidim/geocoding_addons.scss +10 -2
  209. data/app/presenters/decidim/admin_log/participatory_space/member_presenter.rb +40 -0
  210. data/app/presenters/decidim/admin_log/static_page_resource_presenter.rb +1 -1
  211. data/app/presenters/decidim/authorization_transfer_presenter.rb +1 -1
  212. data/app/presenters/decidim/breadcrumb_root_menu_item_presenter.rb +3 -3
  213. data/app/presenters/decidim/footer_menu_presenter.rb +2 -4
  214. data/app/presenters/decidim/log/user_presenter.rb +1 -0
  215. data/app/presenters/decidim/log/value_types/access_mode_presenter.rb +45 -0
  216. data/app/presenters/decidim/menu_item_presenter.rb +15 -3
  217. data/app/presenters/decidim/participatory_space/member_presenter.rb +48 -0
  218. data/app/presenters/decidim/resource_locator_presenter.rb +22 -3
  219. data/app/presenters/decidim/stats_presenter.rb +1 -1
  220. data/app/queries/decidim/last_activity.rb +1 -1
  221. data/app/resolvers/decidim/meta_image_url_resolver.rb +7 -0
  222. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +15 -1
  223. data/app/services/decidim/email_notification_generator.rb +2 -0
  224. data/app/services/decidim/notification_generator.rb +4 -0
  225. data/app/services/decidim/notifications_subscriptions_persistor.rb +6 -0
  226. data/app/services/decidim/push_subscription_endpoint_validator.rb +34 -0
  227. data/app/services/decidim/send_push_notification.rb +5 -1
  228. data/app/uploaders/decidim/image_uploader.rb +1 -1
  229. data/app/uploaders/decidim/organization_favicon_uploader.rb +4 -9
  230. data/app/validators/uploader_image_dimensions_validator.rb +13 -11
  231. data/app/views/decidim/delete_user_mailer/delete.html.erb +6 -0
  232. data/app/views/decidim/devise/invitations/edit.html.erb +3 -3
  233. data/app/views/decidim/devise/registrations/new.html.erb +1 -0
  234. data/app/views/decidim/devise/shared/_tos_fields.html.erb +3 -3
  235. data/app/views/decidim/gamification/badges/index.html.erb +1 -1
  236. data/app/views/decidim/homepage/show.html.erb +2 -2
  237. data/app/views/decidim/last_activities/index.html.erb +1 -1
  238. data/app/views/decidim/messaging/conversations/_error_modal.html.erb +11 -19
  239. data/app/views/decidim/messaging/conversations/_new_conversation_button.html.erb +1 -1
  240. data/app/views/decidim/messaging/conversations/_reply.html.erb +1 -1
  241. data/app/views/decidim/messaging/conversations/error.js.erb +12 -7
  242. data/app/views/decidim/messaging/conversations/new.html.erb +1 -1
  243. data/app/views/decidim/messaging/conversations/show.html.erb +2 -2
  244. data/app/views/decidim/newsletters/unsubscribe.html.erb +1 -1
  245. data/app/views/decidim/notification_mailer/event_received.html.erb +3 -3
  246. data/app/views/decidim/notifications_settings/show.html.erb +5 -5
  247. data/app/views/decidim/offline/show.html.erb +1 -1
  248. data/app/views/decidim/pages/_tabbed.html.erb +3 -3
  249. data/app/views/decidim/pages/index.html.erb +1 -1
  250. data/app/views/decidim/participatory_space/members/_member.html.erb +1 -0
  251. data/app/views/decidim/profiles/show.html.erb +1 -1
  252. data/app/views/decidim/searches/_filters.html.erb +1 -1
  253. data/app/views/decidim/shared/_filters.html.erb +5 -5
  254. data/app/views/decidim/shared/_resource_actions.html.erb +4 -4
  255. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  256. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +2 -2
  257. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  258. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +4 -3
  259. data/app/views/decidim/user_activities/index.html.erb +1 -1
  260. data/app/views/devise/mailer/{invite_private_user.html.erb → invite_member.html.erb} +2 -2
  261. data/app/views/devise/mailer/{invite_private_user.text.erb → invite_member.text.erb} +2 -2
  262. data/app/views/layouts/decidim/_head.html.erb +2 -2
  263. data/app/views/layouts/decidim/_wrapper.html.erb +3 -3
  264. data/app/views/layouts/decidim/footer/_focus_mode_main.html.erb +0 -1
  265. data/app/views/layouts/decidim/footer/_main.html.erb +1 -2
  266. data/app/views/layouts/decidim/footer/_main_links.html.erb +56 -28
  267. data/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +4 -1
  268. data/app/views/layouts/decidim/header/_main.html.erb +17 -8
  269. data/app/views/layouts/decidim/header/_main_language_chooser.html.erb +24 -0
  270. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +56 -56
  271. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +2 -2
  272. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +3 -1
  273. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +18 -5
  274. data/app/views/layouts/decidim/header/_main_search.html.erb +3 -3
  275. data/app/views/layouts/decidim/header/_menu.html.erb +5 -5
  276. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +40 -12
  277. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile.html.erb +33 -0
  278. data/app/views/layouts/decidim/shared/_layout_center.html.erb +1 -1
  279. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  280. data/app/views/layouts/decidim/shared/_layout_two_col.html.erb +1 -1
  281. data/config/initializers/decidim_locale_aware_named_route_helper.rb +16 -0
  282. data/config/initializers/devise.rb +6 -0
  283. data/config/initializers/invisible_captcha.rb +1 -0
  284. data/config/locales/ar.yml +6 -38
  285. data/config/locales/bg.yml +3 -39
  286. data/config/locales/ca-IT.yml +91 -58
  287. data/config/locales/ca.yml +91 -58
  288. data/config/locales/cs.yml +54 -58
  289. data/config/locales/de.yml +45 -68
  290. data/config/locales/el.yml +3 -31
  291. data/config/locales/en.yml +88 -55
  292. data/config/locales/es-MX.yml +93 -60
  293. data/config/locales/es-PY.yml +93 -60
  294. data/config/locales/es.yml +95 -62
  295. data/config/locales/eu.yml +124 -92
  296. data/config/locales/fi-plain.yml +93 -55
  297. data/config/locales/fi.yml +96 -58
  298. data/config/locales/fr-CA.yml +70 -52
  299. data/config/locales/fr.yml +71 -54
  300. data/config/locales/ga-IE.yml +3 -1
  301. data/config/locales/gl.yml +3 -31
  302. data/config/locales/hu.yml +7 -40
  303. data/config/locales/id-ID.yml +3 -30
  304. data/config/locales/is-IS.yml +0 -6
  305. data/config/locales/it.yml +15 -33
  306. data/config/locales/ja.yml +105 -71
  307. data/config/locales/lb.yml +3 -33
  308. data/config/locales/lt.yml +4 -37
  309. data/config/locales/lv.yml +3 -30
  310. data/config/locales/nl.yml +3 -33
  311. data/config/locales/no.yml +3 -33
  312. data/config/locales/pl.yml +7 -41
  313. data/config/locales/pt-BR.yml +24 -65
  314. data/config/locales/pt.yml +3 -33
  315. data/config/locales/ro-RO.yml +12 -55
  316. data/config/locales/ru.yml +0 -16
  317. data/config/locales/sk.yml +1417 -32
  318. data/config/locales/sv.yml +44 -62
  319. data/config/locales/tr-TR.yml +20 -37
  320. data/config/locales/uk.yml +0 -9
  321. data/config/locales/zh-CN.yml +3 -30
  322. data/config/locales/zh-TW.yml +4 -35
  323. data/config/routes.rb +140 -76
  324. data/db/data/20251213075429_rename_members_in_action_log.rb +22 -0
  325. data/db/data/20260319145808_rename_send_to_members_in_newsletter.rb +27 -0
  326. data/db/migrate/20200730142511_add_file_upload_settings_to_decidim_organizations.rb +13 -15
  327. data/db/migrate/20250217192438_convert_user_groups_into_users.rb +3 -2
  328. data/db/migrate/20250523104311_move_cta_to_hero_content_block.rb +1 -1
  329. data/db/migrate/20250527122040_move_highlighted_content_banner_settings_to_content_block.rb +1 -1
  330. data/db/migrate/20250819110800_convert_private_exports_id_to_uuid.rb +2 -2
  331. data/db/migrate/20251112132305_remove_legacy_images_from_core_module.rb +27 -0
  332. data/db/migrate/20251205122428_rename_participatory_space_private_users_to_members.rb +9 -0
  333. data/db/migrate/20251216185133_rename_privatable_to_to_participatory_space_in_members.rb +10 -0
  334. data/db/migrate/20260208201405_remove_user_group_core.rb +21 -0
  335. data/db/migrate/20260208201406_remove_user_group_memberships.rb +30 -0
  336. data/db/migrate/20260208201407_remove_user_group_organizations.rb +11 -0
  337. data/db/migrate/20260217152425_remove_enable_participatory_space_filters_from_decidim_organizations.rb +7 -0
  338. data/db/migrate/20260314081619_add_index_on_decidim_members.rb +25 -0
  339. data/decidim-core.gemspec +28 -28
  340. data/lib/decidim/acts_as_tree.rb +12 -12
  341. data/lib/decidim/admin_filters_registry.rb +1 -1
  342. data/lib/decidim/amendable.rb +5 -1
  343. data/lib/decidim/api/functions/category_list.rb +1 -0
  344. data/lib/decidim/api/functions/component_finder_base.rb +1 -1
  345. data/lib/decidim/api/functions/component_list.rb +3 -1
  346. data/lib/decidim/api/functions/component_list_base.rb +1 -0
  347. data/lib/decidim/api/functions/participatory_space_finder_base.rb +1 -1
  348. data/lib/decidim/api/functions/participatory_space_list_base.rb +1 -0
  349. data/lib/decidim/api/functions/user_entity_list.rb +2 -1
  350. data/lib/decidim/api/interfaces/amendable_entity_interface.rb +1 -0
  351. data/lib/decidim/api/interfaces/amendable_interface.rb +1 -0
  352. data/lib/decidim/api/interfaces/attachable_collection_interface.rb +1 -0
  353. data/lib/decidim/api/interfaces/attachable_interface.rb +1 -0
  354. data/lib/decidim/api/interfaces/author_interface.rb +2 -1
  355. data/lib/decidim/api/interfaces/authorable_interface.rb +1 -0
  356. data/lib/decidim/api/interfaces/categories_container_interface.rb +1 -0
  357. data/lib/decidim/api/interfaces/categorizable_interface.rb +1 -0
  358. data/lib/decidim/api/interfaces/coauthorable_interface.rb +1 -0
  359. data/lib/decidim/api/interfaces/component_interface.rb +9 -8
  360. data/lib/decidim/api/interfaces/fingerprint_interface.rb +1 -0
  361. data/lib/decidim/api/interfaces/followable_interface.rb +2 -0
  362. data/lib/decidim/api/interfaces/likeable_interface.rb +2 -2
  363. data/lib/decidim/api/interfaces/localizable_interface.rb +1 -0
  364. data/lib/decidim/api/interfaces/participatory_space_interface.rb +1 -0
  365. data/lib/decidim/api/interfaces/referable_interface.rb +1 -0
  366. data/lib/decidim/api/interfaces/scopable_interface.rb +1 -0
  367. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +1 -0
  368. data/lib/decidim/api/interfaces/timestamps_interface.rb +1 -0
  369. data/lib/decidim/api/interfaces/traceable_interface.rb +1 -0
  370. data/lib/decidim/api/types/attachment_collection_type.rb +5 -3
  371. data/lib/decidim/api/types/attachment_type.rb +11 -4
  372. data/lib/decidim/api/types/badge_score_type.rb +28 -0
  373. data/lib/decidim/api/types/moderation_type.rb +25 -0
  374. data/lib/decidim/api/types/participant_details_type.rb +17 -0
  375. data/lib/decidim/api/types/reportable_type.rb +18 -0
  376. data/lib/decidim/api/types/reportable_user_type.rb +17 -0
  377. data/lib/decidim/api/types/static_page_topic_type.rb +16 -0
  378. data/lib/decidim/api/types/static_page_type.rb +22 -0
  379. data/lib/decidim/api/types/taxonomy_type.rb +2 -0
  380. data/lib/decidim/api/types/user_moderation_type.rb +36 -0
  381. data/lib/decidim/api/types/user_type.rb +13 -0
  382. data/lib/decidim/asset_router/pipeline.rb +1 -1
  383. data/lib/decidim/asset_router/storage.rb +9 -9
  384. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +4 -1
  385. data/lib/decidim/attachment_attributes.rb +58 -9
  386. data/lib/decidim/attribute_encryptor.rb +51 -10
  387. data/lib/decidim/attribute_object/model.rb +0 -5
  388. data/lib/decidim/block_registry.rb +1 -1
  389. data/lib/decidim/coauthorable.rb +2 -1
  390. data/lib/decidim/command.rb +2 -1
  391. data/lib/decidim/content_parsers/blob_parser.rb +3 -3
  392. data/lib/decidim/content_processor.rb +1 -1
  393. data/lib/decidim/content_renderers/base_renderer.rb +112 -0
  394. data/lib/decidim/content_renderers/blob_renderer.rb +6 -9
  395. data/lib/decidim/content_renderers/mention_resource_renderer.rb +10 -6
  396. data/lib/decidim/content_renderers/resource_renderer.rb +16 -7
  397. data/lib/decidim/content_renderers/user_renderer.rb +11 -9
  398. data/lib/decidim/core/api.rb +8 -0
  399. data/lib/decidim/core/content_blocks/registry_manager.rb +4 -10
  400. data/lib/decidim/core/engine.rb +10 -34
  401. data/lib/decidim/core/menu.rb +0 -26
  402. data/lib/decidim/core/test/factories.rb +32 -18
  403. data/lib/decidim/core/test/shared_examples/access_mode_restricted_participatory_spaces.rb +175 -0
  404. data/lib/decidim/core/test/shared_examples/access_mode_transparent_participatory_spaces.rb +244 -0
  405. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +10 -10
  406. data/lib/decidim/core/test/shared_examples/amendable/amendment_event_examples.rb +2 -2
  407. data/lib/decidim/core/test/shared_examples/amendable/amendment_promoted_event_examples.rb +3 -3
  408. data/lib/decidim/core/test/shared_examples/comments_examples.rb +147 -117
  409. data/lib/decidim/core/test/shared_examples/fingerprint_examples.rb +2 -0
  410. data/lib/decidim/core/test/shared_examples/has_members.rb +63 -0
  411. data/lib/decidim/core/test/shared_examples/has_space_in_mcell_examples.rb +2 -1
  412. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +1 -1
  413. data/lib/decidim/core/test/shared_examples/map_examples.rb +1 -1
  414. data/lib/decidim/core/test/shared_examples/participant_details_examples.rb +16 -0
  415. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +10 -10
  416. data/lib/decidim/core/test/shared_examples/participatory_space_members_shared_examples.rb +121 -0
  417. data/lib/decidim/core/test/shared_examples/resource_liked_event_examples.rb +3 -3
  418. data/lib/decidim/core/test/shared_examples/resource_locator_presenter_examples.rb +7 -7
  419. data/lib/decidim/core/test/shared_examples/searchable_participatory_space_examples.rb +3 -3
  420. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +2 -2
  421. data/lib/decidim/core/test/shared_examples/simple_event.rb +1 -0
  422. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +2 -2
  423. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +1 -1
  424. data/lib/decidim/core/test.rb +2 -1
  425. data/lib/decidim/core/version.rb +1 -1
  426. data/lib/decidim/core.rb +222 -335
  427. data/lib/decidim/download_your_data_serializers/{download_your_data_participatory_space_private_user_serializer.rb → download_your_data_member_serializer.rb} +6 -6
  428. data/lib/decidim/download_your_data_serializers.rb +2 -2
  429. data/lib/decidim/engine_router.rb +31 -6
  430. data/lib/decidim/exporters/csv.rb +1 -1
  431. data/lib/decidim/filter_form_builder.rb +1 -1
  432. data/lib/decidim/form_builder.rb +58 -36
  433. data/{app/controllers/concerns → lib}/decidim/form_factory.rb +11 -1
  434. data/lib/decidim/has_settings.rb +2 -2
  435. data/lib/decidim/legacy_form_builder.rb +1 -0
  436. data/lib/decidim/locale_router_detector.rb +41 -0
  437. data/lib/decidim/maintenance/import_models/scope.rb +1 -1
  438. data/lib/decidim/maintenance/import_models.rb +0 -2
  439. data/lib/decidim/maintenance/taxonomy_importer.rb +1 -1
  440. data/lib/decidim/map/autocomplete.rb +4 -3
  441. data/lib/decidim/map/dynamic_map.rb +3 -1
  442. data/lib/decidim/map/frontend.rb +1 -1
  443. data/lib/decidim/map/geocoding.rb +2 -2
  444. data/lib/decidim/map/static_map.rb +10 -22
  445. data/lib/decidim/map/utility.rb +3 -6
  446. data/lib/decidim/map.rb +2 -2
  447. data/lib/decidim/menu.rb +1 -1
  448. data/lib/decidim/menu_item.rb +1 -0
  449. data/lib/decidim/menu_registry.rb +1 -1
  450. data/lib/decidim/moderation_tools.rb +1 -1
  451. data/lib/decidim/newsletter_encryptor.rb +5 -8
  452. data/lib/decidim/organization_settings.rb +2 -2
  453. data/lib/decidim/participable.rb +1 -0
  454. data/lib/decidim/participatory_space/has_members.rb +61 -0
  455. data/lib/decidim/participatory_space_manifest.rb +0 -4
  456. data/lib/decidim/participatory_space_resourceable.rb +10 -1
  457. data/lib/decidim/participatory_space_user.rb +1 -1
  458. data/lib/decidim/routes/locale_redirects.rb +47 -0
  459. data/lib/decidim/routes.rb +7 -0
  460. data/lib/decidim/search_resource_fields_mapper.rb +3 -4
  461. data/lib/decidim/searchable.rb +9 -4
  462. data/lib/decidim/seeds.rb +17 -0
  463. data/lib/decidim/shakapacker/runner.rb +4 -4
  464. data/lib/decidim/shakapacker/shakapacker.yml +28 -3
  465. data/lib/decidim/taxonomizable.rb +1 -1
  466. data/lib/decidim/translatable_attributes.rb +9 -3
  467. data/lib/decidim/view_model.rb +5 -1
  468. data/lib/devise/models/decidim_newsletterable.rb +1 -1
  469. data/lib/tasks/decidim_mailers_tasks.rake +31 -9
  470. data/lib/tasks/decidim_procfile.rake +1 -1
  471. data/lib/tasks/decidim_tasks.rake +0 -1
  472. data/lib/tasks/decidim_taxonomies.rake +1 -1
  473. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +0 -1
  474. data/lib/tasks/upgrade/decidim_encryption.rake +12 -0
  475. data/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake +0 -1
  476. data/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake +1 -1
  477. data/lib/tasks/upgrade/{fix_deleted_private_follows.rake → fix_deleted_members_follows.rake} +5 -5
  478. data/lib/tasks/upgrade/migrations.rake +0 -1
  479. data/lib/tasks/upgrade/user_groups_migration.rake +0 -1
  480. metadata +244 -132
  481. data/app/cells/decidim/content_blocks/global_menu/show.erb +0 -11
  482. data/app/cells/decidim/content_blocks/global_menu_cell.rb +0 -35
  483. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity/show.erb +0 -10
  484. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity_cell.rb +0 -49
  485. data/app/cells/decidim/participatory_space_dropdown_metadata/links.erb +0 -9
  486. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +0 -1
  487. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +0 -11
  488. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +0 -26
  489. data/app/commands/decidim/gallery_methods.rb +0 -107
  490. data/app/controllers/concerns/decidim/has_members_page.rb +0 -25
  491. data/app/jobs/decidim/newsletters_opt_in_job.rb +0 -11
  492. data/app/jobs/decidim/user_report_job.rb +0 -11
  493. data/app/models/decidim/participatory_space_private_user.rb +0 -51
  494. data/app/packs/src/decidim/controllers/sticky_header/controller.js +0 -116
  495. data/app/packs/src/decidim/controllers/sticky_header/sticky_header.test.js +0 -320
  496. data/app/packs/src/decidim/dropdown_menu.js +0 -18
  497. data/app/packs/src/decidim/identity_selector_dialog.js +0 -33
  498. data/app/packs/src/decidim/vendor/tribute.js +0 -1890
  499. data/app/packs/stylesheets/decidim/_tribute.scss +0 -36
  500. data/app/presenters/decidim/admin_log/participatory_space_private_user_presenter.rb +0 -38
  501. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +0 -46
  502. data/app/views/decidim/participants_account_mailer/removal_notification.html.erb +0 -11
  503. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +0 -1
  504. data/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +0 -26
  505. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +0 -34
  506. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +0 -10
  507. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_mobile.html.erb +0 -17
  508. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_top_left.html.erb +0 -2
  509. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +0 -33
  510. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +0 -25
  511. data/lib/decidim/core/test/shared_examples/has_private_users.rb +0 -63
  512. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +0 -81
  513. data/lib/decidim/has_private_users.rb +0 -57
  514. data/lib/decidim/maintenance/import_models/assembly_type.rb +0 -49
  515. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +0 -21
  516. data/lib/decidim/query_extensions.rb +0 -64
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module ParticipatorySpace
7
+ # A concern with the features needed when you want a model to be able to create
8
+ # members
9
+ module HasMembers
10
+ extend ActiveSupport::Concern
11
+ include Decidim::UserRoleChecker
12
+
13
+ included do
14
+ has_many :members,
15
+ class_name: "Decidim::ParticipatorySpace::Member",
16
+ as: :participatory_space,
17
+ dependent: :destroy
18
+ has_many :users,
19
+ through: :members,
20
+ class_name: "Decidim::User",
21
+ foreign_key: "member_to_id"
22
+
23
+ def self.visible_for(user)
24
+ if user
25
+ return all if user.admin?
26
+
27
+ where(
28
+ id: public_spaces +
29
+ private_spaces
30
+ .joins(:members)
31
+ .where(decidim_members: { decidim_user_id: user.id })
32
+ )
33
+ else
34
+ public_spaces
35
+ end
36
+ end
37
+
38
+ def members_public_page?
39
+ has_members && members.published.any?
40
+ end
41
+
42
+ def can_participate?(user)
43
+ return false unless published?
44
+ return true if open?
45
+ return true if user_has_any_role?(user, self)
46
+ return false unless user
47
+
48
+ members.exists?(decidim_user_id: user.id)
49
+ end
50
+
51
+ def self.public_spaces
52
+ where(access_mode: [:open, :transparent]).published
53
+ end
54
+
55
+ def self.private_spaces
56
+ where(access_mode: [:restricted, :transparent]).published
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -43,10 +43,6 @@ module Decidim
43
43
  # probably have the form of `Decidim::<MySpace>::Permissions`.
44
44
  attribute :permissions_class_name, String, default: "Decidim::DefaultPermissions"
45
45
 
46
- # The cell to use as dropdown in the breadcrumb element associated to the space.
47
- # If this value is omitted or blank, no breadcrumb is displayed
48
- attribute :breadcrumb_cell, String
49
-
50
46
  # The cell path to use to render the card of a resource.
51
47
  attribute :card, String
52
48
 
@@ -102,7 +102,16 @@ module Decidim
102
102
  # - is published
103
103
  # - is not private
104
104
  def visible?
105
- published? && !try(:private_space?)
105
+ published? && access_mode_visible?
106
+ end
107
+
108
+ # Checks if the ParticipatorySpace has an access_mode attribute
109
+ # If it does not have it, then returns true
110
+ # If it has it, then checks if this access_mode should be visible (open or transparent)
111
+ def access_mode_visible?
112
+ return true unless respond_to?(:access_mode)
113
+
114
+ try(:open?) || try(:transparent?)
106
115
  end
107
116
 
108
117
  # Defines a way to get the user roles for the current participatory space.
@@ -11,7 +11,7 @@ module Decidim
11
11
  included do
12
12
  validate :user_and_space_same_organization
13
13
 
14
- belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User", optional: true
14
+ belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User"
15
15
 
16
16
  ransacker :name do
17
17
  Arel.sql(%{("decidim_users"."name")::text})
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Routes
5
+ module LocaleRedirects
6
+ def locale_scope_options
7
+ {
8
+ defaults: { locale: Decidim.default_locale },
9
+ constraints: { locale: Regexp.union(I18n.available_locales.map(&:to_s)) }
10
+ }
11
+ end
12
+
13
+ def locale_redirector(path, preserve_query_string: true)
14
+ lambda do |params, request|
15
+ locale_redirect(params, request, path, preserve_query_string:)
16
+ end
17
+ end
18
+
19
+ def locale_redirect(params, request, path, preserve_query_string: true)
20
+ locale = Decidim::LocaleRouterDetector.new(request, params).locale
21
+ destination = append_locale(path, locale)
22
+ destination = append_query_string(destination, request) if preserve_query_string
23
+
24
+ destination
25
+ end
26
+
27
+ private
28
+
29
+ def append_locale(path, locale)
30
+ return path if path == "/404"
31
+ return path if path.start_with?("/#{locale}/") || path == "/#{locale}"
32
+
33
+ path = "/#{path}" unless path.start_with?("/")
34
+
35
+ "/#{locale}#{path}"
36
+ end
37
+
38
+ def append_query_string(path, request)
39
+ query_string = request.query_string.to_s
40
+ query_params = query_string.gsub(/(?:\A|&)locale=[^&]*(?=&|\z)/, "")
41
+ query_params = query_params.gsub(/\A&|&\z/, "").gsub(/&&+/, "&")
42
+
43
+ query_params.empty? ? path : "#{path}?#{query_params}"
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Routes
5
+ autoload :LocaleRedirects, "decidim/routes/locale_redirects"
6
+ end
7
+ end
@@ -11,7 +11,7 @@ module Decidim
11
11
  # - Array each element should be a text field symbol, all values will be concatenated.
12
12
  # - Symbol when mapping is direct.
13
13
  #
14
- # @param declared_fields: A Hash with the mappings between a SearchableResource attributes and
14
+ # @param declared_fields [Hash] - A Hash with the mappings between a SearchableResource attributes and
15
15
  # any given model. Mapped fields are:
16
16
  # - scope_id: The field where the scope is set in the model, if any.
17
17
  # - participatory_space: The field where the ParticipatorySpace is set in the model.
@@ -24,14 +24,13 @@ module Decidim
24
24
  # A: :title,
25
25
  # D: [:description, :address],
26
26
  # datetime: :start_time}
27
- #
28
27
  def initialize(declared_fields)
29
28
  @declared_fields = declared_fields.with_indifferent_access
30
29
  @conditions = { create: true, update: true }
31
30
  end
32
31
 
33
- # @param action: currently supports :create, :update
34
- # @param condition: a boolean or a Proc that will receive the Searchable and will return a boolean.
32
+ # @param action [Symbol] currently supports :create, :update
33
+ # @param condition [TrueClass, FalseClass] a boolean or a Proc that will receive the Searchable and will return a boolean.
35
34
  def set_index_condition(action, condition)
36
35
  @conditions[action] = condition
37
36
  end
@@ -101,7 +101,7 @@ module Decidim
101
101
 
102
102
  # Public: after_update callback to update index information of the model.
103
103
  #
104
- def try_update_index_for_search_resource
104
+ def try_update_index_for_search_resource(current_depth = 0)
105
105
  return unless self.class.searchable_resource?(self)
106
106
 
107
107
  org = self.class.search_resource_fields_mapper.retrieve_organization(self)
@@ -117,6 +117,11 @@ module Decidim
117
117
  searchables_in_org.find_each do |sr|
118
118
  next if sr.blank?
119
119
 
120
+ unless sr.locale.in?(org.available_locales)
121
+ sr.destroy
122
+ next
123
+ end
124
+
120
125
  sr.update(contents_to_searchable_resource_attributes(fields, sr.locale))
121
126
  end
122
127
  end
@@ -124,13 +129,13 @@ module Decidim
124
129
  searchables_in_org.destroy_all
125
130
  end
126
131
 
127
- find_and_update_descendants
132
+ find_and_update_descendants(current_depth)
128
133
  end
129
134
 
130
135
  private
131
136
 
132
- def find_and_update_descendants
133
- Decidim::FindAndUpdateDescendantsJob.perform_later(self)
137
+ def find_and_update_descendants(current_depth = 0)
138
+ Decidim::FindAndUpdateDescendantsJob.perform_later(self, current_depth)
134
139
  end
135
140
 
136
141
  def contents_to_searchable_resource_attributes(fields, locale)
data/lib/decidim/seeds.rb CHANGED
@@ -7,6 +7,19 @@ require "decidim/faker/localized"
7
7
  module Decidim
8
8
  # Base class to be inherited from the different modules' seeds classes
9
9
  class Seeds
10
+ SEEDS_CONFIG = {
11
+ comments_count: { slow: 6, fast: 2 },
12
+ comments_nested_probability: { slow: 0.5, fast: 0.2 },
13
+ comments_vote_skip_probability: { slow: 0.5, fast: 0.7 },
14
+ comments_votes_count: { slow: 12, fast: 3 },
15
+ surveys_responses_count: { slow: 200, fast: 20 },
16
+ surveys_response_options_count: { slow: 3, fast: 2 },
17
+ surveys_matrix_rows_count: { slow: 3, fast: 2 },
18
+ initiatives_votes_count: { slow: 50, fast: 10 },
19
+ accountability_statuses_count: { slow: 5, fast: 3 },
20
+ accountability_taxonomies_count: { slow: 2, fast: 1 }
21
+ }.freeze
22
+
10
23
  protected
11
24
 
12
25
  def slow_seeds?
@@ -17,6 +30,10 @@ module Decidim
17
30
  slow_seeds? ? rand(3..5) : 1
18
31
  end
19
32
 
33
+ def config_value(key)
34
+ slow_seeds? ? SEEDS_CONFIG[key][:slow] : SEEDS_CONFIG[key][:fast]
35
+ end
36
+
20
37
  def organization
21
38
  @organization ||= Decidim::Organization.first
22
39
  end
@@ -7,15 +7,15 @@ module Decidim
7
7
  base.alias_method :original_initialize, :initialize
8
8
  base.send :private, :original_initialize
9
9
 
10
- base.define_method :initialize do |argv|
11
- decidim_initialize(argv)
12
- original_initialize(argv)
10
+ base.define_method :initialize do |argv, build_config = nil, bundler_override = nil|
11
+ decidim_initialize(argv, build_config, bundler_override)
12
+ original_initialize(argv, build_config, bundler_override)
13
13
  end
14
14
  end
15
15
 
16
16
  private
17
17
 
18
- def decidim_initialize(_argv)
18
+ def decidim_initialize(_argv, _build_config = nil, _bundler_override = nil)
19
19
  # Write runtime configuration for Tailwind
20
20
  # This method is called here because in Decidim CSS compilation is done via Webpack.
21
21
  # If CSS is decoupled from JS in the future, this call should be removed.
@@ -21,8 +21,12 @@ default: &default
21
21
  # Reload manifest.json on all requests so we reload latest compiled packs
22
22
  cache_manifest: false
23
23
 
24
- # Select loader to use, available options are 'babel' (default), 'swc' or 'esbuild'
25
- webpack_loader: 'esbuild'
24
+ # Select JavaScript transpiler to use
25
+ # Available options: 'swc' (default, 20x faster), 'babel', 'esbuild', or 'none'
26
+ # Use 'none' when providing a completely custom webpack configuration
27
+ # Note: When using rspack, swc is used automatically regardless of this setting
28
+ javascript_transpiler: 'esbuild'
29
+ assets_bundler: "webpack"
26
30
 
27
31
  # Set to true to enable check for matching versions of shakapacker gem and NPM package - will raise an error if there is a mismatch or wildcard versioning is used
28
32
  ensure_consistent_versioning: true
@@ -35,15 +39,36 @@ default: &default
35
39
  # https://webpack.js.org/guides/build-performance/#avoid-production-specific-tooling
36
40
  useContentHash: false
37
41
 
42
+ # Utilizing webpack-subresource-integrity plugin, will generate integrity hashes for all entries in manifest.json
43
+ # https://github.com/waysact/webpack-subresource-integrity/tree/main/webpack-subresource-integrity
44
+ integrity:
45
+ enabled: false
46
+ # Which cryptographic function(s) to use, for generating the integrity hash(es). Default sha-384. Other possible values sha256, sha512
47
+ hash_functions: [ "sha384" ]
48
+ # Default "anonymous". Other possible value "use-credentials"
49
+ # https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity#cross-origin_resource_sharing_and_subresource_integrity
50
+ cross_origin: "anonymous"
51
+
52
+ # HTTP 103 Early Hints support for faster asset loading
53
+ # Sends Link headers to browsers so they can preload assets while Rails is rendering
54
+ # See docs/early_hints_new_api.md for setup instructions and requirements
55
+ # https://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-send_early_hints
56
+ early_hints:
57
+ enabled: false
58
+ # css: "preload" # 'preload' | 'prefetch' | 'none' - default: 'preload'
59
+ # js: "preload" # 'preload' | 'prefetch' | 'none' - default: 'preload'
60
+ # debug: false # Output early hints info as HTML comments for troubleshooting
61
+
38
62
  development:
39
63
  <<: *default
40
64
  compile: true
41
65
  compiler_strategy: mtime
42
66
  # Compile test packs to decidim decidim-packs folder
43
67
 
68
+ useContentHash: false
69
+
44
70
  # Reference: https://webpack.js.org/configuration/dev-server/
45
71
  dev_server:
46
- https: false
47
72
  host: localhost
48
73
  # Notice that we use a different port (to prevent blocking the default one) as
49
74
  # there will be at least two webpack servers running
@@ -51,7 +51,7 @@ module Decidim
51
51
  Arel::Nodes::Intersect.new(memo, query)
52
52
  end
53
53
 
54
- @klass.from(Arel::Nodes::As.new(subquery, Arel.sql(@klass.arel_table.name)))
54
+ from(Arel::Nodes::As.new(subquery, Arel.sql(arel_table.name)))
55
55
  }
56
56
 
57
57
  private
@@ -96,8 +96,7 @@ module Decidim
96
96
  given_organization ||= try(:organization)
97
97
  organization_locale = given_organization.try(:default_locale)
98
98
 
99
- attribute[I18n.locale.to_s].presence ||
100
- machine_translation_value(attribute, given_organization, override_machine_translation_settings) ||
99
+ translated_value(attribute, given_organization, override_machine_translation_settings) ||
101
100
  attribute[organization_locale].presence ||
102
101
  attribute[attribute.keys.first].presence ||
103
102
  ""
@@ -112,7 +111,7 @@ module Decidim
112
111
  return unless organization
113
112
  return unless organization.enable_machine_translations?
114
113
 
115
- attribute.dig("machine_translations", I18n.locale.to_s).presence if must_render_translation?(organization, override_machine_translation_settings)
114
+ attribute.dig("machine_translations", I18n.locale.to_s)&.gsub("<p></p>", "").presence if must_render_translation?(organization, override_machine_translation_settings)
116
115
  end
117
116
 
118
117
  def must_render_translation?(organization, override_machine_translation_settings = nil)
@@ -131,5 +130,12 @@ module Decidim
131
130
  def attachment?(value)
132
131
  value.is_a?(String) && value.include?(ActiveStorage.routes_prefix)
133
132
  end
133
+
134
+ private
135
+
136
+ def translated_value(attribute, given_organization, override_machine_translation_settings = nil)
137
+ attribute[I18n.locale.to_s]&.gsub("<p></p>", "").presence ||
138
+ machine_translation_value(attribute, given_organization, override_machine_translation_settings)
139
+ end
134
140
  end
135
141
  end
@@ -35,6 +35,10 @@ module Decidim
35
35
  end
36
36
  end
37
37
 
38
+ def current_locale
39
+ I18n.locale
40
+ end
41
+
38
42
  # Rails cells is delegating those methods to some internal view layer which messes up with shakapacker asset loading strategy
39
43
  # generating 2 or more queues for the javascript to be loading, resulting in the fact that no js / style pack appended or
40
44
  # prepended is added to main view rendering queue.
@@ -79,7 +83,7 @@ module Decidim
79
83
  end
80
84
 
81
85
  def perform_caching?
82
- cache_hash.present?
86
+ super && cache_hash.present?
83
87
  end
84
88
 
85
89
  def cache_hash
@@ -13,7 +13,7 @@ module Devise
13
13
  def newsletter_opt_in_notify
14
14
  unless newsletter_opt_in_valid?
15
15
  set_newsletter_token!
16
- Decidim::NewslettersOptInJob.perform_later(self, newsletter_token)
16
+ Decidim::NewslettersOptInMailer.notify(self, newsletter_token).deliver_later
17
17
  end
18
18
  end
19
19
 
@@ -4,20 +4,42 @@ namespace :decidim do
4
4
  namespace :mailers do
5
5
  desc "Sends the notification digest email with the daily report"
6
6
  task notifications_digest_daily: :environment do
7
- notifications_digest(:daily)
7
+ time = Time.now.utc
8
+ target_users = Decidim::User.where(notifications_sending_frequency: :daily)
9
+
10
+ target_users.find_in_batches do |batch|
11
+ notification_users =
12
+ Decidim::Notification
13
+ .daily(time)
14
+ .where(decidim_user_id: batch.pluck(:id))
15
+ .select(:decidim_user_id)
16
+ .distinct
17
+ .pluck(:decidim_user_id)
18
+
19
+ notification_users.each do |user_id|
20
+ Decidim::EmailNotificationsDigestGeneratorJob.perform_later(user_id, :daily, time:)
21
+ end
22
+ end
8
23
  end
9
24
 
10
25
  desc "Sends the notification digest email with the weekly report"
11
26
  task notifications_digest_weekly: :environment do
12
- notifications_digest(:weekly)
13
- end
14
- end
27
+ time = Time.now.utc
28
+ target_users = Decidim::User.where(notifications_sending_frequency: :weekly)
29
+
30
+ target_users.find_in_batches do |batch|
31
+ notification_users =
32
+ Decidim::Notification
33
+ .weekly(time)
34
+ .where(decidim_user_id: batch.pluck(:id))
35
+ .select(:decidim_user_id)
36
+ .distinct
37
+ .pluck(:decidim_user_id)
15
38
 
16
- def notifications_digest(frequency)
17
- target_users = Decidim::User.where(notifications_sending_frequency: frequency)
18
- time = Time.now.utc
19
- target_users.find_each do |user|
20
- Decidim::EmailNotificationsDigestGeneratorJob.perform_later(user.id, frequency, time:)
39
+ notification_users.each do |user_id|
40
+ Decidim::EmailNotificationsDigestGeneratorJob.perform_later(user_id, :weekly, time:)
41
+ end
42
+ end
21
43
  end
22
44
  end
23
45
  end
@@ -30,7 +30,7 @@ if ! gem list foreman -i --silent; then
30
30
  gem install foreman
31
31
  fi
32
32
 
33
- exec foreman start -f Procfile.dev "$@")
33
+ exec foreman start -f Procfile.dev "$@"), force: true
34
34
 
35
35
  actions :chmod, "bin/dev", 0o755
36
36
  end
@@ -34,7 +34,6 @@ namespace :decidim do
34
34
  decidim_pages
35
35
  decidim_participatory_processes
36
36
  decidim_proposals
37
- decidim_sortitions
38
37
  decidim_surveys
39
38
  decidim_system
40
39
  decidim_templates
@@ -106,7 +106,7 @@ namespace :decidim do
106
106
  end
107
107
 
108
108
  def planner(organization)
109
- models = ENV.fetch("IMPORTS", "ParticipatoryProcessType AssemblyType Scope Area Category").split.map do |model_name|
109
+ models = ENV.fetch("IMPORTS", "Scope Area Category").split.map do |model_name|
110
110
  "Decidim::Maintenance::ImportModels::#{model_name}".constantize
111
111
  end
112
112
  Decidim::Maintenance::TaxonomyPlan.new(organization, models)
@@ -57,7 +57,6 @@ namespace :decidim do
57
57
  "Decidim::Category" => %w(description),
58
58
  "Decidim::Blogs::Post" => %w(body),
59
59
  "Decidim::Pages::Page" => %w(body),
60
- "Decidim::Sortitions::Sortition" => %w(additional_info witnesses cancel_reason),
61
60
  "Decidim::Debates::Debate" => %w(description instructions information_updates conclusions),
62
61
  "Decidim::Budgets::Budget" => %w(description),
63
62
  "Decidim::Budgets::Project" => %w(description),
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :decidim do
4
+ namespace :upgrade do
5
+ desc "Upgrade the encryption environment"
6
+ task encryption: :environment do
7
+ # Authorization is using the RecordEncryptor which automatically decrypts or encrypts before using.
8
+ # A simple save will retrigger the encryption using SHA256
9
+ Decidim::Authorization.find_each(&:save)
10
+ end
11
+ end
12
+ end
@@ -39,7 +39,6 @@ namespace :decidim do
39
39
  Decidim::Upgrade::WysiwygMigrator.register_model("Decidim::Meetings::Meeting", [:description, :registration_terms, :registration_email_custom_content, :closing_report])
40
40
  Decidim::Upgrade::WysiwygMigrator.register_model("Decidim::Pages::Page", [:body])
41
41
  Decidim::Upgrade::WysiwygMigrator.register_model("Decidim::Proposals::Proposal", [:body, :answer, :cost_report, :execution_period])
42
- Decidim::Upgrade::WysiwygMigrator.register_model("Decidim::Sortitions::Sortition", [:witnesses, :additional_info, :cancel_reason])
43
42
  end
44
43
 
45
44
  desc "Updates the content entered through the WYSIWYG editors"
@@ -8,7 +8,7 @@ namespace :decidim do
8
8
  Decidim::User.where.not(deleted_at: nil).find_each do |deleted_user|
9
9
  Decidim::Follow.where(followable: deleted_user).find_each(&:destroy)
10
10
  Decidim::Follow.where(user: deleted_user).find_each(&:destroy)
11
- Decidim::ParticipatorySpacePrivateUser.where(user: deleted_user).find_each(&:destroy)
11
+ Decidim::ParticipatorySpace::Member.where(user: deleted_user).find_each(&:destroy)
12
12
  Decidim::Gamification::BadgeScore.where(user: deleted_user).find_each(&:destroy)
13
13
  Decidim::UserModeration.where(user: deleted_user).find_each(&:destroy)
14
14
  Decidim::Like.where(author: deleted_user).find_each(&:destroy)
@@ -2,14 +2,14 @@
2
2
 
3
3
  namespace :decidim do
4
4
  namespace :upgrade do
5
- desc "Delete follows of private users deleted from a private space"
6
- task fix_deleted_private_follows: :environment do
5
+ desc "Delete follows of members deleted from a restricted space"
6
+ task fix_deleted_members_follows: :environment do
7
7
  Decidim::Organization.all.each do |organization|
8
- spaces = organization.participatory_spaces.collect { |space| space if space.respond_to?(:private_space?) && space.private_space? }.compact_blank
8
+ spaces = organization.participatory_spaces.collect { |space| space if space.respond_to?(:restricted?) && space.restricted? }.compact_blank
9
9
 
10
10
  next if spaces.blank?
11
11
 
12
- spaces = spaces.map { |space| space.respond_to?(:is_transparent?) ? (space unless space.is_transparent?) : space }.compact_blank
12
+ spaces = spaces.map { |space| space.respond_to?(:transparent?) ? (space unless space.transparent?) : space }.compact_blank
13
13
 
14
14
  next if spaces.blank?
15
15
 
@@ -17,7 +17,7 @@ namespace :decidim do
17
17
  next unless user.following_follows.count.positive?
18
18
 
19
19
  spaces.each do |space|
20
- Decidim::Admin::DestroyPrivateUsersFollowsJob.perform_later(user, space)
20
+ Decidim::Admin::ParticipatorySpace::DestroyMembersFollowsJob.perform_later(user, space)
21
21
  end
22
22
  end
23
23
  end
@@ -24,7 +24,6 @@ namespace :decidim do
24
24
  "pages" => "Pages",
25
25
  "participatory_processes" => "ParticipatoryProcesses",
26
26
  "proposals" => "Proposals",
27
- "sortitions" => "Sortitions",
28
27
  "surveys" => "Surveys",
29
28
  "system" => "System",
30
29
  "templates" => "Templates",
@@ -80,7 +80,6 @@ namespace :decidim do
80
80
  task transfer_user_groups_authorships: :environment do
81
81
  coauthorable_models = %w(
82
82
  Decidim::Proposals::Proposal
83
- Decidim::Proposals::CollaborativeDraft
84
83
  )
85
84
  authorable_models = %w(
86
85
  Decidim::Like