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,175 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples "access mode restricted participatory spaces" do |with_attachments: true|
4
+ let!(:organization) { create(:organization) }
5
+ let!(:admin) { create(:user, :admin, :confirmed, organization:) }
6
+ let!(:user) { create(:user, :confirmed, organization:) }
7
+
8
+ context "and no user is logged in" do
9
+ before do
10
+ switch_to_host(organization.host)
11
+ visit participatory_space_index_path
12
+ end
13
+
14
+ it "does not list the restricted participatory space" do
15
+ within css_class_selector do
16
+ within "h2" do
17
+ expect(page).to have_content("1")
18
+ end
19
+
20
+ expect(page).to have_content(translated(participatory_space.title, locale: :en))
21
+ expect(page).to have_css(".card__grid", count: 1)
22
+
23
+ expect(page).to have_no_content(translated(restricted_participatory_space.title, locale: :en))
24
+ end
25
+ end
26
+ end
27
+
28
+ context "when user is logged in and is not a participatory space member" do
29
+ context "when the user is not admin" do
30
+ before do
31
+ switch_to_host(organization.host)
32
+ login_as user, scope: :user
33
+ visit participatory_space_index_path
34
+ end
35
+
36
+ it "does not list the restricted participatory space" do
37
+ within css_class_selector do
38
+ within "h2" do
39
+ expect(page).to have_content("1")
40
+ end
41
+
42
+ expect(page).to have_content(translated(participatory_space.title, locale: :en))
43
+ expect(page).to have_css(".card__grid", count: 1)
44
+
45
+ expect(page).to have_no_content(translated(restricted_participatory_space.title, locale: :en))
46
+ end
47
+ end
48
+ end
49
+
50
+ context "when the user is admin" do
51
+ before do
52
+ switch_to_host(organization.host)
53
+ login_as admin, scope: :user
54
+ visit participatory_space_index_path
55
+ end
56
+
57
+ it "lists restricted participatory spaces" do
58
+ within css_class_selector do
59
+ within "h2" do
60
+ expect(page).to have_content("2")
61
+ end
62
+
63
+ expect(page).to have_content(translated(participatory_space.title, locale: :en))
64
+ expect(page).to have_content(translated(restricted_participatory_space.title, locale: :en))
65
+ expect(page).to have_css(".card__grid", count: 2)
66
+ end
67
+ end
68
+
69
+ it "links to the individual participatory space page" do
70
+ first(".card__grid-text", text: translated(restricted_participatory_space.title, locale: :en)).click
71
+
72
+ expect(page).to have_current_path restricted_participatory_space_path
73
+ expect(page).to have_content "This is a restricted space"
74
+ end
75
+
76
+ # Evaluators and Moderators do not have permissions to see the admin attachments page
77
+ if with_attachments
78
+ it "shows the privacy warning in attachments admin" do
79
+ visit restricted_participatory_space_attachment_path
80
+ within "#attachments" do
81
+ expect(page).to have_content(I18n.t("decidim.admin.attachments_privacy_warning.message"))
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ context "when user is logged in and is an participatory space member" do
89
+ before do
90
+ switch_to_host(organization.host)
91
+ login_as other_user, scope: :user
92
+ visit participatory_space_index_path
93
+ end
94
+
95
+ it "lists restricted participatory spaces" do
96
+ within css_class_selector do
97
+ within "h2" do
98
+ expect(page).to have_content("2")
99
+ end
100
+
101
+ expect(page).to have_content(translated(participatory_space.title, locale: :en))
102
+ expect(page).to have_content(translated(restricted_participatory_space.title, locale: :en))
103
+ expect(page).to have_css(".card__grid", count: 2)
104
+ end
105
+ end
106
+
107
+ it "links to the individual participatory space page" do
108
+ first(".card__grid-text", text: translated(restricted_participatory_space.title, locale: :en)).click
109
+
110
+ expect(page).to have_current_path restricted_participatory_space_path
111
+ expect(page).to have_content "This is a restricted space"
112
+ end
113
+ end
114
+ end
115
+
116
+ shared_examples "access mode restricted participatory spaces comments" do
117
+ let!(:participatory_space) { restricted_participatory_space }
118
+ let!(:member) { create(:member, user: member_user, participatory_space:) }
119
+ let!(:component) { create(:dummy_component, participatory_space:) }
120
+ let!(:commentable) { create(:dummy_resource, component:) }
121
+ let!(:comment) { create(:comment, commentable:, author: user) }
122
+
123
+ let!(:organization) { create(:organization) }
124
+ let!(:user) { create(:user, :confirmed, organization:) }
125
+ let!(:other_user) { create(:user, :confirmed, organization:) }
126
+ let!(:member_user) { create(:user, :confirmed, organization:) }
127
+
128
+ let(:resource_path) { resource_locator(commentable).path }
129
+
130
+ before do
131
+ switch_to_host(organization.host)
132
+ end
133
+
134
+ context "when the user is not logged in" do
135
+ it "cannot access the page" do
136
+ visit resource_path
137
+ expect(page).to have_content("You are not authorized to perform this action")
138
+ end
139
+ end
140
+
141
+ context "when the user is logged in and is a member" do
142
+ before do
143
+ login_as member_user, scope: :user
144
+ visit resource_path
145
+ end
146
+
147
+ it "can see the comments" do
148
+ expect(page).to have_css("#comments")
149
+ expect(page).to have_content(comment.body["en"])
150
+ end
151
+
152
+ it "can see the comment form" do
153
+ expect(page).to have_css("form#new_comment_for_DummyResource_#{commentable.id}")
154
+ end
155
+
156
+ it "can see the vote buttons" do
157
+ if commentable.comments_have_votes?
158
+ expect(page).to have_css(".comment__votes button", minimum: 2)
159
+ else
160
+ expect(page).to have_no_css(".comment__votes button")
161
+ end
162
+ end
163
+ end
164
+
165
+ context "when the user is logged in and is not a member" do
166
+ before do
167
+ login_as other_user, scope: :user
168
+ visit resource_path
169
+ end
170
+
171
+ it "cannot access the page" do
172
+ expect(page).to have_content("You are not authorized to perform this action")
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,244 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples "access mode transparent participatory spaces" do |with_attachments: true|
4
+ let!(:admin) { create(:user, :admin, :confirmed, organization:) }
5
+ let!(:user) { create(:user, :confirmed, organization:) }
6
+ let!(:other_user) { create(:user, :confirmed, organization:) }
7
+ let!(:other_user2) { create(:user, :confirmed, organization:) }
8
+
9
+ context "and no user is logged in" do
10
+ before do
11
+ switch_to_host(organization.host)
12
+ visit participatory_space_index_path
13
+ end
14
+
15
+ it "lists all the spaces" do
16
+ within css_class_selector do
17
+ within "h2" do
18
+ expect(page).to have_content("2")
19
+ end
20
+
21
+ expect(page).to have_content(translated(participatory_space.title, locale: :en))
22
+ expect(page).to have_css(".card__grid", count: 2)
23
+
24
+ expect(page).to have_content(translated(transparent_participatory_space.title, locale: :en))
25
+ end
26
+ end
27
+
28
+ it "links to the individual space page" do
29
+ first(".card__grid-text", text: translated(transparent_participatory_space.title, locale: :en)).click
30
+
31
+ expect(page).to have_current_path transparent_participatory_space_path
32
+ expect(page).to have_content "This is a transparent space"
33
+ end
34
+ end
35
+
36
+ context "when user is logged in" do
37
+ context "when is not a space member" do
38
+ before do
39
+ switch_to_host(organization.host)
40
+ login_as user, scope: :user
41
+ visit participatory_space_index_path
42
+ end
43
+
44
+ it "lists all the spaces" do
45
+ within css_class_selector do
46
+ within "h2" do
47
+ expect(page).to have_content("2")
48
+ end
49
+
50
+ expect(page).to have_content(translated(participatory_space.title, locale: :en))
51
+ expect(page).to have_css(".card__grid", count: 2)
52
+
53
+ expect(page).to have_content(translated(transparent_participatory_space.title, locale: :en))
54
+ end
55
+ end
56
+ end
57
+
58
+ # Evaluators and Moderators do not have permissions to see the admin attachments page
59
+ if with_attachments
60
+ context "when the user is admin" do
61
+ before do
62
+ switch_to_host(organization.host)
63
+ login_as admin, scope: :user
64
+ visit participatory_space_index_path
65
+ end
66
+
67
+ it "does not show the privacy warning in attachments admin" do
68
+ visit transparent_participatory_space_attachment_path
69
+ within "#attachments" do
70
+ expect(page).to have_no_content("Any participant could share this document to others")
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ shared_examples "access mode transparent participatory spaces comments" do
79
+ let!(:participatory_space) { transparent_participatory_space }
80
+ let!(:component) { create(:dummy_component, participatory_space:) }
81
+ let!(:commentable) { create(:dummy_resource, component:) }
82
+ let!(:comment) { create(:comment, commentable:, author: user) }
83
+
84
+ let!(:user) { create(:user, :confirmed, organization:) }
85
+ let!(:other_user) { create(:user, :confirmed, organization:) }
86
+ let!(:member_user) { create(:user, :confirmed, organization:) }
87
+ let!(:member) { create(:member, user: member_user, participatory_space:) }
88
+
89
+ let(:resource_path) { resource_locator(commentable).path }
90
+
91
+ before do
92
+ switch_to_host(organization.host)
93
+ end
94
+
95
+ context "when the user is not logged in" do
96
+ before do
97
+ visit resource_path
98
+ end
99
+
100
+ it "can see the comments" do
101
+ expect(page).to have_css("#comments")
102
+ expect(page).to have_content(comment.body["en"])
103
+ end
104
+
105
+ it "cannot see the comment form" do
106
+ expect(page).to have_no_css("form#new_comment_for_DummyResource_#{commentable.id}")
107
+ end
108
+
109
+ it "cannot see the vote buttons" do
110
+ expect(page).to have_no_css(".js-comment__votes--up")
111
+ expect(page).to have_no_css(".js-comment__votes--down")
112
+ end
113
+ end
114
+
115
+ context "when the user is logged in and is a member" do
116
+ before do
117
+ login_as member_user, scope: :user
118
+ visit resource_path
119
+ end
120
+
121
+ it "can see the comments" do
122
+ expect(page).to have_css("#comments")
123
+ expect(page).to have_content(comment.body["en"])
124
+ end
125
+
126
+ it "can see the comment form" do
127
+ expect(page).to have_css("form#new_comment_for_DummyResource_#{commentable.id}")
128
+ end
129
+
130
+ it "can add a new comment" do
131
+ within "form#new_comment_for_DummyResource_#{commentable.id}" do
132
+ fill_in "add-comment-DummyResource-#{commentable.id}", with: "This is a test comment from a member"
133
+ click_on "Publish comment"
134
+ end
135
+
136
+ expect(page).to have_content("This is a test comment from a member")
137
+ end
138
+
139
+ it "can see the vote buttons" do
140
+ if commentable.comments_have_votes?
141
+ expect(page).to have_css(".comment__votes button", minimum: 2)
142
+ else
143
+ expect(page).to have_no_css(".comment__votes button")
144
+ end
145
+ end
146
+
147
+ it "can vote on a comment" do
148
+ skip "Commentable comments has no votes" unless commentable.comments_have_votes?
149
+
150
+ within "#comment_#{comment.id}" do
151
+ click_on(".comment__votes button", match: :first)
152
+ end
153
+
154
+ expect(page).to have_css(".comment__votes button.is-vote-selected")
155
+ end
156
+ end
157
+
158
+ context "when the user is logged in and is not a member" do
159
+ before do
160
+ login_as other_user, scope: :user
161
+ visit resource_path
162
+ end
163
+
164
+ it "can see the comments" do
165
+ expect(page).to have_css("#comments")
166
+ expect(page).to have_content(comment.body["en"])
167
+ end
168
+
169
+ it "cannot see the comment form" do
170
+ expect(page).to have_no_css("form#new_comment_for_DummyResource_#{commentable.id}")
171
+ expect(page).to have_content("You are not able to comment at this moment")
172
+ end
173
+
174
+ it "cannot see the vote buttons" do
175
+ expect(page).to have_no_css(".js-comment__votes--up")
176
+ expect(page).to have_no_css(".js-comment__votes--down")
177
+ end
178
+ end
179
+
180
+ context "when the user is logged in and is a member" do
181
+ before do
182
+ login_as member_user, scope: :user
183
+ visit resource_path
184
+ end
185
+
186
+ it "can see the comments" do
187
+ expect(page).to have_css("#comments")
188
+ expect(page).to have_content(comment.body["en"])
189
+ end
190
+
191
+ it "can see the comment form" do
192
+ expect(page).to have_css("form#new_comment_for_DummyResource_#{commentable.id}")
193
+ end
194
+
195
+ it "can add a new comment" do
196
+ within "form#new_comment_for_DummyResource_#{commentable.id}" do
197
+ fill_in "add-comment-DummyResource-#{commentable.id}", with: "This is a test comment from a member"
198
+ click_on "Publish comment"
199
+ end
200
+
201
+ expect(page).to have_content("This is a test comment from a member")
202
+ end
203
+
204
+ it "can see the vote buttons" do
205
+ if commentable.comments_have_votes?
206
+ expect(page).to have_css(".comment__votes button", minimum: 2)
207
+ else
208
+ expect(page).to have_no_css(".comment__votes button")
209
+ end
210
+ end
211
+
212
+ it "can vote on a comment" do
213
+ skip "Commentable comments has no votes" unless commentable.comments_have_votes?
214
+
215
+ within "#comment_#{comment.id}" do
216
+ click_on(".comment__votes button", match: :first)
217
+ end
218
+
219
+ expect(page).to have_css(".comment__votes button.is-vote-selected")
220
+ end
221
+ end
222
+
223
+ context "when the user is logged in and is not a member" do
224
+ before do
225
+ login_as other_user, scope: :user
226
+ visit resource_path
227
+ end
228
+
229
+ it "can see the comments" do
230
+ expect(page).to have_css("#comments")
231
+ expect(page).to have_content(comment.body["en"])
232
+ end
233
+
234
+ it "cannot see the comment form" do
235
+ expect(page).to have_no_css("form#new_comment_for_DummyResource_#{commentable.id}")
236
+ expect(page).to have_content("You are not able to comment at this moment")
237
+ end
238
+
239
+ it "cannot see the vote buttons" do
240
+ expect(page).to have_no_css(".js-comment__votes--up")
241
+ expect(page).to have_no_css(".js-comment__votes--down")
242
+ end
243
+ end
244
+ end
@@ -87,7 +87,7 @@ end
87
87
 
88
88
  shared_examples "admin creates resource gallery" do
89
89
  context "when uploading images" do
90
- let(:uploaded_photos) do
90
+ let(:uploaded_attachments) do
91
91
  [
92
92
  {
93
93
  title: "Picture of the city",
@@ -99,10 +99,10 @@ shared_examples "admin creates resource gallery" do
99
99
  }
100
100
  ]
101
101
  end
102
- let(:photos) { [] }
102
+ let(:current_attachments) { [] }
103
103
 
104
104
  it "creates a gallery for the resource" do
105
- expect { command.call }.to change(Decidim::Attachment, :count).by(uploaded_photos.count)
105
+ expect { command.call }.to change(Decidim::Attachment, :count).by(uploaded_attachments.count)
106
106
 
107
107
  resource = resource_class.last
108
108
  expect(resource.photos.count).to eq(2)
@@ -111,7 +111,7 @@ shared_examples "admin creates resource gallery" do
111
111
  end
112
112
 
113
113
  context "when gallery is left blank" do
114
- let(:uploaded_photos) { [] }
114
+ let(:uploaded_attachments) { [] }
115
115
 
116
116
  it "broadcasts ok" do
117
117
  expect { command.call }.to broadcast(:ok)
@@ -122,7 +122,7 @@ end
122
122
 
123
123
  shared_examples "admin manages resource gallery" do
124
124
  context "when managing images" do
125
- let(:uploaded_photos) do
125
+ let(:uploaded_attachments) do
126
126
  [
127
127
  {
128
128
  title: "Picture of the city",
@@ -134,10 +134,10 @@ shared_examples "admin manages resource gallery" do
134
134
  }
135
135
  ]
136
136
  end
137
- let(:photos) { [] }
137
+ let(:current_attachments) { [] }
138
138
 
139
139
  it "creates a gallery for the resource" do
140
- expect { command.call }.to change(Decidim::Attachment, :count).by(uploaded_photos.count)
140
+ expect { command.call }.to change(Decidim::Attachment, :count).by(uploaded_attachments.count)
141
141
  resource = resource_class.last
142
142
  expect(resource.photos.count).to eq(2)
143
143
  last_attachment = Decidim::Attachment.last
@@ -145,7 +145,7 @@ shared_examples "admin manages resource gallery" do
145
145
  end
146
146
 
147
147
  context "when gallery is left blank" do
148
- let(:uploaded_photos) { [] }
148
+ let(:uploaded_attachments) { [] }
149
149
 
150
150
  it "broadcasts ok" do
151
151
  expect { command.call }.to broadcast(:ok)
@@ -155,8 +155,8 @@ shared_examples "admin manages resource gallery" do
155
155
  context "when images are removed" do
156
156
  let!(:image1) { create(:attachment, :with_image, attached_to: resource) }
157
157
  let!(:image2) { create(:attachment, :with_image, attached_to: resource) }
158
- let(:uploaded_photos) { [] }
159
- let(:current_photos) { [image1] }
158
+ let(:uploaded_attachments) { [] }
159
+ let(:current_attachments) { [image1.id] }
160
160
 
161
161
  it "to decrease the number of photos in the gallery" do
162
162
  expect(resource.attachments.count).to eq(2)
@@ -8,7 +8,7 @@ shared_examples "amendment event" do
8
8
  it_behaves_like "a simple event email"
9
9
  it_behaves_like "a simple event notification"
10
10
 
11
- let(:emendation_author_nickname) { "@#{emendation.creator_author.nickname}" }
11
+ let(:emendation_author_name) { emendation.creator_author.name }
12
12
  let(:emendation_path) { Decidim::ResourceLocatorPresenter.new(emendation).path }
13
13
  let(:emendation_author_path) { Decidim::UserPresenter.new(emendation.creator_author).profile_path }
14
14
  let(:amendable_path) { Decidim::ResourceLocatorPresenter.new(amendable).path }
@@ -16,5 +16,5 @@ shared_examples "amendment event" do
16
16
  let(:email_intro) { "An amendment has been #{amendment_type} for #{amendable_title}. You can see it from this page:" }
17
17
  let(:email_outro) { "You have received this notification because you are following #{amendable_title}. You can stop receiving notifications following the previous link." }
18
18
 
19
- let(:notification_title) { "The <a href=\"#{emendation_path}\">amendment</a> created by <a href=\"#{emendation_author_path}\">#{emendation_author_nickname}</a> has been #{amendment_type} for <a href=\"#{amendable_path}\">#{amendable_title}</a>." } # rubocop:disable Layout/LineLength
19
+ let(:notification_title) { "The <a href=\"#{emendation_path}\">amendment</a> created by <a href=\"#{emendation_author_path}\">#{emendation_author_name}</a> has been #{amendment_type} for <a href=\"#{amendable_path}\">#{amendable_title}</a>." } # rubocop:disable Layout/LineLength
20
20
  end
@@ -10,15 +10,15 @@ shared_examples "amendment promoted event" do
10
10
  it_behaves_like "a simple event email"
11
11
  it_behaves_like "a simple event notification"
12
12
 
13
- let(:emendation_author_nickname) { "@#{emendation.creator_author.nickname}" }
13
+ let(:emendation_author_name) { emendation.creator_author.name }
14
14
  let(:emendation_path) { Decidim::ResourceLocatorPresenter.new(emendation).path }
15
15
  let(:emendation_author_path) { Decidim::UserPresenter.new(emendation.creator_author).profile_path }
16
16
  let(:amendable_path) { Decidim::ResourceLocatorPresenter.new(amendable).path }
17
17
 
18
- let(:email_subject) { "An amendment from #{emendation_author_nickname} has been published as a new proposal" }
18
+ let(:email_subject) { "An amendment from #{emendation_author_name} has been published as a new proposal" }
19
19
  let(:email_intro) { "A rejected amendment for #{amendable_title} has been published as a new #{amendable_type}. You can see it from this page:" }
20
20
  let(:email_outro) { "You have received this notification because you are following #{amendable_title}. You can stop receiving notifications following the previous link." }
21
21
  # rubocop:disable Layout/LineLength
22
- let(:notification_title) { "A <a href=\"#{emendation_path}\">rejected amendment</a> for <a href=\"#{amendable_path}\">#{amendable_title}</a> has been published as a new #{amendable_type} by <a href=\"#{emendation_author_path}\">#{emendation_author_nickname}</a>." }
22
+ let(:notification_title) { "A <a href=\"#{emendation_path}\">rejected amendment</a> for <a href=\"#{amendable_path}\">#{amendable_title}</a> has been published as a new #{amendable_type} by <a href=\"#{emendation_author_path}\">#{emendation_author_name}</a>." }
23
23
  # rubocop:enable Layout/LineLength
24
24
  end