decidim-core 0.29.4 → 0.30.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/address/show.erb +3 -3
  3. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  4. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  5. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  6. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  7. data/app/cells/decidim/author/flag.erb +6 -0
  8. data/app/cells/decidim/author/flag_user.erb +14 -0
  9. data/app/cells/decidim/author/show.erb +4 -2
  10. data/app/cells/decidim/author_cell.rb +1 -1
  11. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  12. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  13. data/app/cells/decidim/comments_button_cell.rb +14 -2
  14. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  15. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  16. data/app/cells/decidim/content_blocks/participatory_space_extra_data/extra_data.erb +2 -2
  17. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  18. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  19. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  20. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  21. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  22. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  23. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  24. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  25. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  26. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  27. data/app/cells/decidim/flag_modal/flag_user.erb +34 -0
  28. data/app/cells/decidim/flag_modal/show.erb +52 -0
  29. data/app/cells/decidim/flag_modal_cell.rb +56 -0
  30. data/app/cells/decidim/follow_button/show.erb +1 -2
  31. data/app/cells/decidim/follow_button_cell.rb +5 -0
  32. data/app/cells/decidim/map/show.erb +3 -0
  33. data/app/cells/decidim/map/template.erb +14 -0
  34. data/app/cells/decidim/map_cell.rb +39 -0
  35. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  36. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  37. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  38. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +4 -4
  39. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +3 -5
  40. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  41. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  42. data/app/cells/decidim/profile_actions/show.erb +1 -1
  43. data/app/cells/decidim/profile_sidebar/show.erb +167 -0
  44. data/app/cells/decidim/profile_sidebar_cell.rb +68 -0
  45. data/app/cells/decidim/progress_bar/show.erb +2 -2
  46. data/app/cells/decidim/report_button/already_reported_modal.erb +2 -2
  47. data/app/cells/decidim/report_button/flag_modal.erb +27 -13
  48. data/app/cells/decidim/report_button_cell.rb +9 -2
  49. data/app/cells/decidim/resource_history/show.erb +20 -0
  50. data/app/cells/decidim/resource_history_cell.rb +66 -0
  51. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  52. data/app/cells/decidim/resource_types_filter_cell.rb +6 -6
  53. data/app/cells/decidim/share_button_cell.rb +0 -4
  54. data/app/cells/decidim/share_widget/modal.erb +26 -0
  55. data/app/cells/decidim/share_widget/show.erb +2 -0
  56. data/app/cells/decidim/share_widget_cell.rb +20 -0
  57. data/app/cells/decidim/tags/show.erb +7 -4
  58. data/app/cells/decidim/tags_cell.rb +11 -72
  59. data/app/cells/decidim/user_activity/show.erb +1 -1
  60. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  61. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  62. data/app/commands/decidim/create_omniauth_registration.rb +21 -17
  63. data/app/commands/decidim/create_report.rb +8 -11
  64. data/app/commands/decidim/create_user_group.rb +6 -2
  65. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  66. data/app/commands/decidim/invite_user.rb +1 -1
  67. data/app/commands/decidim/search.rb +0 -14
  68. data/app/commands/decidim/update_account.rb +11 -3
  69. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  70. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  71. data/app/commands/decidim/update_user_group.rb +7 -1
  72. data/app/constraints/decidim/current_component.rb +1 -1
  73. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  74. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  75. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  76. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  77. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  78. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  79. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  80. data/app/controllers/concerns/decidim/headers/browser_feature_permissions.rb +50 -0
  81. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  82. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  83. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  84. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  85. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  86. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -4
  87. data/app/controllers/decidim/application_controller.rb +10 -0
  88. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  89. data/app/controllers/decidim/components/base_controller.rb +3 -7
  90. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  91. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  92. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  93. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  94. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  95. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  96. data/app/controllers/decidim/follows_controller.rb +1 -1
  97. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  98. data/app/controllers/decidim/homepage_controller.rb +0 -1
  99. data/app/controllers/decidim/open_data_controller.rb +33 -8
  100. data/app/controllers/decidim/profiles_controller.rb +2 -2
  101. data/app/controllers/decidim/reports_controller.rb +2 -7
  102. data/app/controllers/decidim/user_activities_controller.rb +1 -1
  103. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  104. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  105. data/app/forms/decidim/account_form.rb +2 -5
  106. data/app/forms/decidim/amendable/form.rb +4 -2
  107. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  108. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  109. data/app/forms/decidim/omniauth_registration_form.rb +15 -2
  110. data/app/forms/decidim/registration_form.rb +1 -1
  111. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  112. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  113. data/app/helpers/decidim/amendments_helper.rb +0 -9
  114. data/app/helpers/decidim/application_helper.rb +6 -2
  115. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  116. data/app/helpers/decidim/cache_helper.rb +1 -1
  117. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  118. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  119. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  120. data/app/helpers/decidim/layout_helper.rb +6 -0
  121. data/app/helpers/decidim/menu_helper.rb +2 -2
  122. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  123. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  124. data/app/helpers/decidim/modal_helper.rb +23 -0
  125. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  126. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  127. data/app/helpers/decidim/orders_helper.rb +1 -2
  128. data/app/helpers/decidim/paginate_helper.rb +1 -1
  129. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  130. data/app/helpers/decidim/passwords_helper.rb +2 -2
  131. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  132. data/app/helpers/decidim/tooltip_helper.rb +1 -4
  133. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  134. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  135. data/app/jobs/decidim/export_job.rb +5 -1
  136. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  137. data/app/jobs/decidim/open_data_job.rb +4 -4
  138. data/app/mailers/decidim/export_mailer.rb +7 -12
  139. data/app/mailers/decidim/notifications_digest_mailer.rb +1 -7
  140. data/app/mailers/decidim/reported_mailer.rb +2 -18
  141. data/app/models/decidim/action_log.rb +20 -1
  142. data/app/models/decidim/category.rb +4 -0
  143. data/app/models/decidim/component.rb +25 -3
  144. data/app/models/decidim/metric.rb +2 -1
  145. data/app/models/decidim/moderation.rb +16 -0
  146. data/app/models/decidim/newsletter.rb +12 -8
  147. data/app/models/decidim/organization.rb +7 -3
  148. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  149. data/app/models/decidim/private_export.rb +24 -0
  150. data/app/models/decidim/push_notification_message.rb +1 -1
  151. data/app/models/decidim/report.rb +1 -1
  152. data/app/models/decidim/scope.rb +4 -0
  153. data/app/models/decidim/share_token.rb +36 -10
  154. data/app/models/decidim/taxonomization.rb +23 -0
  155. data/app/models/decidim/taxonomy.rb +139 -0
  156. data/app/models/decidim/taxonomy_filter.rb +130 -0
  157. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  158. data/app/models/decidim/user.rb +13 -23
  159. data/app/models/decidim/user_base_entity.rb +12 -4
  160. data/app/models/decidim/user_moderation.rb +9 -0
  161. data/app/models/decidim/user_report.rb +4 -0
  162. data/app/packs/entrypoints/decidim_core.js +1 -0
  163. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  164. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  165. data/app/packs/images/decidim/brands/google.svg +7 -1
  166. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  167. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  168. data/app/packs/src/decidim/clipboard.js +18 -9
  169. data/app/packs/src/decidim/confirm.js +79 -59
  170. data/app/packs/src/decidim/datepicker/datepicker_functions.js +3 -3
  171. data/app/packs/src/decidim/decidim_application.js +1 -0
  172. data/app/packs/src/decidim/form_remote.js +1 -1
  173. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  174. data/app/packs/src/decidim/impersonation.js +1 -1
  175. data/app/packs/src/decidim/index.js +13 -5
  176. data/app/packs/src/decidim/input_character_counter.js +1 -1
  177. data/app/packs/src/decidim/map/provider/here.js +1 -1
  178. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  179. data/app/packs/src/decidim/session_timeouter.js +1 -1
  180. data/app/packs/src/decidim/sticky_footer.js +29 -0
  181. data/app/packs/src/decidim/sticky_header.js +6 -31
  182. data/app/packs/src/decidim/user_registrations.js +13 -0
  183. data/app/packs/src/decidim/utilities/dom.js +148 -0
  184. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +212 -0
  185. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  186. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  187. data/app/packs/stylesheets/decidim/_cards.scss +1 -1
  188. data/app/packs/stylesheets/decidim/_content_blocks.scss +0 -4
  189. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  190. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  191. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  192. data/app/packs/stylesheets/decidim/_header.scss +37 -60
  193. data/app/packs/stylesheets/decidim/_layout.scss +32 -2
  194. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  195. data/app/packs/stylesheets/decidim/_modal.scss +42 -0
  196. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  197. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  198. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  199. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  200. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  201. data/app/packs/stylesheets/decidim/application.scss +1 -1
  202. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  203. data/app/packs/stylesheets/decidim/map.scss +7 -10
  204. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  205. data/app/permissions/decidim/default_permissions.rb +0 -2
  206. data/app/permissions/decidim/permissions.rb +8 -2
  207. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  208. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  209. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  210. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  211. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  212. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  213. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  214. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  215. data/app/presenters/decidim/log/user_presenter.rb +0 -1
  216. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  217. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  218. data/app/presenters/decidim/notification_to_mailer_presenter.rb +3 -7
  219. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  220. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  221. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  222. data/app/presenters/decidim/user_presenter.rb +1 -1
  223. data/app/queries/decidim/last_activity.rb +0 -25
  224. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  225. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  226. data/app/queries/decidim/public_activities.rb +1 -12
  227. data/app/queries/decidim/stats_users_count.rb +2 -2
  228. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  229. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  230. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  231. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  232. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  233. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  234. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  235. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  236. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  237. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  238. data/app/services/decidim/action_authorizer.rb +32 -3
  239. data/app/services/decidim/base_diff_renderer.rb +1 -3
  240. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  241. data/app/services/decidim/onboarding_manager.rb +272 -0
  242. data/app/services/decidim/open_data_exporter.rb +139 -13
  243. data/app/services/decidim/static_map_generator.rb +1 -1
  244. data/app/services/decidim/traceability.rb +13 -0
  245. data/app/uploaders/decidim/application_uploader.rb +1 -1
  246. data/app/validators/etiquette_validator.rb +9 -2
  247. data/app/validators/passthru_validator.rb +1 -1
  248. data/app/validators/translated_etiquette_validator.rb +32 -0
  249. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  250. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  251. data/app/views/decidim/application/_collection.html.erb +30 -18
  252. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  253. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  254. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  255. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  256. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  257. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  258. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  259. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  260. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  261. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  262. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  263. data/app/views/decidim/last_activities/index.html.erb +1 -1
  264. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +2 -1
  265. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  266. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  267. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  268. data/app/views/decidim/open_data/index.html.erb +108 -0
  269. data/app/views/decidim/pages/show.html.erb +2 -1
  270. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  271. data/app/views/decidim/reported_mailer/hide.html.erb +9 -0
  272. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  273. data/app/views/decidim/searches/_count.html.erb +1 -1
  274. data/app/views/decidim/searches/_filters.html.erb +38 -40
  275. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  276. data/app/views/decidim/shared/_orders.html.erb +2 -2
  277. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  278. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  279. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  280. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  281. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  282. data/app/views/kaminari/decidim/_page.html.erb +1 -1
  283. data/app/views/kaminari/decidim/_paginator.html.erb +1 -1
  284. data/app/views/layouts/decidim/_application.html.erb +0 -1
  285. data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
  286. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  287. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  288. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  289. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  290. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  291. data/app/views/layouts/decidim/footer/_main_legal.html.erb +1 -1
  292. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  293. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  294. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  295. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  296. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +11 -5
  297. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +5 -5
  298. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  299. data/config/assets.rb +2 -1
  300. data/config/locales/ar.yml +35 -74
  301. data/config/locales/bg.yml +33 -74
  302. data/config/locales/bs-BA.yml +0 -2
  303. data/config/locales/ca.yml +370 -102
  304. data/config/locales/cs.yml +374 -102
  305. data/config/locales/de.yml +350 -88
  306. data/config/locales/el.yml +22 -58
  307. data/config/locales/en.yml +350 -82
  308. data/config/locales/eo.yml +0 -4
  309. data/config/locales/es-MX.yml +364 -99
  310. data/config/locales/es-PY.yml +369 -104
  311. data/config/locales/es.yml +370 -102
  312. data/config/locales/eu.yml +426 -156
  313. data/config/locales/fi-plain.yml +366 -76
  314. data/config/locales/fi.yml +370 -77
  315. data/config/locales/fr-CA.yml +176 -97
  316. data/config/locales/fr.yml +176 -94
  317. data/config/locales/ga-IE.yml +4 -25
  318. data/config/locales/gl.yml +20 -58
  319. data/config/locales/hu.yml +30 -62
  320. data/config/locales/id-ID.yml +21 -57
  321. data/config/locales/is-IS.yml +5 -25
  322. data/config/locales/it.yml +36 -94
  323. data/config/locales/ja.yml +231 -112
  324. data/config/locales/lb.yml +28 -76
  325. data/config/locales/lt.yml +24 -64
  326. data/config/locales/lv.yml +21 -58
  327. data/config/locales/nl.yml +23 -75
  328. data/config/locales/no.yml +23 -70
  329. data/config/locales/pl.yml +30 -72
  330. data/config/locales/pt-BR.yml +41 -63
  331. data/config/locales/pt.yml +23 -70
  332. data/config/locales/ro-RO.yml +115 -184
  333. data/config/locales/ru.yml +13 -43
  334. data/config/locales/sk.yml +24 -70
  335. data/config/locales/sl.yml +0 -4
  336. data/config/locales/sr-CS.yml +0 -2
  337. data/config/locales/sv.yml +138 -106
  338. data/config/locales/tr-TR.yml +29 -75
  339. data/config/locales/uk.yml +6 -29
  340. data/config/locales/zh-CN.yml +21 -68
  341. data/config/locales/zh-TW.yml +23 -62
  342. data/config/routes.rb +4 -10
  343. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  344. data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
  345. data/db/migrate/20180706104107_add_nickname_to_managed_users.rb +1 -1
  346. data/db/migrate/20181001124950_move_users_groups_to_users_table.rb +1 -1
  347. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  348. data/db/migrate/20190412131728_fix_user_names.rb +1 -1
  349. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  350. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  351. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  352. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  353. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  354. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  355. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  356. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  357. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  358. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  359. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  360. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  361. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  362. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  363. data/decidim-core.gemspec +14 -17
  364. data/lib/decidim/action_authorization.rb +3 -2
  365. data/lib/decidim/amendable.rb +1 -1
  366. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  367. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  368. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  369. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  370. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  371. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  372. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  373. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  374. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  375. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  376. data/lib/decidim/api/types/amendment_type.rb +5 -7
  377. data/lib/decidim/api/types/area_api_type.rb +3 -3
  378. data/lib/decidim/api/types/attachment_type.rb +3 -3
  379. data/lib/decidim/api/types/category_type.rb +2 -2
  380. data/lib/decidim/api/types/decidim_type.rb +5 -1
  381. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  382. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  383. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  384. data/lib/decidim/api/types/metric_type.rb +1 -1
  385. data/lib/decidim/api/types/organization_type.rb +5 -0
  386. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  387. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  388. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  389. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  390. data/lib/decidim/api/types/session_type.rb +1 -2
  391. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  392. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  393. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  394. data/lib/decidim/api/types/user_group_type.rb +7 -20
  395. data/lib/decidim/api/types/user_type.rb +7 -20
  396. data/lib/decidim/asset_router/storage.rb +6 -11
  397. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +2 -1
  398. data/lib/decidim/attachment_attributes.rb +1 -1
  399. data/lib/decidim/attribute_encryptor.rb +1 -1
  400. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  401. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  402. data/lib/decidim/attributes/time_with_zone.rb +1 -5
  403. data/lib/decidim/attributes.rb +2 -0
  404. data/lib/decidim/authorization_form_builder.rb +0 -7
  405. data/lib/decidim/coauthorable.rb +1 -1
  406. data/lib/decidim/command.rb +3 -3
  407. data/lib/decidim/commands/destroy_resource.rb +5 -1
  408. data/lib/decidim/commands/resource_handler.rb +2 -2
  409. data/lib/decidim/commands/restore_resource.rb +45 -0
  410. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  411. data/lib/decidim/component_manifest.rb +7 -0
  412. data/lib/decidim/content_parsers/blob_parser.rb +8 -10
  413. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  414. data/lib/decidim/core/api.rb +2 -0
  415. data/lib/decidim/core/engine.rb +21 -7
  416. data/lib/decidim/core/menu.rb +0 -5
  417. data/lib/decidim/core/seeds.rb +42 -2
  418. data/lib/decidim/core/test/factories.rb +105 -2
  419. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  420. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  421. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  422. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  423. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  424. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  425. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  426. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  427. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  428. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  429. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  430. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  431. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  432. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  433. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  434. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  435. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  436. data/lib/decidim/core/test/shared_examples/reports_examples.rb +15 -53
  437. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  438. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  439. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  440. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  441. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +7 -14
  442. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  443. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  444. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  445. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  446. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  447. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  448. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +0 -26
  449. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -28
  450. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  451. data/lib/decidim/core/test.rb +9 -5
  452. data/lib/decidim/core/version.rb +1 -1
  453. data/lib/decidim/core.rb +58 -0
  454. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  455. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  456. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  457. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  458. data/lib/decidim/download_your_data_serializers.rb +19 -0
  459. data/lib/decidim/exporters/csv.rb +6 -0
  460. data/lib/decidim/exporters/export_manifest.rb +14 -0
  461. data/lib/decidim/exporters/pdf.rb +26 -22
  462. data/lib/decidim/filter_form_builder.rb +12 -15
  463. data/lib/decidim/form_builder.rb +6 -129
  464. data/lib/decidim/has_category.rb +5 -1
  465. data/lib/decidim/has_private_users.rb +4 -0
  466. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  467. data/lib/decidim/has_upload_validations.rb +1 -1
  468. data/lib/decidim/legacy_form_builder.rb +118 -0
  469. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  470. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  471. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  472. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  473. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  474. data/lib/decidim/maintenance/import_models/category.rb +107 -0
  475. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  476. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  477. data/lib/decidim/maintenance/import_models.rb +19 -0
  478. data/lib/decidim/maintenance/taxonomy_importer.rb +132 -0
  479. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  480. data/lib/decidim/maintenance.rb +12 -0
  481. data/lib/decidim/map/autocomplete.rb +52 -8
  482. data/lib/decidim/map/dynamic_map.rb +1 -1
  483. data/lib/decidim/map/provider/dynamic_map/here.rb +40 -1
  484. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  485. data/lib/decidim/map/provider/static_map/here.rb +0 -34
  486. data/lib/decidim/map.rb +3 -6
  487. data/lib/decidim/moderation_tools.rb +16 -19
  488. data/lib/decidim/newsletter_encryptor.rb +1 -1
  489. data/lib/decidim/nicknamizable.rb +9 -6
  490. data/lib/decidim/paddable.rb +1 -1
  491. data/lib/decidim/participable.rb +10 -10
  492. data/lib/decidim/participatory_space_user.rb +10 -0
  493. data/lib/decidim/private_download_helper.rb +15 -0
  494. data/lib/decidim/record_encryptor.rb +51 -46
  495. data/lib/decidim/reportable.rb +2 -6
  496. data/lib/decidim/resourceable.rb +16 -0
  497. data/lib/decidim/seeds.rb +18 -20
  498. data/lib/decidim/settings_manifest.rb +34 -1
  499. data/lib/decidim/soft_deletable.rb +17 -0
  500. data/lib/decidim/taxonomizable.rb +72 -0
  501. data/lib/decidim/translatable_attributes.rb +1 -5
  502. data/lib/decidim/view_model.rb +0 -1
  503. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  504. data/lib/tasks/decidim_procfile.rake +6 -0
  505. data/lib/tasks/decidim_tasks.rake +1 -0
  506. data/lib/tasks/decidim_taxonomies.rake +155 -0
  507. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  508. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  509. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +20 -23
  510. data/lib/tasks/upgrade/migrations.rake +91 -0
  511. metadata +203 -112
  512. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  513. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  514. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  515. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  516. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  517. data/app/cells/decidim/report_user_button/already_reported_modal.erb +0 -11
  518. data/app/cells/decidim/report_user_button/flag_modal.erb +0 -46
  519. data/app/cells/decidim/report_user_button/show.erb +0 -2
  520. data/app/cells/decidim/report_user_button_cell.rb +0 -59
  521. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  522. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  523. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  524. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  525. data/app/commands/decidim/update_user_interests.rb +0 -41
  526. data/app/controllers/decidim/scopes_controller.rb +0 -84
  527. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  528. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  529. data/app/forms/decidim/user_interests_form.rb +0 -17
  530. data/app/helpers/decidim/categories_helper.rb +0 -26
  531. data/app/helpers/decidim/scopes_helper.rb +0 -105
  532. data/app/jobs/decidim/hide_child_resources_job.rb +0 -24
  533. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  534. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  535. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  536. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  537. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  538. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  539. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  540. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  541. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  542. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  543. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  544. data/app/views/decidim/reported_mailer/hidden_automatically.html.erb +0 -25
  545. data/app/views/decidim/reported_mailer/hidden_manually.html.erb +0 -25
  546. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  547. data/app/views/decidim/scopes/picker.html.erb +0 -53
  548. data/app/views/decidim/shared/_comments.html.erb +0 -0
  549. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  550. data/app/views/decidim/shared/_tags.html.erb +0 -1
  551. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  552. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  553. data/app/views/decidim/user_interests/show.html.erb +0 -22
  554. data/config/initializers/foundation_rails_helper.rb +0 -4
  555. data/config/locales/ca-IT.yml +0 -2122
  556. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  557. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  558. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  559. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  560. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  561. data/lib/decidim/seven_zip_wrapper.rb +0 -29
  562. data/lib/tasks/upgrade/clean_hidden_resources.rake +0 -33
@@ -4,8 +4,8 @@ require "spec_helper"
4
4
 
5
5
  shared_examples_for "general conversation permissions" do
6
6
  let(:context) { { conversation: } }
7
- let(:another_user) { create :user }
8
- let(:group) { create :user_group }
7
+ let(:another_user) { create(:user) }
8
+ let(:group) { create(:user_group) }
9
9
 
10
10
  context "when the originator of the conversation is the user" do
11
11
  let!(:conversation) do
@@ -46,7 +46,7 @@ shared_examples_for "general conversation permissions" do
46
46
  context "when the interlocutor is specified in the context" do
47
47
  let(:context) { { conversation:, interlocutor: } }
48
48
  let(:originator) { interlocutor }
49
- let(:interlocutor) { create :user }
49
+ let(:interlocutor) { create(:user) }
50
50
 
51
51
  let!(:conversation) do
52
52
  Decidim::Messaging::Conversation.start!(
@@ -113,8 +113,8 @@ end
113
113
 
114
114
  shared_examples_for "restricted conversation permissions" do
115
115
  let(:context) { { conversation: } }
116
- let(:user) { create :user }
117
- let(:interlocutor) { create :user, organization: user.organization }
116
+ let(:user) { create(:user) }
117
+ let(:interlocutor) { create(:user, organization: user.organization) }
118
118
  let!(:conversation) do
119
119
  Decidim::Messaging::Conversation.start(
120
120
  originator: user,
@@ -128,14 +128,14 @@ shared_examples_for "restricted conversation permissions" do
128
128
  end
129
129
 
130
130
  context "when interlocutor restricts communications" do
131
- let(:interlocutor) { create :user, direct_message_types: "followed-only" }
131
+ let(:interlocutor) { create(:user, direct_message_types: "followed-only") }
132
132
 
133
133
  context "and does not follow the user" do
134
134
  it { is_expected.to eq false }
135
135
  end
136
136
 
137
137
  context "and follows the user" do
138
- let!(:follow) { create :follow, user: interlocutor, followable: user }
138
+ let!(:follow) { create(:follow, user: interlocutor, followable: user) }
139
139
 
140
140
  it { is_expected.to eq true }
141
141
  end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples "visit unpublished resource with a share token" do
4
+ context "when no share_token is provided" do
5
+ before do
6
+ visit_resource_page
7
+ end
8
+
9
+ it "does not allow visiting resource" do
10
+ expect(page).to have_content "You are not authorized"
11
+ expect(page).to have_no_current_path(resource_path, ignore_query: true)
12
+ end
13
+ end
14
+
15
+ context "when a share_token is provided" do
16
+ let(:share_token) { create(:share_token, token: "VALID_TOKEN", token_for: resource) }
17
+ let(:params) { { share_token: share_token.token } }
18
+
19
+ before do
20
+ uri = URI(resource_path)
21
+ uri.query = URI.encode_www_form(params.to_a)
22
+ visit uri
23
+ end
24
+
25
+ context "when a valid share_token is provided" do
26
+ it "allows visiting the resource" do
27
+ expect(page).to have_no_content "You are not authorized"
28
+ expect(current_url).to include(params[:share_token])
29
+ expect(page).to have_current_path(resource_path, ignore_query: true)
30
+
31
+ # repeat visit without the token in the params to check for the session
32
+ visit resource_path
33
+ expect(page).to have_no_content "You are not authorized"
34
+ expect(current_url).not_to include(params[:share_token])
35
+ expect(page).to have_current_path(resource_path, ignore_query: true)
36
+ end
37
+ end
38
+
39
+ context "when an invalid share_token is provided" do
40
+ let(:share_token) { create(:share_token, :expired, token: "INVALID_TOKEN_FOR_UNREGISTERED", token_for: resource) }
41
+
42
+ it "does not allow visiting resource" do
43
+ expect(page).to have_content "You are not authorized"
44
+ expect(page).to have_no_current_path(resource_path, ignore_query: true)
45
+ end
46
+ end
47
+
48
+ context "when the token requires the user to be registered" do
49
+ let!(:share_token) { create(:share_token, token: "VALID_TOKEN_FOR_REGISTERED", token_for: resource, registered_only: true) }
50
+ let!(:user) { create(:user, :confirmed, organization:) }
51
+
52
+ it "does not allow visiting resource" do
53
+ expect(page).to have_content "You are not authorized"
54
+ expect(page).to have_no_current_path(resource_path, ignore_query: true)
55
+ end
56
+
57
+ it "allows visiting resource to logged users" do
58
+ login_as user, scope: :user
59
+ sleep 0.5 # add a delay to ensure the user session cookie is set
60
+ uri = URI(resource_path)
61
+ uri.query = URI.encode_www_form(params.to_a)
62
+ visit uri
63
+ expect(page).to have_no_content "You are not authorized"
64
+ expect(page).to have_current_path(resource_path, ignore_query: true)
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ shared_examples "preview component with a share_token" do
71
+ let!(:component) { create(:component, manifest_name:, participatory_space:, published_at: nil) }
72
+ let(:resource) { component }
73
+ let(:resource_path) { main_component_path(component) }
74
+
75
+ def visit_resource_page
76
+ visit_component
77
+ end
78
+
79
+ it_behaves_like "visit unpublished resource with a share token"
80
+ end
81
+
82
+ shared_examples "preview participatory space with a share_token" do
83
+ let(:resource) { participatory_space }
84
+
85
+ before do
86
+ switch_to_host(organization.host)
87
+ end
88
+
89
+ def visit_resource_page
90
+ visit resource_path
91
+ end
92
+
93
+ it_behaves_like "visit unpublished resource with a share token"
94
+ end
@@ -9,7 +9,7 @@ shared_examples "logged in user reports content" do
9
9
  context "and the user has not reported the resource yet" do
10
10
  it "reports the resource" do
11
11
  visit reportable_path
12
-
12
+ find("#dropdown-trigger-resource-#{reportable.id}").click
13
13
  expect(page).to have_css(%(button[data-dialog-open="flagModal"]))
14
14
  find(%(button[data-dialog-open="flagModal"])).click
15
15
  expect(page).to have_css(".flag-modal", visible: :visible)
@@ -33,46 +33,18 @@ shared_examples "higher user role hides" do
33
33
  before do
34
34
  login_as user, scope: :user
35
35
  end
36
+ around do |example|
37
+ previous = Capybara.raise_server_errors
36
38
 
37
- it "reports the resource" do
38
- visit reportable_path
39
-
40
- expect(page).to have_css(%(button[data-dialog-open="flagModal"]))
41
- find(%(button[data-dialog-open="flagModal"])).click
42
- expect(page).to have_css(".flag-modal", visible: :visible)
43
-
44
- within ".flag-modal" do
45
- find(:css, "input[name='report[hide]']").set(true)
46
- click_on "Hide"
47
- end
48
-
49
- sleep(1)
50
-
51
- expect(page).to have_current_path(reportable_index_path, ignore_query: true)
52
-
53
- expect(reportable.reload).to be_hidden
54
- end
55
- end
56
- end
57
-
58
- shared_examples "higher user role hides resource with comments" do
59
- context "and the admin hides a resource with comments" do
60
- let!(:comments) { create_list(:comment, 2, body: "Dummy comment", commentable: reportable, author: user) }
61
-
62
- before do
63
- login_as user, scope: :user
39
+ Capybara.raise_server_errors = false
40
+ example.run
41
+ Capybara.raise_server_errors = previous
64
42
  end
65
43
 
66
- it "hides the resource" do
67
- visit decidim.search_path
68
- expect(page).to have_content(translated(comments.first.body))
69
- expect(page).to have_content(translated(comments.second.body))
70
-
44
+ it "reports the resource" do
71
45
  visit reportable_path
72
46
 
73
- expect(page).to have_content(translated(comments.first.body))
74
- expect(page).to have_content(translated(comments.second.body))
75
-
47
+ find("#dropdown-trigger-resource-#{reportable.id}").click
76
48
  expect(page).to have_css(%(button[data-dialog-open="flagModal"]))
77
49
  find(%(button[data-dialog-open="flagModal"])).click
78
50
  expect(page).to have_css(".flag-modal", visible: :visible)
@@ -82,19 +54,7 @@ shared_examples "higher user role hides resource with comments" do
82
54
  click_on "Hide"
83
55
  end
84
56
 
85
- sleep(1)
86
-
87
- expect(page).to have_current_path(reportable_index_path, ignore_query: true)
88
-
89
- perform_enqueued_jobs
90
-
91
57
  expect(reportable.reload).to be_hidden
92
- expect(comments.first.reload).to be_hidden
93
- expect(comments.second.reload).to be_hidden
94
-
95
- visit decidim.search_path
96
- expect(page).to have_no_content(translated(comments.first.body))
97
- expect(page).to have_no_content(translated(comments.second.body))
98
58
  end
99
59
  end
100
60
  end
@@ -108,6 +68,7 @@ shared_examples "higher user role does not have hide" do
108
68
  it "reports the resource" do
109
69
  visit reportable_path
110
70
 
71
+ find("#dropdown-trigger-resource-#{reportable.id}").click
111
72
  expect(page).to have_css(%(button[data-dialog-open="flagModal"]))
112
73
  find(%(button[data-dialog-open="flagModal"])).click
113
74
  expect(page).to have_css(".flag-modal", visible: :visible)
@@ -126,6 +87,7 @@ shared_examples "reports" do
126
87
 
127
88
  expect(page).to have_no_css("html.is-disabled")
128
89
 
90
+ find("#dropdown-trigger-resource-#{reportable.id}").click
129
91
  click_on "Report"
130
92
 
131
93
  expect(page).to have_css("html.is-disabled")
@@ -144,6 +106,7 @@ shared_examples "reports" do
144
106
  it "cannot report it twice" do
145
107
  visit reportable_path
146
108
 
109
+ find("#dropdown-trigger-resource-#{reportable.id}").click
147
110
  expect(page).to have_css(%(button[data-dialog-open="flagModal"]))
148
111
  find(%(button[data-dialog-open="flagModal"])).click
149
112
  expect(page).to have_css(".flag-modal", visible: :visible)
@@ -161,26 +124,25 @@ shared_examples "reports by user type" do
161
124
  let!(:user) { create(:user, :admin, :confirmed, organization:) }
162
125
  include_examples "higher user role reports"
163
126
  include_examples "higher user role hides"
164
- include_examples "higher user role hides resource with comments"
165
127
  end
166
128
  context "When reporting user is process admin" do
167
- let!(:user) { create :process_admin, :confirmed, participatory_process: }
129
+ let!(:user) { create(:process_admin, :confirmed, participatory_process:) }
168
130
 
169
131
  include_examples "higher user role reports"
170
132
  include_examples "higher user role hides"
171
133
  end
172
134
  context "When reporting user is process collaborator" do
173
- let!(:user) { create :process_collaborator, :confirmed, participatory_process: }
135
+ let!(:user) { create(:process_collaborator, :confirmed, participatory_process:) }
174
136
  include_examples "higher user role reports"
175
137
  include_examples "higher user role does not have hide"
176
138
  end
177
139
  context "When reporting user is process moderator" do
178
- let!(:user) { create :process_moderator, :confirmed, participatory_process: }
140
+ let!(:user) { create(:process_moderator, :confirmed, participatory_process:) }
179
141
  include_examples "higher user role reports"
180
142
  include_examples "higher user role hides"
181
143
  end
182
144
  context "When reporting user is process valuator" do
183
- let!(:user) { create :process_valuator, :confirmed, participatory_process: }
145
+ let!(:user) { create(:process_valuator, :confirmed, participatory_process:) }
184
146
  include_examples "higher user role reports"
185
147
  include_examples "higher user role does not have hide"
186
148
  end
@@ -6,10 +6,10 @@ shared_examples_for "resource endorsed event" do
6
6
  include_context "when a simple event"
7
7
 
8
8
  let(:event_name) { "decidim.events.resource_endorsed" }
9
- let(:author) { create :user, organization: resource.organization }
9
+ let(:author) { create(:user, organization: resource.organization) }
10
10
 
11
11
  let(:extra) { { endorser_id: author.id } }
12
- let(:endorsement) { create :endorsement, resource:, author: }
12
+ let(:endorsement) { create(:endorsement, resource:, author:) }
13
13
  let(:resource_path) { resource_locator(resource).path }
14
14
  let(:follower) { create(:user, organization: resource.organization) }
15
15
  let(:follow) { create(:follow, followable: author, user: follower) }
@@ -29,9 +29,9 @@ shared_examples_for "a resource search with scopes" do |factory_name|
29
29
  describe "scope_id filter" do
30
30
  let(:filter_params) { { with_any_scope: scope_ids } }
31
31
 
32
- let(:scope1) { create :scope, organization: component.organization }
33
- let(:scope2) { create :scope, organization: component.organization }
34
- let(:subscope1) { create :scope, organization: component.organization, parent: scope1 }
32
+ let(:scope1) { create(:scope, organization: component.organization) }
33
+ let(:scope2) { create(:scope, organization: component.organization) }
34
+ let(:subscope1) { create(:scope, organization: component.organization, parent: scope1) }
35
35
 
36
36
  let!(:resource) { create(factory_name, { component:, scope: scope1 }.merge(factory_params)) }
37
37
  let!(:resource2) { create(factory_name, { component:, scope: scope2 }.merge(factory_params)) }
@@ -117,94 +117,100 @@ shared_examples_for "a resource search with scopes" do |factory_name|
117
117
  end
118
118
  end
119
119
 
120
- shared_examples_for "a resource search with categories" do |factory_name, category_mode = :multi|
121
- let(:participatory_space) { component.participatory_space }
122
- let(:filter_params) do
123
- case category_mode
124
- when :single
125
- { with_category: category_ids }
126
- else
127
- { with_any_category: category_ids }
128
- end
129
- end
120
+ shared_examples_for "a resource search with taxonomies" do |factory_name|
130
121
  let(:factory_params) do
131
122
  resource_params
132
123
  rescue StandardError
133
124
  {}
134
125
  end
135
126
 
136
- describe "results" do
137
- let(:category1) { create :category, participatory_space: }
138
- let(:category2) { create :category, participatory_space: }
139
- let(:child_category) { create :category, participatory_space:, parent: category2 }
140
- let!(:resource) { create(factory_name, { component: }.merge(factory_params)) }
141
- let!(:resource2) { create(factory_name, { component:, category: category1 }.merge(factory_params)) }
142
- let!(:resource3) { create(factory_name, { component:, category: category2 }.merge(factory_params)) }
143
- let!(:resource4) { create(factory_name, { component:, category: child_category }.merge(factory_params)) }
127
+ let(:participatory_space) { component.participatory_space }
128
+ let(:filter_params) do
129
+ { with_any_taxonomies: { "#{root_taxonomy.id}": taxonomy_ids } }
130
+ end
144
131
 
145
- before do
146
- get(
147
- request_path,
148
- params: { filter: filter_params },
149
- headers: { "HOST" => component.organization.host }
150
- )
132
+ let(:root_taxonomy) { create(:taxonomy, organization:) }
133
+ let(:taxonomy1) { create(:taxonomy, parent: root_taxonomy, organization:) }
134
+ let(:taxonomy2) { create(:taxonomy, parent: root_taxonomy, organization:) }
135
+ let(:child_taxonomy) { create(:taxonomy, organization:, parent: taxonomy2) }
136
+ let!(:resource) { create(factory_name, { component: }.merge(factory_params)) }
137
+ let!(:resource2) { create(factory_name, { component:, taxonomies: [taxonomy1] }.merge(factory_params)) }
138
+ let!(:resource3) { create(factory_name, { component:, taxonomies: [taxonomy2] }.merge(factory_params)) }
139
+ let!(:resource4) { create(factory_name, { component:, taxonomies: [child_taxonomy] }.merge(factory_params)) }
140
+
141
+ before do
142
+ get(
143
+ request_path,
144
+ params: { filter: filter_params },
145
+ headers: { "HOST" => component.organization.host }
146
+ )
147
+ end
148
+
149
+ context "when no taxonomy filter is present" do
150
+ let(:filter_params) do
151
+ { with_any_taxonomies: [] }
151
152
  end
152
153
 
153
- context "when no category filter is present" do
154
- let(:category_ids) { nil }
154
+ it "includes all resources" do
155
+ expect(subject).to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
156
+ expect(subject).to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
157
+ expect(subject).to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
158
+ expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
159
+ end
160
+ end
155
161
 
156
- it "includes all resources" do
157
- expect(subject).to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
158
- expect(subject).to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
159
- expect(subject).to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
160
- expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
161
- end
162
+ context "when no ids are specified" do
163
+ let(:taxonomy_ids) { [] }
164
+
165
+ it "includes all resources" do
166
+ expect(subject).to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
167
+ expect(subject).to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
168
+ expect(subject).to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
169
+ expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
162
170
  end
171
+ end
163
172
 
164
- context "when a category is selected" do
165
- let(:category_ids) { [category2.id] }
173
+ context "when `all` is being sent" do
174
+ let(:taxonomy_ids) { ["all"] }
166
175
 
167
- it "includes only resources for that category and its children" do
168
- expect(subject).not_to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
169
- expect(subject).not_to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
170
- expect(subject).to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
171
- expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
172
- end
176
+ it "includes all resources with the root taxonomy" do
177
+ expect(subject).not_to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
178
+ expect(subject).to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
179
+ expect(subject).to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
180
+ expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
173
181
  end
182
+ end
174
183
 
175
- context "when a subcategory is selected" do
176
- let(:category_ids) { [child_category.id] }
184
+ context "when a taxonomy is selected" do
185
+ let(:taxonomy_ids) { [taxonomy2.id] }
177
186
 
178
- it "includes only resources for that category" do
179
- expect(subject).not_to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
180
- expect(subject).not_to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
181
- expect(subject).not_to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
182
- expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
183
- end
187
+ it "includes only resources for that taxonomy and its children" do
188
+ expect(subject).not_to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
189
+ expect(subject).not_to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
190
+ expect(subject).to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
191
+ expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
184
192
  end
193
+ end
185
194
 
186
- context "when `without` is being sent" do
187
- let(:category_ids) { ["without"] }
195
+ context "when multiple taxonomies are selected" do
196
+ let(:taxonomy_ids) { [taxonomy1.id, taxonomy2.id] }
188
197
 
189
- it "returns resources without a category" do
190
- expect(subject).to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
191
- expect(subject).not_to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
192
- expect(subject).not_to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
193
- expect(subject).not_to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
194
- end
198
+ it "includes only resources for those taxonomies" do
199
+ expect(subject).not_to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
200
+ expect(subject).to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
201
+ expect(subject).to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
202
+ expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
195
203
  end
204
+ end
196
205
 
197
- if category_mode == :multi
198
- context "when `without` and some category id is being sent" do
199
- let(:category_ids) { ["without", category1.id] }
206
+ context "when a sub_taxonomy is selected" do
207
+ let(:taxonomy_ids) { [child_taxonomy.id] }
200
208
 
201
- it "returns resources without a category and with the selected category" do
202
- expect(subject).to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
203
- expect(subject).to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
204
- expect(subject).not_to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
205
- expect(subject).not_to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
206
- end
207
- end
209
+ it "includes only resources for that taxonomy" do
210
+ expect(subject).not_to have_escaped_html(translated(resource.try(:title) || resource.try(:name)))
211
+ expect(subject).not_to have_escaped_html(translated(resource2.try(:title) || resource2.try(:name)))
212
+ expect(subject).not_to have_escaped_html(translated(resource3.try(:title) || resource3.try(:name)))
213
+ expect(subject).to have_escaped_html(translated(resource4.try(:title) || resource4.try(:name)))
208
214
  end
209
215
  end
210
216
  end
@@ -3,7 +3,7 @@
3
3
  RSpec.shared_context "when a resource is ready for global search" do
4
4
  let!(:organization) { create(:organization) }
5
5
  let!(:author) { create(:user, :admin, organization:) }
6
- let!(:scope1) { create :scope, organization: }
6
+ let!(:scope1) { create(:scope, organization:) }
7
7
 
8
8
  let(:test_locales) { [:ca, :en, :es] }
9
9
  let(:description1) do
@@ -105,25 +105,6 @@ shared_examples_for "a simple event" do |skip_space_checks|
105
105
  end
106
106
  end
107
107
 
108
- describe "resource_path" do
109
- it "is generated correctly" do
110
- expect(subject.resource_path).to be_kind_of(String)
111
- end
112
- end
113
-
114
- describe "resource_url" do
115
- it "is generated correctly" do
116
- expect(subject.resource_url).to be_kind_of(String)
117
- expect(subject.resource_url).to start_with("http")
118
- end
119
- end
120
-
121
- describe "resource_title" do
122
- it "responds to the method" do
123
- expect(subject).to respond_to(:resource_title)
124
- end
125
- end
126
-
127
108
  unless skip_space_checks
128
109
  describe "participatory_space_url" do
129
110
  it "is generated correctly" do
@@ -197,3 +178,36 @@ shared_examples_for "a simple event notification" do
197
178
  end
198
179
  end
199
180
  end
181
+
182
+ shared_examples_for "a notification event only" do
183
+ describe "types" do
184
+ subject { described_class }
185
+
186
+ it "supports notifications" do
187
+ expect(subject.types).to include :notification
188
+ end
189
+
190
+ it "does not support emails" do
191
+ expect(subject.types).not_to include :email
192
+ end
193
+ end
194
+
195
+ describe "resource_path" do
196
+ it "is generated correctly" do
197
+ expect(subject.resource_path).to be_kind_of(String)
198
+ end
199
+ end
200
+
201
+ describe "resource_url" do
202
+ it "is generated correctly" do
203
+ expect(subject.resource_url).to be_kind_of(String)
204
+ expect(subject.resource_url).to start_with("http")
205
+ end
206
+ end
207
+
208
+ describe "resource_title" do
209
+ it "responds to the method" do
210
+ expect(subject).to respond_to(:resource_title)
211
+ end
212
+ end
213
+ end
@@ -10,23 +10,16 @@ def visit_resource
10
10
  visit resource_locator(resource).path
11
11
  end
12
12
 
13
- shared_examples "a social share widget" do
14
- it "has the social share button" do
13
+ shared_examples "a empty social share meta tag" do
14
+ it "has no meta tag" do
15
15
  visit_resource
16
-
17
- expect(page).to have_css('button[data-dialog-open="socialShare"]')
16
+ expect(find('meta[property="og:image"]', visible: false)[:content]).to be_blank
18
17
  end
18
+ end
19
19
 
20
- it "lists all the expected social share providers" do
20
+ shared_examples "a social share meta tag" do |image|
21
+ it "has meta tag for #{image}" do
21
22
  visit_resource
22
- click_on "Share"
23
-
24
- within "#socialShare" do
25
- expect(page).to have_css('a[title="Share to X"]')
26
- expect(page).to have_css('a[title="Share to Facebook"]')
27
- expect(page).to have_css('a[title="Share to WhatsApp"]')
28
- expect(page).to have_css('a[title="Share to Telegram"]')
29
- expect(page).to have_css(".share-modal__input")
30
- end
23
+ expect(find('meta[property="og:image"]', visible: false)[:content]).to end_with(image)
31
24
  end
32
25
  end