decidim-core 0.29.5 → 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 (595) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity/show.erb +6 -6
  3. data/app/cells/decidim/address/show.erb +3 -3
  4. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  5. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  6. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  7. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  8. data/app/cells/decidim/author/flag.erb +6 -0
  9. data/app/cells/decidim/author/flag_user.erb +14 -0
  10. data/app/cells/decidim/author/show.erb +4 -2
  11. data/app/cells/decidim/author_cell.rb +1 -1
  12. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  13. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  14. data/app/cells/decidim/comments_button_cell.rb +14 -2
  15. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  16. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  17. data/app/cells/decidim/content_blocks/participatory_space_extra_data/extra_data.erb +2 -2
  18. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +2 -11
  19. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  20. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  21. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  22. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  23. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  24. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  25. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  26. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  27. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  28. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  29. data/app/cells/decidim/flag_modal/flag_user.erb +34 -0
  30. data/app/cells/decidim/flag_modal/show.erb +52 -0
  31. data/app/cells/decidim/flag_modal_cell.rb +56 -0
  32. data/app/cells/decidim/follow_button/show.erb +1 -2
  33. data/app/cells/decidim/follow_button_cell.rb +5 -0
  34. data/app/cells/decidim/footer_topics/show.erb +2 -2
  35. data/app/cells/decidim/group_admins/show.erb +1 -3
  36. data/app/cells/decidim/group_members/show.erb +2 -6
  37. data/app/cells/decidim/images_panel/show.erb +2 -5
  38. data/app/cells/decidim/map/show.erb +3 -0
  39. data/app/cells/decidim/map/template.erb +14 -0
  40. data/app/cells/decidim/map_cell.rb +39 -0
  41. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  42. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  43. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  44. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +4 -4
  45. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +3 -5
  46. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  47. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  48. data/app/cells/decidim/profile_actions/show.erb +1 -1
  49. data/app/cells/decidim/profile_sidebar/show.erb +167 -0
  50. data/app/cells/decidim/profile_sidebar_cell.rb +68 -0
  51. data/app/cells/decidim/progress_bar/show.erb +2 -2
  52. data/app/cells/decidim/report_button/already_reported_modal.erb +2 -2
  53. data/app/cells/decidim/report_button/flag_modal.erb +36 -24
  54. data/app/cells/decidim/report_button_cell.rb +9 -2
  55. data/app/cells/decidim/resource_history/show.erb +20 -0
  56. data/app/cells/decidim/resource_history_cell.rb +66 -0
  57. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  58. data/app/cells/decidim/resource_types_filter_cell.rb +6 -6
  59. data/app/cells/decidim/share_button_cell.rb +0 -4
  60. data/app/cells/decidim/share_widget/modal.erb +26 -0
  61. data/app/cells/decidim/share_widget/show.erb +2 -0
  62. data/app/cells/decidim/share_widget_cell.rb +20 -0
  63. data/app/cells/decidim/tags/show.erb +7 -4
  64. data/app/cells/decidim/tags_cell.rb +11 -72
  65. data/app/cells/decidim/upload_modal/files.erb +4 -4
  66. data/app/cells/decidim/upload_modal_cell.rb +3 -5
  67. data/app/cells/decidim/user_activity/show.erb +1 -1
  68. data/app/commands/decidim/amendable/accept.rb +1 -2
  69. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  70. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  71. data/app/commands/decidim/create_omniauth_registration.rb +21 -17
  72. data/app/commands/decidim/create_report.rb +8 -11
  73. data/app/commands/decidim/create_user_group.rb +6 -2
  74. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  75. data/app/commands/decidim/invite_user.rb +1 -1
  76. data/app/commands/decidim/search.rb +0 -14
  77. data/app/commands/decidim/update_account.rb +11 -3
  78. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  79. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  80. data/app/commands/decidim/update_user_group.rb +7 -1
  81. data/app/constraints/decidim/current_component.rb +1 -1
  82. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  83. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  84. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  85. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  86. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  87. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  88. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  89. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  90. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  91. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  92. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  93. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  94. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -4
  95. data/app/controllers/decidim/amendments_controller.rb +3 -3
  96. data/app/controllers/decidim/application_controller.rb +9 -0
  97. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  98. data/app/controllers/decidim/components/base_controller.rb +3 -7
  99. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  100. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  101. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  102. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  103. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  104. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  105. data/app/controllers/decidim/follows_controller.rb +1 -1
  106. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  107. data/app/controllers/decidim/homepage_controller.rb +0 -1
  108. data/app/controllers/decidim/open_data_controller.rb +33 -8
  109. data/app/controllers/decidim/profiles_controller.rb +2 -2
  110. data/app/controllers/decidim/reports_controller.rb +2 -7
  111. data/app/controllers/decidim/user_activities_controller.rb +1 -1
  112. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  113. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  114. data/app/forms/decidim/account_form.rb +2 -5
  115. data/app/forms/decidim/amendable/form.rb +4 -2
  116. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  117. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  118. data/app/forms/decidim/omniauth_registration_form.rb +15 -2
  119. data/app/forms/decidim/registration_form.rb +1 -1
  120. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  121. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  122. data/app/helpers/decidim/amendments_helper.rb +1 -11
  123. data/app/helpers/decidim/application_helper.rb +6 -2
  124. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  125. data/app/helpers/decidim/cache_helper.rb +1 -1
  126. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  127. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  128. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  129. data/app/helpers/decidim/filters_helper.rb +0 -25
  130. data/app/helpers/decidim/layout_helper.rb +6 -6
  131. data/app/helpers/decidim/menu_helper.rb +2 -2
  132. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  133. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  134. data/app/helpers/decidim/modal_helper.rb +23 -0
  135. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  136. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  137. data/app/helpers/decidim/orders_helper.rb +1 -2
  138. data/app/helpers/decidim/paginate_helper.rb +1 -1
  139. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  140. data/app/helpers/decidim/passwords_helper.rb +2 -2
  141. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  142. data/app/helpers/decidim/tooltip_helper.rb +1 -4
  143. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  144. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  145. data/app/jobs/decidim/export_job.rb +5 -1
  146. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  147. data/app/jobs/decidim/open_data_job.rb +4 -4
  148. data/app/mailers/decidim/export_mailer.rb +7 -12
  149. data/app/mailers/decidim/notifications_digest_mailer.rb +1 -7
  150. data/app/mailers/decidim/reported_mailer.rb +2 -18
  151. data/app/models/decidim/action_log.rb +20 -1
  152. data/app/models/decidim/category.rb +4 -0
  153. data/app/models/decidim/component.rb +25 -3
  154. data/app/models/decidim/metric.rb +2 -1
  155. data/app/models/decidim/moderation.rb +16 -0
  156. data/app/models/decidim/newsletter.rb +12 -8
  157. data/app/models/decidim/organization.rb +7 -3
  158. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  159. data/app/models/decidim/private_export.rb +24 -0
  160. data/app/models/decidim/push_notification_message.rb +1 -1
  161. data/app/models/decidim/report.rb +1 -1
  162. data/app/models/decidim/scope.rb +4 -0
  163. data/app/models/decidim/share_token.rb +36 -10
  164. data/app/models/decidim/taxonomization.rb +23 -0
  165. data/app/models/decidim/taxonomy.rb +139 -0
  166. data/app/models/decidim/taxonomy_filter.rb +130 -0
  167. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  168. data/app/models/decidim/user.rb +13 -23
  169. data/app/models/decidim/user_base_entity.rb +12 -4
  170. data/app/models/decidim/user_moderation.rb +9 -0
  171. data/app/models/decidim/user_report.rb +4 -0
  172. data/app/packs/entrypoints/decidim_core.js +1 -0
  173. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  174. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  175. data/app/packs/images/decidim/brands/google.svg +7 -1
  176. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  177. data/app/packs/images/decidim/default-avatar.svg +1 -1
  178. data/app/packs/src/decidim/callout.js +8 -13
  179. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  180. data/app/packs/src/decidim/clipboard.js +18 -9
  181. data/app/packs/src/decidim/datepicker/datepicker_functions.js +3 -3
  182. data/app/packs/src/decidim/datepicker/generate_datepicker.js +0 -2
  183. data/app/packs/src/decidim/datepicker/generate_timepicker.js +0 -2
  184. data/app/packs/src/decidim/decidim_application.js +1 -0
  185. data/app/packs/src/decidim/direct_uploads/upload_field.js +4 -3
  186. data/app/packs/src/decidim/direct_uploads/upload_modal.js +9 -8
  187. data/app/packs/src/decidim/editor/common/suggestion.js +1 -11
  188. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  189. data/app/packs/src/decidim/index.js +9 -5
  190. data/app/packs/src/decidim/input_character_counter.js +1 -1
  191. data/app/packs/src/decidim/map/provider/here.js +1 -1
  192. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  193. data/app/packs/src/decidim/sticky_footer.js +29 -0
  194. data/app/packs/src/decidim/sticky_header.js +6 -31
  195. data/app/packs/src/decidim/user_registrations.js +13 -0
  196. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +212 -0
  197. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  198. data/app/packs/stylesheets/decidim/_activity.scss +4 -4
  199. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  200. data/app/packs/stylesheets/decidim/_cards.scss +0 -4
  201. data/app/packs/stylesheets/decidim/_content_blocks.scss +0 -4
  202. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  203. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  204. data/app/packs/stylesheets/decidim/_filters.scss +1 -1
  205. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  206. data/app/packs/stylesheets/decidim/_header.scss +39 -70
  207. data/app/packs/stylesheets/decidim/_layout.scss +34 -4
  208. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  209. data/app/packs/stylesheets/decidim/_modal.scss +47 -1
  210. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  211. data/app/packs/stylesheets/decidim/_modal_update.scss +1 -5
  212. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  213. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  214. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  215. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  216. data/app/packs/stylesheets/decidim/application.scss +1 -1
  217. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  218. data/app/packs/stylesheets/decidim/map.scss +7 -10
  219. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  220. data/app/permissions/decidim/default_permissions.rb +0 -2
  221. data/app/permissions/decidim/permissions.rb +9 -15
  222. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  223. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  224. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  225. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  226. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  227. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  228. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  229. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  230. data/app/presenters/decidim/log/user_presenter.rb +0 -1
  231. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  232. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  233. data/app/presenters/decidim/notification_to_mailer_presenter.rb +3 -7
  234. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  235. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  236. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  237. data/app/presenters/decidim/user_presenter.rb +1 -1
  238. data/app/queries/decidim/last_activity.rb +0 -25
  239. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  240. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  241. data/app/queries/decidim/public_activities.rb +1 -12
  242. data/app/queries/decidim/stats_users_count.rb +2 -2
  243. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  244. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  245. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  246. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  247. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  248. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  249. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  250. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  251. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  252. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  253. data/app/services/decidim/action_authorizer.rb +32 -3
  254. data/app/services/decidim/base_diff_renderer.rb +1 -3
  255. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  256. data/app/services/decidim/onboarding_manager.rb +272 -0
  257. data/app/services/decidim/open_data_exporter.rb +139 -13
  258. data/app/services/decidim/static_map_generator.rb +1 -1
  259. data/app/services/decidim/traceability.rb +13 -0
  260. data/app/uploaders/decidim/application_uploader.rb +1 -1
  261. data/app/validators/etiquette_validator.rb +9 -2
  262. data/app/validators/passthru_validator.rb +1 -1
  263. data/app/validators/translated_etiquette_validator.rb +32 -0
  264. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  265. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  266. data/app/views/decidim/application/_collection.html.erb +30 -18
  267. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  268. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  269. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  270. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  271. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  272. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  273. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  274. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  275. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  276. data/app/views/decidim/errors/internal_server_error.html.erb +1 -1
  277. data/app/views/decidim/errors/not_found.html.erb +1 -1
  278. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  279. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  280. data/app/views/decidim/last_activities/index.html.erb +1 -1
  281. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +2 -1
  282. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  283. data/app/views/decidim/newsletters/unsubscribe.html.erb +4 -16
  284. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  285. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  286. data/app/views/decidim/open_data/index.html.erb +108 -0
  287. data/app/views/decidim/pages/show.html.erb +2 -1
  288. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  289. data/app/views/decidim/reported_mailer/hide.html.erb +9 -0
  290. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  291. data/app/views/decidim/searches/_count.html.erb +1 -1
  292. data/app/views/decidim/searches/_filters.html.erb +39 -76
  293. data/app/views/decidim/shared/_component_announcement.html.erb +1 -1
  294. data/app/views/decidim/shared/_confirm_modal.html.erb +5 -3
  295. data/app/views/decidim/shared/_filters.html.erb +4 -6
  296. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  297. data/app/views/decidim/shared/_orders.html.erb +2 -2
  298. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  299. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  300. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  301. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  302. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  303. data/app/views/kaminari/decidim/_page.html.erb +1 -1
  304. data/app/views/kaminari/decidim/_paginator.html.erb +1 -1
  305. data/app/views/layouts/decidim/_application.html.erb +0 -1
  306. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  307. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  308. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  309. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  310. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  311. data/app/views/layouts/decidim/footer/_main.html.erb +1 -1
  312. data/app/views/layouts/decidim/footer/_main_intro.html.erb +1 -1
  313. data/app/views/layouts/decidim/footer/_main_legal.html.erb +1 -1
  314. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  315. data/app/views/layouts/decidim/footer/_mini.html.erb +2 -2
  316. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  317. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  318. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +0 -6
  319. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +0 -2
  320. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +1 -1
  321. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  322. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +11 -5
  323. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +5 -5
  324. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +1 -1
  325. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  326. data/config/assets.rb +2 -1
  327. data/config/locales/ar.yml +38 -74
  328. data/config/locales/bg-BG.yml +2 -2
  329. data/config/locales/bg.yml +38 -74
  330. data/config/locales/bs-BA.yml +0 -2
  331. data/config/locales/ca.yml +374 -130
  332. data/config/locales/cs.yml +379 -116
  333. data/config/locales/de.yml +370 -132
  334. data/config/locales/el.yml +26 -58
  335. data/config/locales/en.yml +354 -110
  336. data/config/locales/eo.yml +0 -4
  337. data/config/locales/es-MX.yml +368 -127
  338. data/config/locales/es-PY.yml +373 -132
  339. data/config/locales/es.yml +374 -130
  340. data/config/locales/eu.yml +461 -215
  341. data/config/locales/fi-plain.yml +367 -130
  342. data/config/locales/fi.yml +372 -132
  343. data/config/locales/fr-CA.yml +180 -125
  344. data/config/locales/fr-LU.yml +3 -3
  345. data/config/locales/fr.yml +180 -122
  346. data/config/locales/ga-IE.yml +4 -25
  347. data/config/locales/gl.yml +23 -58
  348. data/config/locales/hu.yml +35 -62
  349. data/config/locales/id-ID.yml +24 -57
  350. data/config/locales/is-IS.yml +6 -25
  351. data/config/locales/it.yml +39 -218
  352. data/config/locales/ja.yml +235 -140
  353. data/config/locales/lb-LU.yml +2 -2
  354. data/config/locales/lb.yml +31 -76
  355. data/config/locales/lt.yml +29 -64
  356. data/config/locales/lv.yml +24 -58
  357. data/config/locales/nl.yml +26 -75
  358. data/config/locales/no.yml +26 -70
  359. data/config/locales/pl.yml +35 -72
  360. data/config/locales/pt-BR.yml +44 -63
  361. data/config/locales/pt.yml +26 -70
  362. data/config/locales/ro-RO.yml +118 -183
  363. data/config/locales/ru.yml +16 -43
  364. data/config/locales/sk-SK.yml +3 -3
  365. data/config/locales/sk.yml +27 -72
  366. data/config/locales/sl.yml +0 -4
  367. data/config/locales/sr-CS.yml +0 -2
  368. data/config/locales/sv.yml +141 -133
  369. data/config/locales/tr-TR.yml +32 -75
  370. data/config/locales/uk.yml +8 -29
  371. data/config/locales/zh-CN.yml +24 -68
  372. data/config/locales/zh-TW.yml +28 -62
  373. data/config/routes.rb +4 -10
  374. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  375. data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
  376. data/db/migrate/20180706104107_add_nickname_to_managed_users.rb +1 -1
  377. data/db/migrate/20181001124950_move_users_groups_to_users_table.rb +1 -1
  378. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  379. data/db/migrate/20190412131728_fix_user_names.rb +1 -1
  380. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  381. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  382. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  383. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  384. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  385. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  386. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  387. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  388. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  389. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  390. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  391. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  392. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  393. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  394. data/decidim-core.gemspec +14 -17
  395. data/lib/decidim/action_authorization.rb +3 -2
  396. data/lib/decidim/amendable.rb +1 -1
  397. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  398. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  399. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  400. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  401. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  402. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  403. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  404. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  405. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  406. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  407. data/lib/decidim/api/types/amendment_type.rb +5 -7
  408. data/lib/decidim/api/types/area_api_type.rb +3 -3
  409. data/lib/decidim/api/types/attachment_type.rb +3 -3
  410. data/lib/decidim/api/types/category_type.rb +2 -2
  411. data/lib/decidim/api/types/decidim_type.rb +5 -1
  412. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  413. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  414. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  415. data/lib/decidim/api/types/metric_type.rb +1 -1
  416. data/lib/decidim/api/types/organization_type.rb +5 -0
  417. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  418. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  419. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  420. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  421. data/lib/decidim/api/types/session_type.rb +1 -2
  422. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  423. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  424. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  425. data/lib/decidim/api/types/user_group_type.rb +7 -20
  426. data/lib/decidim/api/types/user_type.rb +7 -20
  427. data/lib/decidim/asset_router/storage.rb +6 -11
  428. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +3 -3
  429. data/lib/decidim/attachment_attributes.rb +1 -1
  430. data/lib/decidim/attribute_encryptor.rb +1 -1
  431. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  432. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  433. data/lib/decidim/attributes/time_with_zone.rb +1 -5
  434. data/lib/decidim/attributes.rb +2 -0
  435. data/lib/decidim/authorization_form_builder.rb +0 -7
  436. data/lib/decidim/coauthorable.rb +1 -1
  437. data/lib/decidim/command.rb +3 -3
  438. data/lib/decidim/commands/destroy_resource.rb +5 -1
  439. data/lib/decidim/commands/resource_handler.rb +2 -2
  440. data/lib/decidim/commands/restore_resource.rb +45 -0
  441. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  442. data/lib/decidim/component_manifest.rb +7 -0
  443. data/lib/decidim/content_parsers/blob_parser.rb +8 -10
  444. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  445. data/lib/decidim/core/api.rb +2 -0
  446. data/lib/decidim/core/engine.rb +21 -7
  447. data/lib/decidim/core/menu.rb +0 -5
  448. data/lib/decidim/core/seeds.rb +42 -2
  449. data/lib/decidim/core/test/factories.rb +107 -4
  450. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  451. data/lib/decidim/core/test/shared_examples/announcements_examples.rb +0 -4
  452. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  453. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  454. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  455. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  456. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  457. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  458. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  459. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  460. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  461. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  462. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  463. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  464. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  465. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  466. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  467. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  468. data/lib/decidim/core/test/shared_examples/reports_examples.rb +15 -53
  469. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  470. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  471. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  472. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  473. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +7 -14
  474. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  475. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  476. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  477. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  478. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  479. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  480. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +0 -26
  481. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -28
  482. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  483. data/lib/decidim/core/test.rb +9 -5
  484. data/lib/decidim/core/version.rb +1 -1
  485. data/lib/decidim/core.rb +58 -0
  486. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  487. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  488. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  489. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  490. data/lib/decidim/download_your_data_serializers.rb +19 -0
  491. data/lib/decidim/exporters/csv.rb +6 -0
  492. data/lib/decidim/exporters/export_manifest.rb +14 -0
  493. data/lib/decidim/exporters/pdf.rb +26 -22
  494. data/lib/decidim/filter_form_builder.rb +12 -15
  495. data/lib/decidim/form_builder.rb +6 -143
  496. data/lib/decidim/has_category.rb +5 -1
  497. data/lib/decidim/has_private_users.rb +4 -0
  498. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  499. data/lib/decidim/has_upload_validations.rb +1 -1
  500. data/lib/decidim/legacy_form_builder.rb +118 -0
  501. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  502. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  503. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  504. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  505. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  506. data/lib/decidim/maintenance/import_models/category.rb +107 -0
  507. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  508. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  509. data/lib/decidim/maintenance/import_models.rb +19 -0
  510. data/lib/decidim/maintenance/taxonomy_importer.rb +132 -0
  511. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  512. data/lib/decidim/maintenance.rb +12 -0
  513. data/lib/decidim/map/autocomplete.rb +52 -8
  514. data/lib/decidim/map/dynamic_map.rb +1 -1
  515. data/lib/decidim/map/provider/dynamic_map/here.rb +40 -1
  516. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  517. data/lib/decidim/map/provider/static_map/here.rb +0 -34
  518. data/lib/decidim/map.rb +3 -6
  519. data/lib/decidim/moderation_tools.rb +16 -19
  520. data/lib/decidim/newsletter_encryptor.rb +1 -1
  521. data/lib/decidim/nicknamizable.rb +9 -6
  522. data/lib/decidim/paddable.rb +1 -1
  523. data/lib/decidim/participable.rb +10 -10
  524. data/lib/decidim/participatory_space_user.rb +10 -0
  525. data/lib/decidim/private_download_helper.rb +15 -0
  526. data/lib/decidim/record_encryptor.rb +51 -46
  527. data/lib/decidim/reportable.rb +2 -6
  528. data/lib/decidim/resourceable.rb +16 -0
  529. data/lib/decidim/seeds.rb +18 -20
  530. data/lib/decidim/settings_manifest.rb +34 -1
  531. data/lib/decidim/soft_deletable.rb +17 -0
  532. data/lib/decidim/taxonomizable.rb +72 -0
  533. data/lib/decidim/translatable_attributes.rb +1 -5
  534. data/lib/decidim/view_model.rb +0 -1
  535. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  536. data/lib/tasks/decidim_procfile.rake +6 -0
  537. data/lib/tasks/decidim_tasks.rake +1 -0
  538. data/lib/tasks/decidim_taxonomies.rake +155 -0
  539. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  540. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  541. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +20 -23
  542. data/lib/tasks/upgrade/migrations.rake +91 -0
  543. metadata +201 -113
  544. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  545. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  546. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  547. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  548. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  549. data/app/cells/decidim/report_user_button/already_reported_modal.erb +0 -11
  550. data/app/cells/decidim/report_user_button/flag_modal.erb +0 -47
  551. data/app/cells/decidim/report_user_button/show.erb +0 -2
  552. data/app/cells/decidim/report_user_button_cell.rb +0 -59
  553. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  554. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  555. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  556. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  557. data/app/commands/decidim/update_user_interests.rb +0 -41
  558. data/app/controllers/decidim/scopes_controller.rb +0 -84
  559. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  560. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  561. data/app/forms/decidim/user_interests_form.rb +0 -17
  562. data/app/helpers/decidim/categories_helper.rb +0 -26
  563. data/app/helpers/decidim/scopes_helper.rb +0 -105
  564. data/app/jobs/decidim/hide_child_resources_job.rb +0 -24
  565. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  566. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  567. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  568. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  569. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  570. data/app/packs/src/decidim/dropdown_menu.js +0 -18
  571. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  572. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  573. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  574. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  575. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  576. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  577. data/app/views/decidim/reported_mailer/hidden_automatically.html.erb +0 -25
  578. data/app/views/decidim/reported_mailer/hidden_manually.html.erb +0 -25
  579. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  580. data/app/views/decidim/scopes/picker.html.erb +0 -53
  581. data/app/views/decidim/shared/_comments.html.erb +0 -0
  582. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  583. data/app/views/decidim/shared/_tags.html.erb +0 -1
  584. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  585. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  586. data/app/views/decidim/user_interests/show.html.erb +0 -22
  587. data/config/initializers/foundation_rails_helper.rb +0 -4
  588. data/config/locales/ca-IT.yml +0 -2146
  589. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  590. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  591. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  592. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  593. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  594. data/lib/decidim/seven_zip_wrapper.rb +0 -29
  595. data/lib/tasks/upgrade/clean_hidden_resources.rake +0 -33
@@ -13,17 +13,17 @@ module Decidim
13
13
 
14
14
  # Public: icon for omniauth buttons
15
15
  def oauth_icon(provider)
16
- info = current_organization.enabled_omniauth_providers[provider.to_sym]
16
+ provider_info = current_organization.enabled_omniauth_providers[provider.to_sym]
17
17
 
18
18
  name = normalize_provider_name(provider)
19
19
  name = "twitter-x" if provider == :twitter
20
20
  name = "#{name}-fill"
21
21
 
22
- if info
23
- icon_path = info[:icon_path]
24
- return external_icon(icon_path) if icon_path
22
+ if provider_info
23
+ icon_path = provider_info[:icon_path] || Rails.application.secrets.omniauth[provider][:icon_path].presence
24
+ return external_icon(icon_path) if icon_path.present?
25
25
 
26
- name = info[:icon] if info[:icon]
26
+ name = provider_info[:icon] if provider_info[:icon]
27
27
  end
28
28
 
29
29
  icon(name)
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A helper to display onboarding action message
5
+ module OnboardingActionHelper
6
+ def display_onboarding_action_message(user)
7
+ return if user.blank?
8
+ return unless pending_onboarding_action?(user)
9
+
10
+ cell("decidim/onboarding_action_message", user)
11
+ end
12
+ end
13
+ end
@@ -13,8 +13,7 @@ module Decidim
13
13
  def order_selector(orders, options = {})
14
14
  render partial: "decidim/shared/orders", locals: {
15
15
  orders:,
16
- i18n_scope: options[:i18n_scope],
17
- css_class: options[:css_class]
16
+ i18n_scope: options[:i18n_scope]
18
17
  }
19
18
  end
20
19
 
@@ -13,7 +13,7 @@ module Decidim
13
13
 
14
14
  per_page = (params[:per_page] || paginate_params[:per_page] || Decidim::Paginable::OPTIONS.first).to_i
15
15
 
16
- content_tag :div, class: "flex flex-col-reverse md:flex-row items-center justify-between gap-1 py-8 md:py-16 md:flex-wrap", data: { pagination: "" } do
16
+ content_tag :div, class: "flex flex-col-reverse md:flex-row items-center justify-between gap-1 py-8 md:py-16", data: { pagination: "" } do
17
17
  template = ""
18
18
  template += render(partial: "decidim/shared/results_per_page", locals: { per_page: }, formats: [:html]) if collection.total_pages.positive?
19
19
  template += paginate collection, window: 2, outer_window: 1, theme: "decidim", params: paginate_params
@@ -28,7 +28,7 @@ module Decidim
28
28
  end
29
29
 
30
30
  def participatory_space_floating_help
31
- return if help_section.blank? || strip_tags(translated_attribute(help_section).html_safe).blank?
31
+ return if help_section.blank?
32
32
 
33
33
  floating_help(help_id) { translated_attribute(help_section).html_safe }
34
34
  end
@@ -30,7 +30,7 @@ module Decidim
30
30
  value: @account&.password,
31
31
  minlength: min_length,
32
32
  maxlength: ::PasswordValidator::MAX_LENGTH,
33
- placeholder: "••••••"
33
+ placeholder: "**********"
34
34
  }
35
35
  end
36
36
 
@@ -42,7 +42,7 @@ module Decidim
42
42
  required: true,
43
43
  label: false,
44
44
  help_text:,
45
- placeholder: "••••••"
45
+ placeholder: "**********"
46
46
  }
47
47
  end
48
48
 
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A Helper to render taxonomies for forms.
5
+ module TaxonomiesHelper
6
+ include DecidimFormHelper
7
+ include TranslatableAttributes
8
+
9
+ def filter_taxonomy_items_select_field(form, name, filter, options = {})
10
+ label = decidim_sanitize_translated(filter.name)
11
+ options = options.merge(include_blank: I18n.t("decidim.taxonomies.prompt")) unless options.has_key?(:include_blank)
12
+ options = options.merge(label:) unless options.has_key?(:label)
13
+ form.select(
14
+ name,
15
+ taxonomy_items_options_for_filter(filter),
16
+ options,
17
+ { name: "#{form.object_name}[#{name}][]", id: "#{name}-#{filter.id}" }
18
+ )
19
+ end
20
+
21
+ def taxonomy_items_options_for_filter(filter)
22
+ @taxonomy_items_options_for_filter ||= {}
23
+ @taxonomy_items_options_for_filter[filter.id] ||= begin
24
+ min_parent_count = filter.taxonomies.values.min_by { |item| item[:taxonomy].parent_ids.count }
25
+ first_parent_level = (min_parent_count && min_parent_count[:taxonomy].parent_ids.count) || 1
26
+ taxonomy_items_options_for_taxonomies_tree(filter.taxonomies, first_parent_level)
27
+ end
28
+ end
29
+
30
+ def taxonomy_items_options_for_taxonomies_tree(taxonomies_tree, first_parent_level = 1)
31
+ options = []
32
+ taxonomies_tree.each do |id, item|
33
+ name = " #{" " * 4 * (item[:taxonomy].parent_ids.count - first_parent_level)} #{decidim_sanitize_translated(item[:taxonomy].name)}".html_safe
34
+ options.append([name, id])
35
+ options.concat(taxonomy_items_options_for_taxonomies_tree(item[:children], first_parent_level)) if item[:children].any?
36
+ end
37
+ options
38
+ end
39
+ end
40
+ end
@@ -5,10 +5,7 @@ module Decidim
5
5
  # on the layout.
6
6
  module TooltipHelper
7
7
  def with_tooltip(title, opts = {}, &)
8
- content_tag(:p,
9
- title:,
10
- class: "inline-block",
11
- data: { tooltip: content_tag(:p, title, id: opts[:id], class: opts[:class] || "bottom", role: "tooltip", "aria-hidden": "true") }) do
8
+ content_tag(:span, title:, data: { tooltip: content_tag(:div, title, id: opts[:id], class: opts[:class] || "bottom", role: "tooltip", "aria-hidden": "true") }) do
12
9
  capture(&).html_safe
13
10
  end
14
11
  end
@@ -5,25 +5,8 @@ module Decidim
5
5
  queue_as :default
6
6
 
7
7
  def perform(user, export_format = ::Decidim::DownloadYourDataExporter::DEFAULT_EXPORT_FORMAT)
8
- filename = "#{SecureRandom.urlsafe_base64}.zip"
9
- path = Rails.root.join("tmp/#{filename}")
10
- password = SecureRandom.urlsafe_base64
11
-
12
- generate_zip_file(user, path, password, export_format)
13
- save_or_upload_file(user, path)
14
- # Deletes temporary file
15
- File.delete(path)
16
- ExportMailer.download_your_data_export(user, filename, password).deliver_later
17
- end
18
-
19
- private
20
-
21
- def generate_zip_file(user, path, password, export_format)
22
- DownloadYourDataExporter.new(user, path, password, export_format).export
23
- end
24
-
25
- def save_or_upload_file(user, path)
26
- user.download_your_data_file.attach(io: File.open(path, "rb"), filename: File.basename(path))
8
+ @export = DownloadYourDataExporter.new(user, "download_your_data", export_format).export
9
+ ExportMailer.download_your_data_export(user, @export).deliver_later
27
10
  end
28
11
  end
29
12
  end
@@ -4,21 +4,26 @@ module Decidim
4
4
  class EventPublisherJob < ApplicationJob
5
5
  queue_as :events
6
6
 
7
- attr_reader :resource
7
+ attr_reader :resource, :data
8
8
 
9
9
  def perform(event_name, data)
10
10
  @resource = data[:resource]
11
+ @data = data
11
12
 
12
13
  return unless data[:force_send] || notifiable?
13
14
 
14
- EmailNotificationGeneratorJob.perform_later(
15
- event_name,
16
- data[:event_class],
17
- data[:resource],
18
- data[:followers],
19
- data[:affected_users],
20
- data[:extra]
21
- )
15
+ if event_type.include?(:email)
16
+ EmailNotificationGeneratorJob.perform_later(
17
+ event_name,
18
+ data[:event_class],
19
+ data[:resource],
20
+ data[:followers],
21
+ data[:affected_users],
22
+ data[:extra]
23
+ )
24
+ end
25
+
26
+ return unless event_type.include?(:notification)
22
27
 
23
28
  NotificationGeneratorJob.perform_later(
24
29
  event_name,
@@ -32,6 +37,10 @@ module Decidim
32
37
 
33
38
  private
34
39
 
40
+ def event_type
41
+ (data[:event_class].presence && data[:event_class].safe_constantize&.types) || []
42
+ end
43
+
35
44
  # Whether this event should be notified or not. Useful when you want the
36
45
  # event to decide based on the params.
37
46
  #
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  class ExportJob < ApplicationJob
5
+ include Decidim::PrivateDownloadHelper
6
+
5
7
  queue_as :exports
6
8
 
7
9
  # rubocop:disable Metrics/ParameterLists
@@ -16,7 +18,9 @@ module Decidim
16
18
 
17
19
  export_data = Decidim::Exporters.find_exporter(format).new(collection, serializer).export
18
20
 
19
- ExportMailer.export(user, name, export_data).deliver_now
21
+ private_export = attach_archive(export_data, name, user)
22
+
23
+ ExportMailer.export(user, private_export).deliver_later
20
24
  end
21
25
  # rubocop:enable Metrics/ParameterLists
22
26
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  class ExportParticipatorySpaceJob < ApplicationJob
5
+ include Decidim::PrivateDownloadHelper
6
+
5
7
  queue_as :exports
6
8
 
7
9
  def perform(user, participatory_space, name, format)
@@ -14,7 +16,8 @@ module Decidim
14
16
 
15
17
  export_data = Decidim::Exporters.find_exporter(format).new(collection, serializer).export
16
18
 
17
- Decidim::ExportMailer.export(user, name, export_data).deliver_now
19
+ private_export = attach_archive(export_data, name, user)
20
+ ExportMailer.export(user, private_export).deliver_later
18
21
  end
19
22
  end
20
23
  end
@@ -4,13 +4,13 @@ module Decidim
4
4
  class OpenDataJob < ApplicationJob
5
5
  queue_as :exports
6
6
 
7
- def perform(organization)
8
- path = Rails.root.join("tmp/#{organization.open_data_file_path}")
7
+ def perform(organization, resource = nil)
8
+ path = Rails.root.join("tmp/#{organization.open_data_file_path(resource)}")
9
9
 
10
- exporter = OpenDataExporter.new(organization, path)
10
+ exporter = OpenDataExporter.new(organization, path, resource)
11
11
  raise "Could not generate Open Data export" unless exporter.export.positive?
12
12
 
13
- organization.open_data_file.attach(io: File.open(path, "rb"), filename: organization.open_data_file_path)
13
+ organization.open_data_files.attach(io: File.open(path, "rb"), filename: organization.open_data_file_path(resource))
14
14
  # Deletes the temporary file file
15
15
  File.delete(path)
16
16
  end
@@ -8,21 +8,16 @@ module Decidim
8
8
  # zipped file.
9
9
  #
10
10
  # user - The user to be notified.
11
- # export_name - The name of the export.
12
- # export_data - The data containing the result of the export.
11
+ # private_export - The PrivateExport instance where the export data has been attached.
13
12
  #
14
13
  # Returns nothing.
15
- def export(user, export_name, export_data)
14
+ def export(user, private_export)
16
15
  @user = user
17
16
  @organization = user.organization
18
-
19
- filename = export_data.filename(export_name)
20
- filename_without_extension = export_data.filename(export_name, extension: false)
21
-
22
- attachments["#{filename_without_extension}.zip"] = FileZipper.new(filename, export_data.read).zip
17
+ @private_export = private_export
23
18
 
24
19
  with_user(user) do
25
- mail(to: "#{user.name} <#{user.email}>", subject: I18n.t("decidim.export_mailer.subject", name: filename))
20
+ mail(to: "#{user.name} <#{user.email}>", subject: I18n.t("decidim.export_mailer.subject", name: private_export.export_type))
26
21
  end
27
22
  end
28
23
 
@@ -30,13 +25,13 @@ module Decidim
30
25
  # the result of a download_your_data export in a zipped file.
31
26
  #
32
27
  # user - The user to be notified.
28
+ # private_export - The PrivateExport instance where the export data has been attached.
33
29
  #
34
30
  # Returns nothing.
35
- def download_your_data_export(user, filename, password)
31
+ def download_your_data_export(user, private_export)
36
32
  @user = user
37
33
  @organization = user.organization
38
- @filename = filename
39
- @password = password
34
+ @private_export = private_export
40
35
 
41
36
  with_user(user) do
42
37
  mail(to: "#{user.name} <#{user.email}>", subject: I18n.t("decidim.export_mailer.subject", name: user.name))
@@ -14,13 +14,7 @@ module Decidim
14
14
  @organization = user.organization
15
15
  @notifications_digest = Decidim::NotificationsDigestPresenter.new(user)
16
16
  @display_see_more_message = notifications.size > SIZE_LIMIT
17
- # Note that this could be improved by adding a "type" column to the notifications table
18
- # This fix can generate lists of notifications that are below the SIZE_LIMIT
19
- @notifications = notifications[0...SIZE_LIMIT].filter_map do |notification|
20
- next unless notification.event_class_instance.respond_to?(:email_intro)
21
-
22
- Decidim::NotificationToMailerPresenter.new(notification)
23
- end
17
+ @notifications = notifications[0...SIZE_LIMIT].map { |notification| Decidim::NotificationToMailerPresenter.new(notification) }
24
18
 
25
19
  mail(to: user.email, subject: @notifications_digest.subject)
26
20
  end
@@ -21,29 +21,13 @@ module Decidim
21
21
  end
22
22
  end
23
23
 
24
- # This is used when a user with special rights (like an administrator, a space administrator or a moderator) hides a resource
25
- def hidden_manually(user, report, current_user)
24
+ def hide(user, report)
26
25
  with_user(user) do
27
26
  @report = report
28
27
  @participatory_space = @report.moderation.participatory_space
29
- @reportable = @report.moderation.reportable
30
- @organization = user.organization
31
- @user = user
32
- @moderator = current_user
33
- subject = I18n.t("hidden_manually.subject", scope: "decidim.reported_mailer", moderator: @moderator.name)
34
- mail(to: user.email, subject:)
35
- end
36
- end
37
-
38
- # This is meant to be used when a resource is hidden by an algorithm, such as the `decidim-ai` module, or the `Decidim.max_reports_before_hiding` feature.
39
- def hidden_automatically(user, report)
40
- with_user(user) do
41
- @report = report
42
- @participatory_space = @report.moderation.participatory_space
43
- @reportable = @report.moderation.reportable
44
28
  @organization = user.organization
45
29
  @user = user
46
- subject = I18n.t("hidden_automatically.subject", scope: "decidim.reported_mailer")
30
+ subject = I18n.t("hide.subject", scope: "decidim.reported_mailer")
47
31
  mail(to: user.email, subject:)
48
32
  end
49
33
  end
@@ -5,6 +5,7 @@ module Decidim
5
5
  # for transparency reasons, to log all actions so all other users can
6
6
  # see the actions being performed.
7
7
  class ActionLog < ApplicationRecord
8
+ include Decidim::Taxonomizable
8
9
  include Decidim::ScopableParticipatorySpace
9
10
 
10
11
  belongs_to :organization,
@@ -156,7 +157,15 @@ module Decidim
156
157
 
157
158
  def self.publicable_public_resource_types
158
159
  @publicable_public_resource_types ||= public_resource_types
159
- .select { |klass| klass.constantize.column_names.include?("published_at") }
160
+ .select { |klass| klass.constantize.column_names.include?("published_at") } - publicable_exceptions
161
+ end
162
+
163
+ def self.publicable_exceptions
164
+ @publicable_exceptions = %w(
165
+ Decidim::Blogs::Post
166
+ ).select do |klass|
167
+ klass.safe_constantize.present?
168
+ end
160
169
  end
161
170
 
162
171
  def self.ransackable_scopes(auth_object = nil)
@@ -167,6 +176,16 @@ module Decidim
167
176
  base + [:with_participatory_space]
168
177
  end
169
178
 
179
+ def self.ransackable_attributes(auth_object = nil)
180
+ return [] unless auth_object&.admin?
181
+
182
+ %w(created_at)
183
+ end
184
+
185
+ def self.ransackable_associations(_auth_object = nil)
186
+ %w(user)
187
+ end
188
+
170
189
  # Overwrites the method so that records cannot be modified.
171
190
  #
172
191
  # Returns a Boolean.
@@ -47,6 +47,10 @@ module Decidim
47
47
  # Allow ransacker to search for a key in a hstore column (`name`.`en`)
48
48
  ransacker_i18n :name
49
49
 
50
+ def self.ransackable_attributes(_auth_object = nil)
51
+ %w(description id name)
52
+ end
53
+
50
54
  private
51
55
 
52
56
  # This is done since we only allow one level of subcategories.
@@ -6,11 +6,14 @@ module Decidim
6
6
  # component that spans over several steps.
7
7
  class Component < ApplicationRecord
8
8
  include HasSettings
9
+ include HasTaxonomySettings
9
10
  include Publicable
10
11
  include Traceable
11
12
  include Loggable
12
13
  include Decidim::ShareableWithToken
13
14
  include ScopableComponent
15
+ include Decidim::SoftDeletable
16
+ include TranslatableAttributes
14
17
 
15
18
  belongs_to :participatory_space, polymorphic: true
16
19
 
@@ -19,7 +22,7 @@ module Decidim
19
22
 
20
23
  default_scope { registered_component_manifests.registered_space_manifests.order(arel_table[:weight].asc, arel_table[:manifest_name].asc) }
21
24
 
22
- delegate :organization, :categories, to: :participatory_space
25
+ delegate :organization, to: :participatory_space
23
26
 
24
27
  def self.log_presenter_class_for(_log)
25
28
  Decidim::AdminLog::ComponentPresenter
@@ -61,7 +64,7 @@ module Decidim
61
64
  {
62
65
  :host => organization.host,
63
66
  :component_id => id,
64
- "#{participatory_space.underscored_name}_slug".to_sym => participatory_space.slug
67
+ :"#{participatory_space.underscored_name}_slug" => participatory_space.slug
65
68
  }
66
69
  end
67
70
 
@@ -82,6 +85,14 @@ module Decidim
82
85
  name
83
86
  end
84
87
 
88
+ def hierarchy_title
89
+ [
90
+ I18n.t("decidim.admin.menu.#{participatory_space.class.name.demodulize.underscore.pluralize}"),
91
+ translated_attribute(participatory_space.title),
92
+ translated_attribute(name)
93
+ ].join(" / ")
94
+ end
95
+
85
96
  # Public: Returns an empty description
86
97
  def resource_description; end
87
98
 
@@ -92,9 +103,20 @@ module Decidim
92
103
  participatory_space.can_participate?(user)
93
104
  end
94
105
 
106
+ def private_non_transparent_space?
107
+ return false unless participatory_space.respond_to?(:private_space?)
108
+ return false unless participatory_space.private_space?
109
+
110
+ if participatory_space.respond_to?(:is_transparent?)
111
+ !participatory_space.is_transparent?
112
+ else
113
+ true
114
+ end
115
+ end
116
+
95
117
  # Public: Public URL for component with given share token as query parameter
96
118
  def shareable_url(share_token)
97
- EngineRouter.main_proxy(self).root_path(self, share_token: share_token.token)
119
+ EngineRouter.main_proxy(self).root_url(self, share_token: share_token.token)
98
120
  end
99
121
 
100
122
  delegate :serializes_specific_data?, to: :manifest
@@ -9,6 +9,7 @@ module Decidim
9
9
  belongs_to :participatory_space, foreign_type: "participatory_space_type", polymorphic: true, optional: true
10
10
  belongs_to :related_object, foreign_type: "related_object_type", polymorphic: true, optional: true
11
11
  belongs_to :category, foreign_key: "decidim_category_id", class_name: "Decidim::Category", optional: true
12
+ belongs_to :taxonomy, foreign_key: "decidim_taxonomy_id", class_name: "Decidim::Taxonomy", optional: true
12
13
 
13
14
  validates :day, uniqueness: { scope:
14
15
  [
@@ -18,7 +19,7 @@ module Decidim
18
19
  :participatory_space_id,
19
20
  :related_object_type,
20
21
  :related_object_id,
21
- :decidim_category_id
22
+ :decidim_taxonomy_id
22
23
  ] }
23
24
  end
24
25
  end
@@ -30,5 +30,21 @@ module Decidim
30
30
  ransacker :reportable_type_string do
31
31
  Arel.sql(%{cast("decidim_moderations"."decidim_reportable_type" as text)})
32
32
  end
33
+
34
+ def self.ransackable_attributes(_auth_object = nil)
35
+ %w(reported_id_string reported_content created_at)
36
+ end
37
+
38
+ def self.ransackable_associations(_auth_object = nil)
39
+ []
40
+ end
41
+
42
+ def title
43
+ return reportable.reported_title if reportable.respond_to?(:reported_title)
44
+ return reportable.title if reportable.respond_to?(:title)
45
+ return reportable.name if reportable.respond_to?(:name)
46
+
47
+ reportable.id.to_s
48
+ end
33
49
  end
34
50
  end
@@ -26,23 +26,23 @@ module Decidim
26
26
  sent_at.present?
27
27
  end
28
28
 
29
- def sent_scopes_ids
30
- extended_data["scope_ids"] || []
29
+ def sent_to_all_users?
30
+ extended_data["send_to_all_users"]
31
31
  end
32
32
 
33
- def sent_scopes
34
- @sent_scopes ||= organization.scopes.where(id: sent_scopes_ids)
33
+ def sent_to_verified_users?
34
+ extended_data["send_to_verified_users"]
35
35
  end
36
36
 
37
- def sended_to_all_users?
38
- extended_data["send_to_all_users"]
37
+ def sent_to_users_with_verification_types
38
+ extended_data["verification_types"]
39
39
  end
40
40
 
41
- def sended_to_followers?
41
+ def sent_to_followers?
42
42
  extended_data["send_to_followers"]
43
43
  end
44
44
 
45
- def sended_to_participants?
45
+ def sent_to_participants?
46
46
  extended_data["send_to_participants"]
47
47
  end
48
48
 
@@ -50,6 +50,10 @@ module Decidim
50
50
  extended_data["participatory_space_types"]
51
51
  end
52
52
 
53
+ def sent_to_private_members?
54
+ extended_data["send_to_private_members"]
55
+ end
56
+
53
57
  def template
54
58
  @template ||= Decidim::ContentBlock
55
59
  .for_scope(:newsletter_template, organization:)
@@ -35,6 +35,8 @@ module Decidim
35
35
 
36
36
  has_many :templates, foreign_key: "decidim_organization_id", class_name: "Decidim::Templates::Template", dependent: :destroy if defined? Decidim::Templates
37
37
 
38
+ has_many :taxonomies, foreign_key: "decidim_organization_id", class_name: "Decidim::Taxonomy", inverse_of: :organization, dependent: :destroy
39
+
38
40
  # Users registration mode. Whether users can register or access the system. Does not affect users that access through Omniauth integrations.
39
41
  # enabled: Users registration and sign in are enabled (default value).
40
42
  # existing: Users cannot be registered in the system. Only existing users can sign in.
@@ -58,7 +60,7 @@ module Decidim
58
60
  has_one_attached :highlighted_content_banner_image
59
61
  validates_upload :highlighted_content_banner_image, uploader: Decidim::ImageUploader
60
62
 
61
- has_one_attached :open_data_file
63
+ has_many_attached :open_data_files
62
64
 
63
65
  validate :unique_name
64
66
 
@@ -148,8 +150,10 @@ module Decidim
148
150
  !users_registration_mode_disabled?
149
151
  end
150
152
 
151
- def open_data_file_path
152
- "#{host}-open-data.zip"
153
+ def open_data_file_path(resource = nil)
154
+ return "#{host}-open-data.zip" if resource.nil?
155
+
156
+ "#{host}-open-data-#{resource}.csv"
153
157
  end
154
158
 
155
159
  def enabled_omniauth_providers
@@ -5,15 +5,25 @@ module Decidim
5
5
  class ParticipatorySpacePrivateUser < ApplicationRecord
6
6
  include Decidim::DownloadYourData
7
7
  include ParticipatorySpaceUser
8
+ include Decidim::TranslatableResource
8
9
 
9
10
  belongs_to :privatable_to, polymorphic: true
10
11
 
12
+ translatable_fields :role
13
+
14
+ delegate :email, :name, to: :user
15
+
11
16
  scope :by_participatory_space, ->(privatable_to) { where(privatable_to_id: privatable_to.id, privatable_to_type: privatable_to.class.to_s) }
17
+ scope :published, -> { where(published: true) }
12
18
 
13
19
  def self.user_collection(user)
14
20
  where(decidim_user_id: user.id)
15
21
  end
16
22
 
23
+ def self.private_user_ids_for_participatory_spaces(spaces)
24
+ joins(:user).where(privatable_to: spaces).distinct.pluck(:decidim_user_id)
25
+ end
26
+
17
27
  def self.export_serializer
18
28
  Decidim::DownloadYourDataSerializers::DownloadYourDataParticipatorySpacePrivateUserSerializer
19
29
  end
@@ -26,6 +36,16 @@ module Decidim
26
36
  Arel.sql(%{("invitation_sent_at")::text})
27
37
  end
28
38
 
39
+ def self.ransackable_attributes(auth_object = nil)
40
+ return [] unless auth_object&.admin?
41
+
42
+ %w(name nickname email invitation_accepted_at last_sign_in_at invitation_sent_at role)
43
+ end
44
+
45
+ def self.ransackable_associations(_auth_object = nil)
46
+ %w(user)
47
+ end
48
+
29
49
  def target_space_association = :privatable_to
30
50
  end
31
51
  end