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
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module AjaxPermissionHandler
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ rescue_from Decidim::ActionForbidden, with: :ajax_user_has_no_permission
11
+ end
12
+
13
+ private
14
+
15
+ def ajax_user_has_no_permission
16
+ return user_has_no_permission unless request.xhr?
17
+
18
+ render json: { message: I18n.t("actions.unauthorized", scope: "decidim.core") }, status: :unprocessable_entity
19
+ end
20
+ end
21
+ end
@@ -6,6 +6,7 @@ module Decidim
6
6
  module DeviseAuthenticationMethods
7
7
  extend ActiveSupport::Concern
8
8
  include Decidim::UserBlockedChecker
9
+ include Decidim::OnboardingActionMethods
9
10
 
10
11
  included do
11
12
  def after_sign_in_path_for(user)
@@ -13,8 +14,8 @@ module Decidim
13
14
  check_user_block_status(user)
14
15
  elsif user.needs_password_update?
15
16
  decidim.change_password_path
16
- elsif first_login_and_not_authorized?(user) && !user.admin? && !pending_redirect?(user)
17
- decidim_verifications.first_login_authorizations_path
17
+ elsif pending_onboarding_action?(user)
18
+ decidim_verifications.onboarding_pending_authorizations_path
18
19
  else
19
20
  super
20
21
  end
@@ -27,10 +28,6 @@ module Decidim
27
28
  def pending_redirect?(user)
28
29
  store_location_for(user, stored_location_for(user))
29
30
  end
30
-
31
- def first_login_and_not_authorized?(user)
32
- user.is_a?(User) && user.sign_in_count == 1 && current_organization.available_authorizations.any? && user.verifiable?
33
- end
34
31
  end
35
32
  end
36
33
  end
@@ -22,6 +22,7 @@ module Decidim
22
22
  include NeedsSnippets
23
23
  include UserBlockedChecker
24
24
  include ActiveStorage::SetCurrent
25
+ include Decidim::OnboardingActionMethods
25
26
 
26
27
  helper Decidim::TranslationsHelper
27
28
  helper Decidim::MetaTagsHelper
@@ -36,6 +37,7 @@ module Decidim
36
37
  helper Decidim::SocialShareButtonHelper
37
38
  helper Decidim::SanitizeHelper
38
39
  helper Decidim::ApplicationHelper
40
+ helper Decidim::OnboardingActionHelper
39
41
 
40
42
  layout "layouts/decidim/application"
41
43
 
@@ -8,7 +8,7 @@ module Decidim
8
8
 
9
9
  included do
10
10
  def redirect_back(fallback_location:, allow_other_host: true, **args) # rubocop:disable Lint/UnusedMethodArgument
11
- super fallback_location:, allow_other_host: Decidim.allow_open_redirects, **args
11
+ super(fallback_location:, allow_other_host: Decidim.allow_open_redirects, **args)
12
12
  end
13
13
  end
14
14
  end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module EphemeralSessionChecker
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ before_action :check_ephemeral_user_session, if: :ephemeral_user_signed_in?
11
+
12
+ helper_method :onboarding_manager
13
+ end
14
+
15
+ private
16
+
17
+ def ephemeral_user_signed_in?
18
+ user_signed_in? && current_user.ephemeral?
19
+ end
20
+
21
+ def onboarding_manager
22
+ @onboarding_manager ||= Decidim::OnboardingManager.new(current_user)
23
+ end
24
+
25
+ def check_ephemeral_user_session
26
+ return true unless request.format.html?
27
+
28
+ return destroy_ephemeral_session && redirect_to(decidim.root_path) if onboarding_manager.expired?
29
+
30
+ if onboarding_manager.valid?
31
+ authorizations = action_authorized_to(onboarding_manager.action, **onboarding_manager.action_authorized_resources)
32
+
33
+ return redirect_to decidim_verifications.onboarding_pending_authorizations_path unless authorizations_permitted_paths?(authorizations, onboarding_manager)
34
+
35
+ if authorizations.global_code == :unauthorized
36
+ flash[:alert] = t("unauthorized", scope: "decidim.core.actions")
37
+ return destroy_ephemeral_session && redirect_to(decidim.root_path)
38
+ end
39
+ end
40
+
41
+ return true
42
+ end
43
+
44
+ def destroy_ephemeral_session
45
+ Decidim::DestroyEphemeralUser.call(current_user) do
46
+ on(:ok) do
47
+ sign_out(current_user)
48
+ flash[:notice] = t("ephemeral_session_closed", scope: "decidim.devise.sessions.user")
49
+ end
50
+
51
+ on(:invalid) do
52
+ flash[:alert] = t("account.destroy.error", scope: "decidim")
53
+ end
54
+ end
55
+ end
56
+
57
+ # This method determines which paths are allowed to the user based on the
58
+ # onboarding manager data and the associated authorizations. In all cases
59
+ # the user is allowed to visit the onboarding pending and the terms of
60
+ # service pages. In addition:
61
+ # * If the user is pending to complete an authorization is also allowed to
62
+ # navigate in the pages to complete the authorizations and the
63
+ # authorizations path to send the request.
64
+ # * If the user is authorized is also allowed to visit the paths determined
65
+ # by the onboarding manager after finishing the authorization flow and
66
+ # the associated component.
67
+ # The method checks the request path and checks if the path starts with one
68
+ # of the paths of the allowlist
69
+ def authorizations_permitted_paths?(authorizations, onboarding_manager)
70
+ paths_list = if authorizations.user_pending?
71
+ authorizations.statuses.map(&:current_path).compact.prepend(
72
+ decidim_verifications.authorizations_path
73
+ )
74
+ elsif authorizations.ok?
75
+ [onboarding_manager.finished_redirect_path, onboarding_manager.component_path].compact
76
+ else
77
+ []
78
+ end
79
+ paths_list.prepend(
80
+ decidim_verifications.onboarding_pending_authorizations_path,
81
+ decidim.page_path(terms_of_service_page)
82
+ )
83
+
84
+ paths_list.find { |el| /\A#{URI.parse(el).path}/.match?(request.path) }
85
+ end
86
+ end
87
+ end
@@ -16,11 +16,13 @@ module Decidim
16
16
  end
17
17
 
18
18
  def method_missing(method_name, *_arguments)
19
- @filter.present? && @filter.has_key?(method_name) ? @filter[method_name] : super
19
+ method = method_name.to_s.gsub(/\[[0-9]+\]$/, "").to_sym
20
+ @filter.present? && @filter.has_key?(method) ? @filter[method] : super
20
21
  end
21
22
 
22
23
  def respond_to_missing?(method_name, include_private = false)
23
- (@filter.present? && @filter.has_key?(method_name)) || super
24
+ method = method_name.to_s.gsub(/\[[0-9]+\]$/, "").to_sym
25
+ (@filter.present? && @filter.has_key?(method)) || super
24
26
  end
25
27
  end
26
28
 
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module HasMembersPage
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ helper_method :collection
11
+
12
+ private
13
+
14
+ def can_visit_index?
15
+ current_user_can_visit_space? && current_participatory_space.members_public_page?
16
+ end
17
+
18
+ def members
19
+ @members ||= current_participatory_space.participatory_space_private_users.published
20
+ end
21
+
22
+ alias_method :collection, :members
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Headers
7
+ # This module controls the "Permissions-Policy" header to define the
8
+ # specific sets of browser features that the website is able to use.
9
+ module BrowserFeaturePermissions
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ after_action :define_permissions_policy
14
+ end
15
+
16
+ private
17
+
18
+ def define_permissions_policy
19
+ return if response.media_type != "text/html"
20
+ return if response.headers["Permissions-Policy"].present?
21
+
22
+ # Allow the "unload" and "onbeforeunload" events to be used at the
23
+ # current domain to prevent the user unintentionally changing the page
24
+ # when they have something important to do on the page, such as an
25
+ # unsaved form.
26
+ #
27
+ # This header is required because Chrome is phasing this event out due
28
+ # to some performance issues with the back/forward cache feature of the
29
+ # browser. However, currently there are no alternative events that would
30
+ # allow preventing accidental page reloads, tab closing or window
31
+ # closing.
32
+ #
33
+ # For further information, see:
34
+ # https://developer.chrome.com/docs/web-platform/deprecating-unload
35
+ # https://github.com/fergald/docs/blob/master/explainers/permissions-policy-unload.md
36
+ #
37
+ # Note that even Google suggests using the "beforeunload" for this
38
+ # particular use case:
39
+ # https://developer.chrome.com/docs/web-platform/page-lifecycle-api#events
40
+ #
41
+ # beforeunload
42
+ # Important: the beforeunload event should only be used to alert the
43
+ # user of unsaved changes. Once those changes are saved, the event
44
+ # should be removed. It should never be added unconditionally to the
45
+ # page, as doing so can hurt performance in some cases.
46
+ response.headers["Permissions-Policy"] = "unload=(self)"
47
+ end
48
+ end
49
+ end
50
+ end
@@ -46,14 +46,14 @@ module Decidim
46
46
  #
47
47
  # Returns an Array of Strings.
48
48
  def available_locales
49
- @available_locales ||= (current_organization || Decidim).public_send(:available_locales)
49
+ @available_locales ||= (current_organization || Decidim).available_locales
50
50
  end
51
51
 
52
52
  # The default locale of this organization.
53
53
  #
54
54
  # Returns a String with the default locale.
55
55
  def default_locale
56
- @default_locale ||= (current_organization || Decidim).public_send(:default_locale)
56
+ @default_locale ||= (current_organization || Decidim).default_locale
57
57
  end
58
58
 
59
59
  # Detects the locale priority: query string, user saved, session, browser
@@ -28,7 +28,6 @@ module Decidim
28
28
  decidim.accept_tos_path,
29
29
  decidim.download_your_data_path,
30
30
  decidim.export_download_your_data_path,
31
- decidim.download_file_download_your_data_path,
32
31
  decidim.change_password_path].compact
33
32
  # ensure that path with or without query string pass
34
33
  permitted_paths.find { |el| el.split("?").first == target_path }
@@ -40,7 +40,8 @@ module Decidim
40
40
  current_settings: try(:current_settings),
41
41
  component_settings: try(:component_settings),
42
42
  current_organization: try(:current_organization),
43
- current_component: try(:current_component)
43
+ current_component: try(:current_component),
44
+ share_token: try(:store_share_token)
44
45
  }
45
46
  end
46
47
 
@@ -15,7 +15,7 @@ module Decidim
15
15
  def tos_accepted_by_user
16
16
  return true unless request.format.html?
17
17
  return true unless current_user
18
- return if current_user.tos_accepted?
18
+ return if current_user.tos_accepted? || current_user.ephemeral?
19
19
  return if permitted_paths?
20
20
 
21
21
  redirect_to_tos
@@ -33,12 +33,11 @@ module Decidim
33
33
  end
34
34
 
35
35
  def permitted_paths?
36
+ return true if request.path.starts_with?(decidim.download_your_data_path)
37
+
36
38
  permitted_paths = [tos_path,
37
39
  decidim.delete_account_path,
38
- decidim.accept_tos_path,
39
- decidim.download_your_data_path,
40
- decidim.export_download_your_data_path,
41
- decidim.download_file_download_your_data_path]
40
+ decidim.accept_tos_path]
42
41
  # ensure that path with or without query string pass
43
42
  permitted_paths.find { |el| el.split("?").first == request.path }
44
43
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module OnboardingActionMethods
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ helper_method :pending_onboarding_action?
11
+
12
+ # Returns true if there is a pending onboarding action for the user.
13
+ # The check if skipped for admins, users that are not verifiable of
14
+ # organizations that have no available authorizations.
15
+ def pending_onboarding_action?(user)
16
+ return false if user.blank?
17
+ return false if user.admin?
18
+ return false unless user.verifiable?
19
+ return false if current_organization.available_authorizations.empty?
20
+
21
+ OnboardingManager.new(user).pending_action?
22
+ end
23
+
24
+ def store_onboarding_cookie_data!(user)
25
+ data = onboarding_cookie_data
26
+ return if data.nil?
27
+
28
+ if data.present?
29
+ user.extended_data = user.extended_data.merge(data)
30
+ user.save!
31
+ end
32
+ cookies.delete(OnboardingManager::DATA_KEY)
33
+ end
34
+
35
+ def onboarding_cookie_data
36
+ data_key = OnboardingManager::DATA_KEY
37
+ return unless cookies[data_key]
38
+
39
+ { data_key => JSON.parse(cookies[data_key]).transform_keys(&:underscore) }
40
+ rescue JSON::ParserError
41
+ {}
42
+ end
43
+
44
+ def clear_onboarding_data!(user)
45
+ return if user.ephemeral?
46
+
47
+ user.extended_data = user.extended_data.except(OnboardingManager::DATA_KEY)
48
+ user.save!
49
+ end
50
+ end
51
+ end
52
+ end
@@ -9,7 +9,6 @@ module Decidim
9
9
 
10
10
  included do
11
11
  include Decidim::NeedsOrganization
12
- include Decidim::UserRoleChecker
13
12
 
14
13
  helper ParticipatorySpaceHelpers, IconHelper, ContextualHelpHelper
15
14
  helper_method :current_participatory_space
@@ -82,10 +81,8 @@ module Decidim
82
81
  return true unless current_participatory_space.try(:private_space?) &&
83
82
  !current_participatory_space.try(:is_transparent?)
84
83
  return false unless current_user
85
- return true if current_user.admin?
86
- return true if user_has_any_role?(current_user, current_participatory_space, broad_check: true)
87
84
 
88
- current_participatory_space.users.include?(current_user)
85
+ current_user.admin || current_participatory_space.users.include?(current_user)
89
86
  end
90
87
 
91
88
  def help_section
@@ -16,6 +16,7 @@ module Decidim
16
16
  include NeedsTosAccepted
17
17
  include Headers::HttpCachingDisabler
18
18
  include Headers::ContentSecurityPolicy
19
+ include Headers::BrowserFeaturePermissions
19
20
  include ActionAuthorization
20
21
  include ForceAuthentication
21
22
  include SafeRedirect
@@ -25,6 +26,8 @@ module Decidim
25
26
  include NeedsPasswordChange
26
27
  include LinkedResourceReference
27
28
  include ActiveStorage::SetCurrent
29
+ include OnboardingActionMethods
30
+ include EphemeralSessionChecker
28
31
 
29
32
  helper Decidim::MetaTagsHelper
30
33
  helper Decidim::DecidimFormHelper
@@ -41,6 +44,7 @@ module Decidim
41
44
  helper Decidim::TwitterSearchHelper
42
45
  helper Decidim::SocialShareButtonHelper
43
46
  helper Decidim::FiltersHelper
47
+ helper Decidim::OnboardingActionHelper
44
48
 
45
49
  register_permissions(::Decidim::ApplicationController,
46
50
  ::Decidim::Admin::Permissions,
@@ -56,6 +60,12 @@ module Decidim
56
60
 
57
61
  skip_before_action :disable_http_caching, unless: :user_signed_in?
58
62
 
63
+ def store_share_token
64
+ session[:share_token] = params[:share_token] if params.has_key?(:share_token)
65
+
66
+ session[:share_token].presence
67
+ end
68
+
59
69
  private
60
70
 
61
71
  # This overrides Devise's method for extracting the path from the URL. We
@@ -5,10 +5,12 @@ module Decidim
5
5
  helper_method :authorizations, :authorize_action_path
6
6
  layout false
7
7
 
8
- def show; end
8
+ def show
9
+ store_onboarding_cookie_data!(current_user)
10
+ end
9
11
 
10
12
  def authorize_action_path(handler_name)
11
- authorizations.status_for(handler_name).current_path(redirect_url: URI(request.referer).path)
13
+ authorizations.status_for(handler_name).current_path(redirect_url:)
12
14
  end
13
15
 
14
16
  private
@@ -31,5 +33,9 @@ module Decidim
31
33
  def authorizations
32
34
  @authorizations ||= action_authorized_to(authorization_action, resource:)
33
35
  end
36
+
37
+ def redirect_url
38
+ pending_onboarding_action?(current_user) ? decidim_verifications.onboarding_pending_authorizations_path : URI(request.referer).path
39
+ end
34
40
  end
35
41
  end
@@ -19,7 +19,7 @@ module Decidim
19
19
  helper Decidim::TranslationsHelper
20
20
  helper Decidim::IconHelper
21
21
  helper Decidim::ResourceHelper
22
- helper Decidim::ScopesHelper
22
+ helper Decidim::TaxonomiesHelper
23
23
  helper Decidim::ActionAuthorizationHelper
24
24
  helper Decidim::AttachmentsHelper
25
25
  helper Decidim::SanitizeHelper
@@ -30,7 +30,7 @@ module Decidim
30
30
  :current_manifest
31
31
 
32
32
  before_action do
33
- enforce_permission_to :read, :component, component: current_component, share_token:
33
+ enforce_permission_to :read, :component, component: current_component
34
34
  end
35
35
 
36
36
  before_action :redirect_unless_feature_private
@@ -49,10 +49,6 @@ module Decidim
49
49
  @current_manifest ||= current_component.manifest
50
50
  end
51
51
 
52
- def share_token
53
- params[:share_token]
54
- end
55
-
56
52
  def permission_scope
57
53
  :public
58
54
  end
@@ -73,7 +69,7 @@ module Decidim
73
69
  def set_component_breadcrumb_item
74
70
  context_breadcrumb_items << {
75
71
  label: current_component.name,
76
- url: root_path,
72
+ url: Decidim::EngineRouter.main_proxy(current_component).root_path,
77
73
  active: false,
78
74
  resource: current_component
79
75
  }
@@ -5,6 +5,7 @@ module Decidim
5
5
  # Custom Devise ConfirmationsController to avoid namespace problems.
6
6
  class ConfirmationsController < ::Devise::ConfirmationsController
7
7
  include Decidim::DeviseControllers
8
+ include Decidim::OnboardingActionMethods
8
9
 
9
10
  helper_method :new_user_group_session_path
10
11
 
@@ -33,6 +34,9 @@ module Decidim
33
34
 
34
35
  sign_in(resource)
35
36
 
37
+ store_onboarding_cookie_data!(resource)
38
+ return decidim_verifications.onboarding_pending_authorizations_path if pending_onboarding_action?(resource)
39
+
36
40
  super
37
41
  end
38
42
  end
@@ -7,6 +7,7 @@ module Decidim
7
7
  include FormFactory
8
8
  include Decidim::DeviseControllers
9
9
  include Decidim::DeviseAuthenticationMethods
10
+ include NeedsTosAccepted
10
11
 
11
12
  def new
12
13
  @form = form(OmniauthRegistrationForm).from_params(params[:user])
@@ -36,6 +37,12 @@ module Decidim
36
37
  render :new
37
38
  end
38
39
 
40
+ on(:add_tos_errors) do
41
+ set_flash_message :alert, :add_tos_errors if @form.valid_tos?
42
+ session[:verified_email] = verified_email
43
+ render :new_tos_fields
44
+ end
45
+
39
46
  on(:error) do |user|
40
47
  if user.errors[:email]
41
48
  set_flash_message :alert, :failure, kind: @form.provider.capitalize, reason: t("decidim.devise.omniauth_registrations.create.email_already_exists")
@@ -75,7 +82,7 @@ module Decidim
75
82
  end
76
83
 
77
84
  def verified_email
78
- @verified_email ||= oauth_data.dig(:info, :email)
85
+ @verified_email ||= oauth_data.dig(:info, :email).presence || session[:verified_email]
79
86
  end
80
87
 
81
88
  def oauth_hash
@@ -57,7 +57,7 @@ module Decidim
57
57
 
58
58
  # Called before resource.save
59
59
  def build_resource(hash = nil)
60
- super(hash)
60
+ super
61
61
  resource.organization = current_organization
62
62
  end
63
63
 
@@ -24,6 +24,8 @@ module Decidim
24
24
  validator = PasswordValidator.new({ attributes: :password })
25
25
  user.update!(password_updated_at: nil) unless validator.validate_each(user, :password, sign_in_params[:password])
26
26
  end
27
+
28
+ store_onboarding_cookie_data!(user)
27
29
  end
28
30
  end
29
31
 
@@ -6,11 +6,29 @@ module Decidim
6
6
  # The controller to handle the user's download_my_data page.
7
7
  class DownloadYourDataController < Decidim::ApplicationController
8
8
  include Decidim::UserProfile
9
+ include Decidim::Paginable
9
10
 
11
+ helper_method :help_definitions
12
+
13
+ # i18n-tasks-use t('decidim.download_your_data.show.answers')
14
+ # i18n-tasks-use t('decidim.download_your_data.show.assemblies')
15
+ # i18n-tasks-use t('decidim.download_your_data.show.debate_comments')
16
+ # i18n-tasks-use t('decidim.download_your_data.show.debates')
17
+ # i18n-tasks-use t('decidim.download_your_data.show.initiatives')
18
+ # i18n-tasks-use t('decidim.download_your_data.show.meeting_comments')
19
+ # i18n-tasks-use t('decidim.download_your_data.show.meetings')
20
+ # i18n-tasks-use t('decidim.download_your_data.show.participatory_processes')
21
+ # i18n-tasks-use t('decidim.download_your_data.show.projects')
22
+ # i18n-tasks-use t('decidim.download_your_data.show.proposal_comments')
23
+ # i18n-tasks-use t('decidim.download_your_data.show.proposals')
24
+ # i18n-tasks-use t('decidim.download_your_data.show.result_comments')
25
+ # i18n-tasks-use t('decidim.download_your_data.show.results')
26
+ # i18n-tasks-use t('decidim.download_your_data.show.survey_user_answers')
10
27
  def show
11
28
  enforce_permission_to(:show, :user, current_user:)
12
29
 
13
30
  @account = form(AccountForm).from_model(current_user)
31
+ @exports = paginate(current_user.private_exports)
14
32
  end
15
33
 
16
34
  def export
@@ -25,12 +43,25 @@ module Decidim
25
43
  def download_file
26
44
  enforce_permission_to(:download, :user, current_user:)
27
45
 
28
- if current_user.download_your_data_file.attached?
29
- redirect_to Rails.application.routes.url_helpers.rails_blob_url(current_user.download_your_data_file.blob, only_path: true)
46
+ if private_export.expired?
47
+ flash[:error] = t("decidim.account.download_your_data_export.export_expired")
48
+ redirect_to download_your_data_path
49
+ elsif private_export.file.attached?
50
+ redirect_to Rails.application.routes.url_helpers.rails_blob_url(private_export.file.blob, only_path: true)
30
51
  else
31
52
  flash[:error] = t("decidim.account.download_your_data_export.file_no_exists")
32
53
  redirect_to download_your_data_path
33
54
  end
34
55
  end
56
+
57
+ private
58
+
59
+ def private_export
60
+ @private_export ||= current_user.private_exports.find(params[:uuid])
61
+ end
62
+
63
+ def help_definitions
64
+ @help_definitions ||= Decidim::DownloadYourDataSerializers.help_definitions_for(current_user)
65
+ end
35
66
  end
36
67
  end
@@ -3,9 +3,7 @@
3
3
  module Decidim
4
4
  class EditorImagesController < Decidim::ApplicationController
5
5
  include FormFactory
6
-
7
- # overwrite original rescue_from to ensure we print messages from ajax methods (update)
8
- rescue_from Decidim::ActionForbidden, with: :ajax_user_has_no_permission
6
+ include AjaxPermissionHandler
9
7
 
10
8
  def create
11
9
  enforce_permission_to :create, :editor_image
@@ -25,14 +23,6 @@ module Decidim
25
23
 
26
24
  private
27
25
 
28
- # Rescue ajax calls and print the update.js view which prints the info on the message ajax form
29
- # Only if the request is AJAX, otherwise behave as Decidim standards
30
- def ajax_user_has_no_permission
31
- return user_has_no_permission unless request.xhr?
32
-
33
- render json: { message: I18n.t("actions.unauthorized", scope: "decidim.core") }, status: :unprocessable_entity
34
- end
35
-
36
26
  def form_values
37
27
  {
38
28
  file: params[:image],
@@ -47,7 +47,7 @@ module Decidim
47
47
  end
48
48
 
49
49
  def button_cell_mobile
50
- @button_cell_mobile ||= cell("decidim/follow_button", resource, **button_options.merge(mobile: true))
50
+ @button_cell_mobile ||= cell("decidim/follow_button", resource, **button_options, mobile: true)
51
51
  end
52
52
 
53
53
  def button_cell