decidim-core 0.28.6 → 0.29.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 (739) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/cells/decidim/activities_cell.rb +0 -1
  4. data/app/cells/decidim/activity_cell.rb +7 -6
  5. data/app/cells/decidim/address/online.erb +2 -2
  6. data/app/cells/decidim/address_cell.rb +3 -9
  7. data/app/cells/decidim/amendable/amend_button_card_cell.rb +0 -2
  8. data/app/cells/decidim/amendable/amendments_cell.rb +0 -2
  9. data/app/cells/decidim/amendable/announcement_cell.rb +10 -14
  10. data/app/cells/decidim/amendable/emendation_actions_cell.rb +0 -2
  11. data/app/cells/decidim/amendable/promote_button_card_cell.rb +0 -2
  12. data/app/cells/decidim/amendable/wizard_step_form_cell.rb +6 -19
  13. data/app/cells/decidim/announcement/show.erb +1 -1
  14. data/app/cells/decidim/announcement_cell.rb +6 -2
  15. data/app/cells/decidim/attachments_file_tab/show.erb +3 -0
  16. data/app/cells/decidim/attachments_file_tab_cell.rb +11 -0
  17. data/app/cells/decidim/attachments_link_tab/show.erb +12 -0
  18. data/app/cells/decidim/attachments_link_tab_cell.rb +21 -0
  19. data/app/cells/decidim/author/flag.erb +2 -2
  20. data/app/cells/decidim/author/show.erb +4 -5
  21. data/app/cells/decidim/author_cell.rb +0 -28
  22. data/app/cells/decidim/authorization_modal_cell.rb +0 -3
  23. data/app/cells/decidim/badge_cell.rb +0 -4
  24. data/app/cells/decidim/badges_cell.rb +0 -2
  25. data/app/cells/decidim/button_cell.rb +0 -3
  26. data/app/cells/decidim/card_cell.rb +1 -5
  27. data/app/cells/decidim/card_g/show.erb +1 -1
  28. data/app/cells/decidim/card_g_cell.rb +4 -7
  29. data/app/cells/decidim/card_l/image.erb +2 -2
  30. data/app/cells/decidim/card_l/space.erb +1 -1
  31. data/app/cells/decidim/card_l_cell.rb +3 -8
  32. data/app/cells/decidim/card_metadata_cell.rb +1 -5
  33. data/app/cells/decidim/card_s/show.erb +3 -5
  34. data/app/cells/decidim/card_s_cell.rb +1 -4
  35. data/app/cells/decidim/coauthorships_cell.rb +0 -2
  36. data/app/cells/decidim/comments_button_cell.rb +0 -2
  37. data/app/cells/decidim/content_blocks/footer_sub_hero/show.erb +1 -1
  38. data/app/cells/decidim/content_blocks/footer_sub_hero_cell.rb +0 -3
  39. data/app/cells/decidim/content_blocks/hero/show.erb +1 -1
  40. data/app/cells/decidim/content_blocks/hero_cell.rb +1 -2
  41. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +1 -1
  42. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +0 -2
  43. data/app/cells/decidim/content_blocks/how_to_participate/show.erb +1 -1
  44. data/app/cells/decidim/content_blocks/how_to_participate_cell.rb +0 -1
  45. data/app/cells/decidim/content_blocks/participatory_space_documents/content.erb +1 -1
  46. data/app/cells/decidim/content_blocks/participatory_space_documents_cell.rb +17 -1
  47. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +2 -4
  48. data/app/cells/decidim/content_blocks/participatory_space_last_activity_cell.rb +1 -3
  49. data/app/cells/decidim/content_blocks/stats/show.erb +1 -1
  50. data/app/cells/decidim/content_blocks/stats_cell.rb +1 -1
  51. data/app/cells/decidim/content_blocks/sub_hero_cell.rb +0 -3
  52. data/app/cells/decidim/date_range/show.erb +10 -10
  53. data/app/cells/decidim/date_range_cell.rb +0 -2
  54. data/app/cells/decidim/diff_cell.rb +0 -5
  55. data/app/cells/decidim/documents_panel/show.erb +4 -0
  56. data/app/cells/decidim/documents_panel_cell.rb +9 -1
  57. data/app/cells/decidim/endorsement_buttons_cell.rb +6 -14
  58. data/app/cells/decidim/flag_modal/flag_user.erb +3 -3
  59. data/app/cells/decidim/followers_cell.rb +0 -1
  60. data/app/cells/decidim/following_cell.rb +0 -1
  61. data/app/cells/decidim/footer_topics/show.erb +8 -0
  62. data/app/cells/decidim/footer_topics_cell.rb +39 -0
  63. data/app/cells/decidim/groups_cell.rb +0 -3
  64. data/app/cells/decidim/linked_resources_for_cell.rb +0 -3
  65. data/app/cells/decidim/members_cell.rb +0 -1
  66. data/app/cells/decidim/nav_links/show.erb +3 -3
  67. data/app/cells/decidim/navbar_admin_link_cell.rb +0 -2
  68. data/app/cells/decidim/newsletter_templates/base_cell.rb +0 -1
  69. data/app/cells/decidim/newsletter_templates/basic_only_text/show.erb +2 -2
  70. data/app/cells/decidim/newsletter_templates/image_text_cta/show.erb +2 -2
  71. data/app/cells/decidim/newsletter_templates/image_text_cta_cell.rb +1 -1
  72. data/app/cells/decidim/notification/show.erb +5 -0
  73. data/app/cells/decidim/notification_actions/base_cell.rb +13 -0
  74. data/app/cells/decidim/notification_actions/buttons/show.erb +5 -0
  75. data/app/cells/decidim/notification_actions/buttons_cell.rb +41 -0
  76. data/app/cells/decidim/notification_cell.rb +9 -3
  77. data/app/cells/decidim/notifications_cell.rb +0 -1
  78. data/app/cells/decidim/pad_iframe/show.erb +2 -2
  79. data/app/cells/decidim/pad_iframe_cell.rb +0 -1
  80. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +3 -5
  81. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +1 -2
  82. data/app/cells/decidim/photo_cell.rb +1 -5
  83. data/app/cells/decidim/photos_list_cell.rb +0 -2
  84. data/app/cells/decidim/profile_cell.rb +0 -2
  85. data/app/cells/decidim/profile_sidebar/show.erb +20 -20
  86. data/app/cells/decidim/profile_sidebar_cell.rb +1 -10
  87. data/app/cells/decidim/progress_bar/show.erb +8 -6
  88. data/app/cells/decidim/public_participation/show.erb +1 -1
  89. data/app/cells/decidim/report_button/flag_modal.erb +1 -1
  90. data/app/cells/decidim/resource_types_filter/show.erb +12 -11
  91. data/app/cells/decidim/resource_types_filter_cell.rb +6 -8
  92. data/app/cells/decidim/scopes_picker/show.erb +1 -1
  93. data/app/cells/decidim/scopes_picker_cell.rb +0 -1
  94. data/app/cells/decidim/search_results_cell.rb +1 -1
  95. data/app/cells/decidim/statistic_cell.rb +0 -2
  96. data/app/cells/decidim/tab_panels/show.erb +1 -1
  97. data/app/cells/decidim/tab_panels_cell.rb +12 -2
  98. data/app/cells/decidim/tags_cell.rb +0 -2
  99. data/app/cells/decidim/tos_page_cell.rb +0 -3
  100. data/app/cells/decidim/translation_bar/show.erb +2 -2
  101. data/app/cells/decidim/translation_bar_cell.rb +1 -3
  102. data/app/cells/decidim/upload_modal/files.erb +1 -1
  103. data/app/cells/decidim/upload_modal_cell.rb +1 -3
  104. data/app/cells/decidim/user_activity/show.erb +1 -1
  105. data/app/cells/decidim/user_conversation/new.erb +1 -1
  106. data/app/cells/decidim/user_conversation/show.erb +1 -1
  107. data/app/cells/decidim/user_conversation_cell.rb +0 -1
  108. data/app/cells/decidim/user_conversations/show.erb +1 -1
  109. data/app/cells/decidim/user_conversations_cell.rb +0 -1
  110. data/app/cells/decidim/user_group_pending_invitations_list_cell.rb +0 -1
  111. data/app/cells/decidim/user_group_pending_requests_list_cell.rb +0 -1
  112. data/app/cells/decidim/user_timeline/show.erb +1 -1
  113. data/app/cells/decidim/version_cell.rb +3 -5
  114. data/app/cells/decidim/versions_list_cell.rb +1 -3
  115. data/app/cells/decidim/versions_list_item_cell.rb +2 -4
  116. data/app/cells/decidim/wizard_step_form/wizard_aside.erb +2 -2
  117. data/app/cells/decidim/wizard_step_form/wizard_header.erb +2 -3
  118. data/app/cells/decidim/wizard_step_form_cell.rb +0 -8
  119. data/app/commands/decidim/amendable/create_draft.rb +4 -4
  120. data/app/commands/decidim/amendable/promote.rb +3 -2
  121. data/app/commands/decidim/amendable/publish_draft.rb +3 -2
  122. data/app/commands/decidim/amendable/update_draft.rb +4 -3
  123. data/app/commands/decidim/amendable/withdraw.rb +1 -1
  124. data/app/commands/decidim/create_follow.rb +4 -4
  125. data/app/commands/decidim/create_omniauth_registration.rb +11 -23
  126. data/app/commands/decidim/create_report.rb +3 -3
  127. data/app/commands/decidim/create_user_report.rb +5 -5
  128. data/app/commands/decidim/delete_follow.rb +4 -4
  129. data/app/commands/decidim/demote_membership.rb +2 -2
  130. data/app/commands/decidim/destroy_account.rb +21 -22
  131. data/app/commands/decidim/endorse_resource.rb +1 -1
  132. data/app/commands/decidim/invite_user_to_group.rb +5 -4
  133. data/app/commands/decidim/search.rb +0 -14
  134. data/app/commands/decidim/update_account.rb +24 -22
  135. data/app/commands/decidim/update_notifications_settings.rb +13 -11
  136. data/app/commands/decidim/update_password.rb +7 -7
  137. data/app/commands/decidim/update_user_interests.rb +9 -7
  138. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +1 -1
  139. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -1
  140. data/app/controllers/concerns/decidim/filter_resource.rb +1 -1
  141. data/app/controllers/concerns/decidim/needs_rtl_direction.rb +23 -0
  142. data/app/controllers/concerns/decidim/paginable.rb +1 -1
  143. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -23
  144. data/app/controllers/concerns/decidim/payload_info.rb +2 -1
  145. data/app/controllers/concerns/decidim/registers_permissions.rb +4 -4
  146. data/app/controllers/concerns/decidim/use_organization_time_zone.rb +1 -1
  147. data/app/controllers/concerns/decidim/withdrawable.rb +1 -1
  148. data/app/controllers/decidim/account_controller.rb +2 -2
  149. data/app/controllers/{concerns/decidim → decidim}/amendments_controller.rb +3 -16
  150. data/app/controllers/decidim/application_controller.rb +1 -1
  151. data/app/controllers/decidim/components/base_controller.rb +1 -1
  152. data/app/controllers/decidim/devise/invitations_controller.rb +1 -1
  153. data/app/controllers/decidim/devise/passwords_controller.rb +2 -2
  154. data/app/controllers/decidim/doorkeeper/credentials_controller.rb +1 -1
  155. data/app/controllers/decidim/endorsements_controller.rb +1 -1
  156. data/app/controllers/decidim/favicon_controller.rb +1 -1
  157. data/app/controllers/decidim/follows_controller.rb +2 -2
  158. data/app/controllers/decidim/group_invites_controller.rb +36 -9
  159. data/app/controllers/decidim/links_controller.rb +1 -1
  160. data/app/controllers/decidim/newsletters_opt_in_controller.rb +1 -1
  161. data/app/controllers/decidim/notifications_settings_controller.rb +1 -1
  162. data/app/controllers/decidim/profiles_controller.rb +2 -6
  163. data/app/controllers/decidim/report_users_controller.rb +1 -1
  164. data/app/controllers/decidim/reports_controller.rb +2 -2
  165. data/app/controllers/decidim/user_activities_controller.rb +1 -1
  166. data/app/controllers/decidim/user_interests_controller.rb +1 -1
  167. data/app/events/decidim/change_nickname_event.rb +0 -1
  168. data/app/events/decidim/invited_to_group_event.rb +29 -0
  169. data/app/events/decidim/welcome_notification_event.rb +2 -4
  170. data/app/forms/decidim/account_form.rb +2 -5
  171. data/app/forms/decidim/form.rb +4 -0
  172. data/app/forms/decidim/omniauth_registration_form.rb +1 -1
  173. data/app/forms/decidim/upload_validation_form.rb +2 -2
  174. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +1 -1
  175. data/app/helpers/decidim/amendments_helper.rb +4 -14
  176. data/app/helpers/decidim/application_helper.rb +8 -0
  177. data/app/helpers/decidim/authorization_form_helper.rb +2 -2
  178. data/app/helpers/decidim/breadcrumb_helper.rb +1 -1
  179. data/app/helpers/decidim/cells_helper.rb +1 -1
  180. data/app/helpers/decidim/check_boxes_tree_helper.rb +1 -1
  181. data/app/helpers/decidim/cta_button_helper.rb +1 -1
  182. data/app/helpers/decidim/datalist_select_helper.rb +1 -1
  183. data/app/helpers/decidim/decidim_form_helper.rb +3 -3
  184. data/app/helpers/decidim/filters_helper.rb +1 -1
  185. data/app/helpers/decidim/layout_helper.rb +1 -64
  186. data/app/helpers/decidim/localized_locales_helper.rb +1 -1
  187. data/app/helpers/decidim/map_helper.rb +1 -6
  188. data/app/helpers/decidim/menu_helper.rb +9 -1
  189. data/app/helpers/decidim/meta_tags_helper.rb +26 -23
  190. data/app/helpers/decidim/modal_helper.rb +1 -1
  191. data/app/helpers/decidim/orders_helper.rb +2 -3
  192. data/app/helpers/decidim/organization_helper.rb +55 -0
  193. data/app/helpers/decidim/paginate_helper.rb +5 -3
  194. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  195. data/app/helpers/decidim/resource_helper.rb +0 -7
  196. data/app/helpers/decidim/sanitize_helper.rb +2 -11
  197. data/app/helpers/decidim/scopes_helper.rb +3 -4
  198. data/app/helpers/decidim/searches_helper.rb +1 -1
  199. data/app/helpers/decidim/short_link_helper.rb +2 -2
  200. data/app/helpers/decidim/translations_helper.rb +2 -2
  201. data/app/helpers/decidim/twitter_search_helper.rb +1 -1
  202. data/app/helpers/decidim/user_profile_helper.rb +0 -1
  203. data/app/jobs/decidim/email_notifications_digest_generator_job.rb +2 -2
  204. data/app/mailers/decidim/application_mailer.rb +6 -2
  205. data/app/mailers/decidim/block_user_mailer.rb +1 -1
  206. data/app/mailers/decidim/decidim_devise_mailer.rb +7 -1
  207. data/app/mailers/decidim/newsletter_mailer.rb +1 -4
  208. data/app/mailers/decidim/newsletters_opt_in_mailer.rb +2 -2
  209. data/app/mailers/decidim/notification_mailer.rb +0 -1
  210. data/app/mailers/decidim/notifications_digest_mailer.rb +0 -1
  211. data/app/mailers/decidim/reported_mailer.rb +6 -3
  212. data/app/mailers/decidim/user_report_mailer.rb +1 -1
  213. data/app/models/decidim/action_log.rb +2 -12
  214. data/app/models/decidim/area_type.rb +1 -1
  215. data/app/models/decidim/attachment.rb +28 -4
  216. data/app/models/decidim/authorization.rb +1 -1
  217. data/app/models/decidim/authorization_transfer.rb +1 -0
  218. data/app/models/decidim/component.rb +3 -6
  219. data/app/models/decidim/content_block.rb +3 -3
  220. data/app/models/decidim/messaging/message.rb +2 -2
  221. data/app/models/decidim/newsletter.rb +9 -9
  222. data/app/models/decidim/notification.rb +2 -2
  223. data/app/models/decidim/organization.rb +23 -2
  224. data/app/models/decidim/push_notification_message.rb +1 -1
  225. data/app/models/decidim/resource_link.rb +1 -1
  226. data/app/models/decidim/user.rb +18 -14
  227. data/app/models/decidim/user_base_entity.rb +0 -4
  228. data/app/models/decidim/user_group.rb +2 -2
  229. data/app/packs/src/decidim/a11y.js +61 -11
  230. data/app/packs/src/decidim/append_redirect_url_to_modals.js +14 -24
  231. data/app/packs/src/decidim/attachments/file_or_link_tabs.js +55 -0
  232. data/app/packs/src/decidim/attachments/index.js +1 -0
  233. data/app/packs/src/decidim/back_to_list.js +1 -1
  234. data/app/packs/src/decidim/check_boxes_tree.js +1 -1
  235. data/app/packs/src/decidim/data_consent/consent_manager.js +1 -1
  236. data/app/packs/src/decidim/data_consent/consent_manager.test.js +6 -6
  237. data/app/packs/src/decidim/data_consent/index.js +1 -1
  238. data/app/packs/src/decidim/datepicker/datepicker_functions.js +243 -0
  239. data/app/packs/src/decidim/datepicker/datepicker_listeners.js +78 -0
  240. data/app/packs/src/decidim/datepicker/form_datepicker.js +91 -0
  241. data/app/packs/src/decidim/datepicker/generate_datepicker.js +148 -0
  242. data/app/packs/src/decidim/datepicker/generate_timepicker.js +298 -0
  243. data/app/packs/src/decidim/datepicker/test/date.test.js +118 -0
  244. data/app/packs/src/decidim/datepicker/test/time.test.js +227 -0
  245. data/app/packs/src/decidim/direct_uploads/upload_field.js +8 -21
  246. data/app/packs/src/decidim/direct_uploads/upload_modal.js +0 -3
  247. data/app/packs/src/decidim/editor/extensions/indent/index.js +1 -1
  248. data/app/packs/src/decidim/editor/extensions/video_embed/index.js +4 -4
  249. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +0 -15
  250. data/app/packs/src/decidim/editor/test/extensions/indent.test.js +1 -1
  251. data/app/packs/src/decidim/editor/test/fixtures/upload_templates.js +1 -1
  252. data/app/packs/src/decidim/editor/test/helpers.js +1 -14
  253. data/app/packs/src/decidim/editor/utilities/paste_transform.js +2 -2
  254. data/app/packs/src/decidim/external_domain_warning.js +2 -2
  255. data/app/packs/src/decidim/external_domain_warning.test.js +4 -4
  256. data/app/packs/src/decidim/form_filter.js +4 -4
  257. data/app/packs/src/decidim/impersonation.js +1 -1
  258. data/app/packs/src/decidim/index.js +11 -10
  259. data/app/packs/src/decidim/input_character_counter.js +2 -2
  260. data/app/packs/src/decidim/input_emoji.js +171 -72
  261. data/app/packs/src/decidim/input_hashtags.js +1 -1
  262. data/app/packs/src/decidim/input_mentions.js +1 -1
  263. data/app/packs/src/decidim/map/provider/here.js +1 -1
  264. data/app/packs/src/decidim/notifications_actions.js +40 -0
  265. data/app/packs/src/decidim/sticky_header.js +87 -0
  266. data/app/packs/src/decidim/sw/sw.js +8 -6
  267. data/app/packs/src/decidim/toggle.js +1 -1
  268. data/app/packs/src/decidim/tooltips.js +23 -43
  269. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +212 -0
  270. data/app/packs/stylesheets/decidim/_buttons.scss +1 -1
  271. data/app/packs/stylesheets/decidim/_datepicker.scss +193 -0
  272. data/app/packs/stylesheets/decidim/_dropdown.scss +45 -9
  273. data/app/packs/stylesheets/decidim/_emoji.scss +36 -0
  274. data/app/packs/stylesheets/decidim/_filters.scss +4 -2
  275. data/app/packs/stylesheets/decidim/_flash.scss +2 -2
  276. data/app/packs/stylesheets/decidim/_footer.scss +1 -3
  277. data/app/packs/stylesheets/decidim/_forms.scss +13 -5
  278. data/app/packs/stylesheets/decidim/_header.scss +70 -68
  279. data/app/packs/stylesheets/decidim/_home.scss +1 -1
  280. data/app/packs/stylesheets/decidim/_layout.scss +13 -0
  281. data/app/packs/stylesheets/decidim/_modal.scss +1 -1
  282. data/app/packs/stylesheets/decidim/_modal_update.scss +1 -5
  283. data/app/packs/stylesheets/decidim/_notifications.scss +4 -0
  284. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  285. data/app/packs/stylesheets/decidim/_progress-bar.scss +1 -1
  286. data/app/packs/stylesheets/decidim/_tabs_x.scss +5 -1
  287. data/app/packs/stylesheets/decidim/_tooltip.scss +10 -10
  288. data/app/packs/stylesheets/decidim/application.scss +4 -1
  289. data/app/packs/stylesheets/decidim/editor.scss +1 -1
  290. data/app/packs/stylesheets/decidim/legacy/conference-diploma.scss +1 -2
  291. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +1 -1
  292. data/app/packs/stylesheets/decidim/vendor/_datepicker_light.scss +228 -0
  293. data/app/permissions/decidim/default_permissions.rb +2 -2
  294. data/app/presenters/decidim/admin_log/organization_presenter.rb +1 -1
  295. data/app/presenters/decidim/admin_log/static_page_presenter.rb +1 -1
  296. data/app/presenters/decidim/attachment_presenter.rb +1 -1
  297. data/app/presenters/decidim/authorization_transfer_presenter.rb +1 -1
  298. data/app/presenters/decidim/component_attachment_collection_presenter.rb +81 -0
  299. data/app/presenters/decidim/footer_menu_presenter.rb +1 -1
  300. data/app/presenters/decidim/home_stats_presenter.rb +1 -1
  301. data/app/presenters/decidim/log/user_presenter.rb +0 -1
  302. data/app/presenters/decidim/menu_item_presenter.rb +1 -1
  303. data/app/presenters/decidim/organization_presenter.rb +1 -1
  304. data/app/queries/decidim/last_activity.rb +5 -16
  305. data/app/queries/decidim/metric_measure.rb +1 -1
  306. data/app/queries/decidim/public_activities.rb +1 -1
  307. data/app/queries/decidim/user_groups/admin_memberships.rb +1 -1
  308. data/app/queries/decidim/user_groups/member_memberships.rb +1 -1
  309. data/app/services/decidim/action_logger.rb +3 -3
  310. data/app/services/decidim/base_diff_renderer.rb +2 -28
  311. data/app/services/decidim/download_your_data_exporter.rb +25 -36
  312. data/app/services/decidim/email_notification_generator.rb +5 -14
  313. data/app/services/decidim/log/diff_changeset_calculator.rb +2 -2
  314. data/app/services/decidim/notifications_digest_sending_decider.rb +1 -1
  315. data/app/services/decidim/open_data_exporter.rb +7 -8
  316. data/app/services/decidim/static_map_generator.rb +1 -1
  317. data/app/services/decidim/zip_stream/writer.rb +39 -0
  318. data/app/uploaders/decidim/organization_favicon_uploader.rb +1 -1
  319. data/app/uploaders/decidim/record_image_uploader.rb +2 -2
  320. data/app/validators/organization_present_validator.rb +1 -1
  321. data/app/validators/passthru_validator.rb +1 -1
  322. data/app/validators/uploader_image_dimensions_validator.rb +2 -2
  323. data/app/views/decidim/account/show.html.erb +1 -1
  324. data/app/views/decidim/amendments/_wizard_header.html.erb +1 -2
  325. data/app/views/decidim/application/_collection.html.erb +3 -1
  326. data/app/views/decidim/application/_component_documents.html.erb +4 -0
  327. data/app/views/decidim/application/_document.html.erb +23 -9
  328. data/app/views/decidim/block_user_mailer/notify.html.erb +2 -2
  329. data/app/views/decidim/devise/invitations/edit.html.erb +2 -2
  330. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +2 -2
  331. data/app/views/decidim/devise/registrations/new.html.erb +1 -1
  332. data/app/views/decidim/devise/shared/_login_boxes.html.erb +1 -1
  333. data/app/views/decidim/doorkeeper/authorizations/new.html.erb +1 -1
  334. data/app/views/decidim/endorsements/_identity.html.erb +1 -1
  335. data/app/views/decidim/gamification/badges/index.html.erb +1 -1
  336. data/app/views/decidim/last_activities/index.html.erb +1 -1
  337. data/app/views/decidim/manifests/show.json.erb +4 -4
  338. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +2 -2
  339. data/app/views/decidim/messaging/conversations/_error_modal.html.erb +5 -5
  340. data/app/views/decidim/newsletter_mailer/newsletter.html.erb +1 -1
  341. data/app/views/decidim/newsletters/show.html.erb +1 -1
  342. data/app/views/decidim/newsletters_opt_in_mailer/notify.html.erb +2 -2
  343. data/app/views/decidim/offline/show.html.erb +1 -1
  344. data/app/views/decidim/pages/_tabbed.html.erb +5 -5
  345. data/app/views/decidim/pages/index.html.erb +1 -2
  346. data/app/views/decidim/reported_mailer/hide.html.erb +1 -1
  347. data/app/views/decidim/reported_mailer/report.html.erb +5 -3
  348. data/app/views/decidim/scopes/picker.html.erb +5 -5
  349. data/app/views/decidim/searches/_count.html.erb +1 -1
  350. data/app/views/decidim/searches/_filters.html.erb +38 -40
  351. data/app/views/decidim/searches/_resources_filter_block.html.erb +6 -6
  352. data/app/views/decidim/shared/_extended_navigation_bar.html.erb +8 -8
  353. data/app/views/decidim/shared/_filters.html.erb +5 -5
  354. data/app/views/decidim/shared/_login_modal.html.erb +1 -1
  355. data/app/views/decidim/shared/_orders.html.erb +2 -3
  356. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -1
  357. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  358. data/app/views/decidim/user_interests/_areas.html.erb +2 -2
  359. data/app/views/decidim/user_report_mailer/notify.html.erb +2 -2
  360. data/app/views/decidim/user_update_mailer/notify.html.erb +1 -1
  361. data/app/views/decidim/widgets/_data_picker.html.erb +1 -1
  362. data/app/views/devise/mailer/invitation_instructions.html.erb +1 -1
  363. data/app/views/devise/mailer/invitation_instructions.text.erb +1 -1
  364. data/app/views/devise/mailer/invite_admin.html.erb +2 -2
  365. data/app/views/devise/mailer/invite_admin.text.erb +2 -2
  366. data/app/views/devise/mailer/invite_collaborator.html.erb +2 -2
  367. data/app/views/devise/mailer/invite_collaborator.text.erb +2 -2
  368. data/app/views/devise/mailer/invite_private_user.html.erb +2 -2
  369. data/app/views/devise/mailer/invite_private_user.text.erb +2 -2
  370. data/app/views/devise/mailer/organization_admin_invitation_instructions.html.erb +1 -1
  371. data/app/views/devise/mailer/organization_admin_invitation_instructions.text.erb +1 -1
  372. data/app/views/layouts/decidim/_application.html.erb +3 -6
  373. data/app/views/layouts/decidim/_data_consent_warning.html.erb +2 -2
  374. data/app/views/layouts/decidim/_decidim_javascript.html.erb +1 -1
  375. data/app/views/layouts/decidim/_head.html.erb +1 -1
  376. data/app/views/layouts/decidim/_head_extra.html.erb +2 -2
  377. data/app/views/layouts/decidim/_impersonation_warning.html.erb +1 -1
  378. data/app/views/layouts/decidim/_js_configuration.html.erb +7 -2
  379. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  380. data/app/views/layouts/decidim/_logo_mobile.html.erb +11 -0
  381. data/app/views/layouts/decidim/_mailer_logo.html.erb +2 -2
  382. data/app/views/layouts/decidim/_meta_tags_config.html.erb +1 -1
  383. data/app/views/layouts/decidim/_wrapper.html.erb +16 -9
  384. data/app/views/layouts/decidim/footer/_main.html.erb +2 -3
  385. data/app/views/layouts/decidim/footer/_main_intro.html.erb +2 -2
  386. data/app/views/layouts/decidim/footer/_main_legal.html.erb +2 -3
  387. data/app/views/layouts/decidim/footer/_main_links.html.erb +13 -11
  388. data/app/views/layouts/decidim/footer/_main_social_media_links.html.erb +8 -8
  389. data/app/views/layouts/decidim/header/_main.html.erb +9 -22
  390. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +4 -5
  391. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +11 -4
  392. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +24 -0
  393. data/app/views/layouts/decidim/header/_main_links_mobile_search.html.erb +0 -21
  394. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +12 -0
  395. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +1 -1
  396. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_mobile.html.erb +17 -0
  397. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_top_left.html.erb +1 -1
  398. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +1 -1
  399. data/app/views/layouts/decidim/header/_menu_form_search_mobile.html.erb +16 -0
  400. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +25 -0
  401. data/app/views/layouts/decidim/mailer.html.erb +2 -2
  402. data/app/views/layouts/decidim/shared/_layout_center.html.erb +1 -1
  403. data/app/views/layouts/decidim/shared/_layout_item.html.erb +0 -14
  404. data/app/views/layouts/decidim/shared/_layout_user_profile.html.erb +2 -2
  405. data/config/initializers/active_storage.rb +3 -0
  406. data/config/initializers/devise.rb +1 -1
  407. data/config/initializers/new_framework_defaults_7_0.rb +145 -0
  408. data/config/locales/ar.yml +15 -97
  409. data/config/locales/bg.yml +58 -68
  410. data/config/locales/ca.yml +85 -121
  411. data/config/locales/cs.yml +63 -114
  412. data/config/locales/de.yml +79 -115
  413. data/config/locales/el.yml +3 -46
  414. data/config/locales/en.yml +62 -98
  415. data/config/locales/eo.yml +0 -2
  416. data/config/locales/es-MX.yml +76 -112
  417. data/config/locales/es-PY.yml +80 -116
  418. data/config/locales/es.yml +86 -122
  419. data/config/locales/eu.yml +310 -357
  420. data/config/locales/fi-plain.yml +73 -101
  421. data/config/locales/fi.yml +135 -163
  422. data/config/locales/fr-CA.yml +65 -107
  423. data/config/locales/fr.yml +58 -100
  424. data/config/locales/ga-IE.yml +0 -22
  425. data/config/locales/gl.yml +3 -51
  426. data/config/locales/hu.yml +43 -69
  427. data/config/locales/id-ID.yml +3 -46
  428. data/config/locales/is-IS.yml +2 -31
  429. data/config/locales/it.yml +12 -107
  430. data/config/locales/ja.yml +86 -122
  431. data/config/locales/lb.yml +7 -57
  432. data/config/locales/lt.yml +4 -57
  433. data/config/locales/lv.yml +2 -47
  434. data/config/locales/nl.yml +6 -57
  435. data/config/locales/no.yml +0 -50
  436. data/config/locales/pl.yml +67 -64
  437. data/config/locales/pt-BR.yml +8 -263
  438. data/config/locales/pt.yml +0 -56
  439. data/config/locales/ro-RO.yml +253 -561
  440. data/config/locales/ru.yml +1 -48
  441. data/config/locales/sk.yml +7 -60
  442. data/config/locales/sl.yml +0 -12
  443. data/config/locales/sr-CS.yml +0 -2
  444. data/config/locales/sv.yml +169 -629
  445. data/config/locales/tr-TR.yml +12 -59
  446. data/config/locales/uk.yml +2 -30
  447. data/config/locales/zh-CN.yml +2 -49
  448. data/config/locales/zh-TW.yml +1 -61
  449. data/config/routes.rb +0 -2
  450. data/db/migrate/20170128112958_change_user_groups_verified_to_timestamp.rb +1 -1
  451. data/db/migrate/20181025082245_add_timestamps_to_components.rb +1 -5
  452. data/db/migrate/20240110150230_rename_external_domain_whitelist_to_external_domain_allowlist.rb +7 -0
  453. data/db/migrate/20240326104215_remove_show_in_footer_in_static_pages.rb +7 -0
  454. data/db/migrate/20240401192628_change_name_on_decidim_organizations.rb +31 -0
  455. data/db/seeds/avatars/001.jpg +0 -0
  456. data/db/seeds/avatars/002.jpg +0 -0
  457. data/db/seeds/avatars/003.jpg +0 -0
  458. data/db/seeds/avatars/004.jpg +0 -0
  459. data/db/seeds/avatars/005.jpg +0 -0
  460. data/db/seeds/avatars/006.jpg +0 -0
  461. data/db/seeds/avatars/007.jpg +0 -0
  462. data/db/seeds/avatars/008.jpg +0 -0
  463. data/db/seeds/avatars/009.jpg +0 -0
  464. data/db/seeds/avatars/010.jpg +0 -0
  465. data/db/seeds/avatars/011.jpg +0 -0
  466. data/db/seeds/avatars/012.jpg +0 -0
  467. data/db/seeds/avatars/013.jpg +0 -0
  468. data/db/seeds/avatars/014.jpg +0 -0
  469. data/db/seeds/avatars/015.jpg +0 -0
  470. data/db/seeds/avatars/016.jpg +0 -0
  471. data/db/seeds/avatars/017.jpg +0 -0
  472. data/db/seeds/avatars/018.jpg +0 -0
  473. data/db/seeds/avatars/019.jpg +0 -0
  474. data/db/seeds/avatars/020.jpg +0 -0
  475. data/db/seeds/avatars/021.jpg +0 -0
  476. data/db/seeds/avatars/022.jpg +0 -0
  477. data/db/seeds/avatars/023.jpg +0 -0
  478. data/db/seeds/avatars/024.jpg +0 -0
  479. data/db/seeds/avatars/025.jpg +0 -0
  480. data/db/seeds/avatars/026.jpg +0 -0
  481. data/db/seeds/avatars/027.jpg +0 -0
  482. data/db/seeds/avatars/028.jpg +0 -0
  483. data/db/seeds/avatars/029.jpg +0 -0
  484. data/db/seeds/avatars/030.jpg +0 -0
  485. data/db/seeds/avatars/031.jpg +0 -0
  486. data/db/seeds/avatars/032.jpg +0 -0
  487. data/db/seeds/avatars/033.jpg +0 -0
  488. data/db/seeds/avatars/034.jpg +0 -0
  489. data/db/seeds/avatars/035.jpg +0 -0
  490. data/db/seeds/avatars/036.jpg +0 -0
  491. data/db/seeds/avatars/037.jpg +0 -0
  492. data/db/seeds/avatars/038.jpg +0 -0
  493. data/db/seeds/avatars/039.jpg +0 -0
  494. data/db/seeds/avatars/040.jpg +0 -0
  495. data/db/seeds/avatars/041.jpg +0 -0
  496. data/db/seeds/avatars/042.jpg +0 -0
  497. data/db/seeds/avatars/043.jpg +0 -0
  498. data/db/seeds/avatars/044.jpg +0 -0
  499. data/db/seeds/avatars/045.jpg +0 -0
  500. data/db/seeds/avatars/046.jpg +0 -0
  501. data/db/seeds/avatars/047.jpg +0 -0
  502. data/db/seeds/avatars/048.jpg +0 -0
  503. data/db/seeds/avatars/049.jpg +0 -0
  504. data/db/seeds/avatars/050.jpg +0 -0
  505. data/db/seeds/avatars/051.jpg +0 -0
  506. data/db/seeds/avatars/052.jpg +0 -0
  507. data/db/seeds/avatars/053.jpg +0 -0
  508. data/db/seeds/avatars/054.jpg +0 -0
  509. data/db/seeds/avatars/055.jpg +0 -0
  510. data/db/seeds/avatars/056.jpg +0 -0
  511. data/db/seeds/avatars/057.jpg +0 -0
  512. data/db/seeds/avatars/058.jpg +0 -0
  513. data/db/seeds/avatars/059.jpg +0 -0
  514. data/db/seeds/avatars/060.jpg +0 -0
  515. data/db/seeds/avatars/061.jpg +0 -0
  516. data/db/seeds/avatars/062.jpg +0 -0
  517. data/db/seeds/avatars/063.jpg +0 -0
  518. data/db/seeds/avatars/064.jpg +0 -0
  519. data/db/seeds/avatars/065.jpg +0 -0
  520. data/db/seeds/avatars/066.jpg +0 -0
  521. data/db/seeds/avatars/067.jpg +0 -0
  522. data/db/seeds/avatars/068.jpg +0 -0
  523. data/db/seeds/avatars/069.jpg +0 -0
  524. data/db/seeds/avatars/070.jpg +0 -0
  525. data/db/seeds/avatars/071.jpg +0 -0
  526. data/db/seeds/avatars/072.jpg +0 -0
  527. data/db/seeds/avatars/073.jpg +0 -0
  528. data/db/seeds/avatars/074.jpg +0 -0
  529. data/db/seeds/avatars/075.jpg +0 -0
  530. data/db/seeds/avatars/076.jpg +0 -0
  531. data/db/seeds/avatars/077.jpg +0 -0
  532. data/db/seeds/avatars/078.jpg +0 -0
  533. data/db/seeds/avatars/079.jpg +0 -0
  534. data/db/seeds/avatars/080.jpg +0 -0
  535. data/db/seeds/avatars/081.jpg +0 -0
  536. data/db/seeds/avatars/082.jpg +0 -0
  537. data/db/seeds/avatars/083.jpg +0 -0
  538. data/db/seeds/avatars/084.jpg +0 -0
  539. data/db/seeds/avatars/085.jpg +0 -0
  540. data/db/seeds/avatars/086.jpg +0 -0
  541. data/db/seeds/avatars/087.jpg +0 -0
  542. data/db/seeds/avatars/088.jpg +0 -0
  543. data/db/seeds/avatars/089.jpg +0 -0
  544. data/db/seeds/avatars/090.jpg +0 -0
  545. data/db/seeds/avatars/091.jpg +0 -0
  546. data/db/seeds/avatars/092.jpg +0 -0
  547. data/db/seeds/avatars/093.jpg +0 -0
  548. data/db/seeds/avatars/094.jpg +0 -0
  549. data/db/seeds/avatars/095.jpg +0 -0
  550. data/db/seeds/avatars/096.jpg +0 -0
  551. data/db/seeds/avatars/097.jpg +0 -0
  552. data/db/seeds/avatars/098.jpg +0 -0
  553. data/db/seeds/avatars/099.jpg +0 -0
  554. data/db/seeds/avatars/100.jpg +0 -0
  555. data/db/seeds/avatars/CREDITS.md +114 -0
  556. data/db/seeds/avatars/README.md +25 -0
  557. data/decidim-core.gemspec +8 -9
  558. data/lib/decidim/acts_as_author.rb +1 -1
  559. data/lib/decidim/admin_filter.rb +44 -0
  560. data/lib/decidim/admin_filters_registry.rb +55 -0
  561. data/lib/decidim/amendable.rb +1 -2
  562. data/lib/decidim/api/functions/component_finder_base.rb +1 -1
  563. data/lib/decidim/api/functions/component_list.rb +1 -1
  564. data/lib/decidim/api/functions/needs_api_filter_and_order.rb +3 -3
  565. data/lib/decidim/api/functions/participatory_space_finder_base.rb +2 -12
  566. data/lib/decidim/api/functions/participatory_space_list_base.rb +1 -1
  567. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +3 -3
  568. data/lib/decidim/api/interfaces/author_interface.rb +1 -1
  569. data/lib/decidim/api/interfaces/participatory_space_interface.rb +1 -1
  570. data/lib/decidim/api/types/component_type.rb +0 -7
  571. data/lib/decidim/api/types/organization_type.rb +1 -1
  572. data/lib/decidim/api/types/user_group_type.rb +1 -5
  573. data/lib/decidim/api/types/user_type.rb +1 -5
  574. data/lib/decidim/asset_router/pipeline.rb +2 -2
  575. data/lib/decidim/asset_router/storage.rb +11 -214
  576. data/lib/decidim/assets/tailwind/instance.rb +1 -1
  577. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +8 -3
  578. data/lib/decidim/attribute_object/model.rb +2 -2
  579. data/lib/decidim/attribute_object/type_resolver.rb +1 -3
  580. data/lib/decidim/attribute_object.rb +2 -2
  581. data/lib/decidim/attributes/time_with_zone.rb +2 -16
  582. data/lib/decidim/attributes.rb +0 -6
  583. data/lib/decidim/authorable.rb +5 -0
  584. data/lib/decidim/command.rb +2 -2
  585. data/lib/decidim/commands/create_resource.rb +63 -0
  586. data/lib/decidim/commands/destroy_resource.rb +74 -0
  587. data/lib/decidim/commands/hook_error.rb +8 -0
  588. data/lib/decidim/commands/resource_handler.rb +85 -0
  589. data/lib/decidim/commands/update_resource.rb +64 -0
  590. data/lib/decidim/component_manifest.rb +3 -1
  591. data/lib/decidim/component_validator.rb +1 -1
  592. data/lib/decidim/content_blocks/has_related_components.rb +1 -1
  593. data/lib/decidim/content_parsers/resource_parser.rb +2 -2
  594. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  595. data/lib/decidim/content_parsers.rb +0 -1
  596. data/lib/decidim/content_processor.rb +1 -1
  597. data/lib/decidim/content_renderers.rb +0 -1
  598. data/lib/decidim/content_security_policy.rb +1 -1
  599. data/lib/decidim/core/engine.rb +13 -58
  600. data/lib/decidim/core/menu.rb +13 -3
  601. data/lib/decidim/core/seeds.rb +120 -147
  602. data/lib/decidim/core/test/factories.rb +24 -31
  603. data/lib/decidim/core/test/shared_examples/acts_as_author_examples.rb +1 -1
  604. data/lib/decidim/core/test/shared_examples/amendable/withdraw_amendment_examples.rb +2 -2
  605. data/lib/decidim/core/test/shared_examples/announcements_examples.rb +3 -3
  606. data/lib/decidim/core/test/shared_examples/assembly_announcements_examples.rb +4 -4
  607. data/lib/decidim/core/test/shared_examples/attachable_interface_examples.rb +1 -1
  608. data/lib/decidim/core/test/shared_examples/authorable_interface_examples.rb +1 -1
  609. data/lib/decidim/core/test/shared_examples/comments_examples.rb +90 -107
  610. data/lib/decidim/core/test/shared_examples/comments_reports_examples.rb +4 -4
  611. data/lib/decidim/core/test/shared_examples/digest_mail_examples.rb +1 -1
  612. data/lib/decidim/core/test/shared_examples/edit_link_shared_examples.rb +1 -1
  613. data/lib/decidim/core/test/shared_examples/editor_shared_examples.rb +7 -7
  614. data/lib/decidim/core/test/shared_examples/fingerprint_examples.rb +1 -1
  615. data/lib/decidim/core/test/shared_examples/follows_examples.rb +6 -11
  616. data/lib/decidim/core/test/shared_examples/has_attachment_collections.rb +4 -2
  617. data/lib/decidim/core/test/shared_examples/has_attachments.rb +3 -2
  618. data/lib/decidim/core/test/shared_examples/has_contextual_help.rb +4 -4
  619. data/lib/decidim/core/test/shared_examples/has_reference.rb +1 -1
  620. data/lib/decidim/core/test/shared_examples/logo_email.rb +1 -1
  621. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +9 -9
  622. data/lib/decidim/core/test/shared_examples/map_examples.rb +5 -5
  623. data/lib/decidim/core/test/shared_examples/paginated_resource_examples.rb +7 -7
  624. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +3 -3
  625. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +3 -3
  626. data/lib/decidim/core/test/shared_examples/process_announcements_examples.rb +4 -4
  627. data/lib/decidim/core/test/shared_examples/reports_examples.rb +11 -53
  628. data/lib/decidim/core/test/shared_examples/rich_text_editor_examples.rb +10 -10
  629. data/lib/decidim/core/test/shared_examples/searchable_participatory_space_examples.rb +1 -1
  630. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +8 -8
  631. data/lib/decidim/core/test/shared_examples/share_link_examples.rb +2 -2
  632. data/lib/decidim/core/test/shared_examples/simple_event.rb +1 -1
  633. data/lib/decidim/core/test/shared_examples/space_cell_changes_button_text_cta.rb +3 -3
  634. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +15 -113
  635. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +2 -2
  636. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +2 -28
  637. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +0 -26
  638. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  639. data/lib/decidim/core/version.rb +1 -1
  640. data/lib/decidim/core.rb +24 -17
  641. data/lib/decidim/dependency_resolver.rb +3 -3
  642. data/lib/decidim/diffy_extension.rb +1 -19
  643. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +2 -1
  644. data/lib/decidim/engine_router.rb +2 -2
  645. data/lib/decidim/events/base_event.rb +19 -0
  646. data/lib/decidim/events/simple_event.rb +1 -0
  647. data/lib/decidim/exporters/export_manifest.rb +1 -1
  648. data/lib/decidim/faker/localized.rb +3 -3
  649. data/lib/decidim/form_builder.rb +5 -5
  650. data/lib/decidim/hashtag.rb +1 -1
  651. data/lib/decidim/jsonb_attributes.rb +4 -4
  652. data/lib/decidim/manifest_messages.rb +2 -2
  653. data/lib/decidim/map/autocomplete.rb +0 -1
  654. data/lib/decidim/map/provider/dynamic_map/here.rb +40 -1
  655. data/lib/decidim/map/provider/static_map/here.rb +0 -34
  656. data/lib/decidim/nicknamizable.rb +1 -1
  657. data/lib/decidim/organization_settings.rb +5 -8
  658. data/lib/decidim/paddable.rb +1 -1
  659. data/lib/decidim/participable.rb +1 -1
  660. data/lib/decidim/participatory_space_manifest.rb +1 -1
  661. data/lib/decidim/participatory_space_user.rb +0 -4
  662. data/lib/decidim/query_extensions.rb +26 -0
  663. data/lib/decidim/reportable.rb +2 -6
  664. data/lib/decidim/resourceable.rb +1 -1
  665. data/lib/decidim/search_resource_fields_mapper.rb +2 -2
  666. data/lib/decidim/searchable.rb +3 -3
  667. data/lib/decidim/seeds.rb +62 -0
  668. data/lib/decidim/settings_manifest.rb +0 -2
  669. data/lib/decidim/stats_registry.rb +2 -2
  670. data/lib/decidim/translatable_attributes.rb +4 -13
  671. data/lib/decidim/translatable_resource.rb +1 -1
  672. data/lib/decidim/view_hooks.rb +1 -1
  673. data/lib/decidim/view_model.rb +4 -1
  674. data/lib/decidim/webpacker/esbuild.config.js +14 -0
  675. data/lib/decidim/webpacker/shakapacker.yml +2 -2
  676. data/lib/decidim/webpacker/tsconfig.json +11 -0
  677. data/lib/decidim/webpacker/webpack/custom.js +13 -35
  678. data/lib/devise/models/decidim_newsletterable.rb +1 -1
  679. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -2
  680. data/lib/tasks/decidim_locales_tasks.rake +1 -1
  681. data/lib/tasks/decidim_mailers_tasks.rake +2 -2
  682. data/lib/tasks/decidim_metrics_tasks.rake +6 -6
  683. data/lib/tasks/decidim_procfile.rake +9 -3
  684. data/lib/tasks/decidim_tasks.rake +5 -4
  685. data/lib/tasks/decidim_webpacker_tasks.rake +126 -117
  686. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +80 -0
  687. data/lib/tasks/upgrade/decidim_content_blocks_tasks.rake +50 -0
  688. data/lib/tasks/upgrade/decidim_deduplicate_endorsements.rake +1 -1
  689. data/lib/tasks/upgrade/decidim_fix_categorization.rake +6 -132
  690. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +20 -23
  691. data/lib/tasks/upgrade/decidim_fix_short_url_resolver.rake +1 -1
  692. data/lib/tasks/upgrade/decidim_moderation_tasks.rake +1 -1
  693. data/lib/tasks/upgrade/decidim_user_moderation.rake +1 -1
  694. metadata +220 -103
  695. data/app/cells/decidim/content_blocks/cta/show.erb +0 -12
  696. data/app/cells/decidim/content_blocks/cta_cell.rb +0 -31
  697. data/app/cells/decidim/footer_pages/pages.erb +0 -3
  698. data/app/cells/decidim/footer_pages/topics.erb +0 -12
  699. data/app/cells/decidim/footer_pages_cell.rb +0 -68
  700. data/app/controllers/concerns/decidim/direct_upload.rb +0 -82
  701. data/app/helpers/concerns/decidim/user_role_checker.rb +0 -46
  702. data/app/packs/src/decidim/remote_tooltips.js +0 -38
  703. data/app/packs/src/decidim/vendor/modernizr.js +0 -5
  704. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  705. data/app/queries/decidim/similar_emendations.rb +0 -56
  706. data/app/uploaders/decidim/cw/application_uploader.rb +0 -77
  707. data/app/uploaders/decidim/cw/attachment_uploader.rb +0 -56
  708. data/app/uploaders/decidim/cw/avatar_uploader.rb +0 -24
  709. data/app/uploaders/decidim/cw/banner_image_uploader.rb +0 -7
  710. data/app/uploaders/decidim/cw/download_your_data_uploader.rb +0 -15
  711. data/app/uploaders/decidim/cw/downloader.rb +0 -9
  712. data/app/uploaders/decidim/cw/hero_image_uploader.rb +0 -10
  713. data/app/uploaders/decidim/cw/homepage_image_uploader.rb +0 -14
  714. data/app/uploaders/decidim/cw/image_uploader.rb +0 -78
  715. data/app/uploaders/decidim/cw/newsletter_template_image_uploader.rb +0 -38
  716. data/app/uploaders/decidim/cw/oauth_application_logo_uploader.rb +0 -10
  717. data/app/uploaders/decidim/cw/official_image_footer_uploader.rb +0 -10
  718. data/app/uploaders/decidim/cw/official_image_header_uploader.rb +0 -10
  719. data/app/uploaders/decidim/cw/open_data_uploader.rb +0 -23
  720. data/app/uploaders/decidim/cw/organization_favicon_uploader.rb +0 -18
  721. data/app/uploaders/decidim/cw/organization_logo_uploader.rb +0 -10
  722. data/app/uploaders/decidim/cw/record_image_uploader.rb +0 -15
  723. data/app/uploaders/decidim/downloader.rb +0 -9
  724. data/app/views/decidim/amendments/compare_draft.html.erb +0 -18
  725. data/app/views/layouts/decidim/_edit_link.html.erb +0 -0
  726. data/app/views/layouts/decidim/header/_main_links_mobile.html.erb +0 -36
  727. data/config/initializers/carrierwave.rb +0 -15
  728. data/config/locales/bn-BD.yml +0 -1
  729. data/config/locales/bs-BA.yml +0 -100
  730. data/config/locales/ca-IT.yml +0 -2115
  731. data/lib/decidim/attributes/rich_text.rb +0 -38
  732. data/lib/decidim/carrier_wave_migrator_service.rb +0 -287
  733. data/lib/decidim/content_parsers/blob_parser.rb +0 -95
  734. data/lib/decidim/content_renderers/blob_renderer.rb +0 -90
  735. data/lib/decidim/seven_zip_wrapper.rb +0 -29
  736. data/lib/tasks/decidim_active_storage_migration_tasks.rake +0 -114
  737. data/lib/tasks/decidim_content_blocks_tasks.rake +0 -48
  738. data/lib/tasks/upgrade/decidim_attachments.rake +0 -14
  739. /data/app/views/layouts/decidim/header/{_menu_breadcrumb_main_dropdown.html.erb → _menu_breadcrumb_main_dropdown_desktop.html.erb} +0 -0
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module Attributes
5
- # Custom attributes value to convert rich text strings in the database, i.e.
6
- # strings that originate from the editor.
7
- class RichText < Decidim::Attributes::CleanString
8
- def type
9
- :"decidim/attributes/rich_text"
10
- end
11
-
12
- # Serializes the value to the database.
13
- def serialize(value)
14
- serialize_value(value)
15
- end
16
-
17
- private
18
-
19
- # From form to database
20
- def serialize_value(value)
21
- return value unless value.is_a?(String)
22
-
23
- context = {}
24
- parsed = Decidim::ContentProcessor.parse_with_processor(:blob, value, context)
25
- parsed.rewrite
26
- end
27
-
28
- # From database to form
29
- def cast_value(value)
30
- clean_string = super
31
- return clean_string unless clean_string.is_a?(String)
32
-
33
- renderer = Decidim::ContentProcessor.renderer_klass(:blob).constantize.new(clean_string)
34
- renderer.render
35
- end
36
- end
37
- end
38
- end
@@ -1,287 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "English"
4
-
5
- module Decidim
6
- module CarrierWaveMigratorService
7
- MIGRATION_ATTRIBUTES = {
8
- "Decidim::Organization" => lambda do
9
- [
10
- [Decidim::Attachment, "file", Decidim::Cw::AttachmentUploader, "file"],
11
- [Decidim::User, "avatar", Decidim::Cw::AvatarUploader, "avatar"],
12
- [Decidim::UserGroup, "avatar", Decidim::Cw::AvatarUploader, "avatar"],
13
- [Decidim::OAuthApplication, "organization_logo", Decidim::Cw::OAuthApplicationLogoUploader, "organization_logo"],
14
- [Decidim::Authorization, "verification_attachment", Decidim::Cw::Verifications::AttachmentUploader, "verification_attachment"],
15
- [Decidim::Organization, "official_img_header", Decidim::Cw::OfficialImageHeaderUploader, "official_img_header"],
16
- [Decidim::Organization, "official_img_footer", Decidim::Cw::OfficialImageFooterUploader, "official_img_footer"],
17
- [Decidim::Organization, "logo", Decidim::Cw::OrganizationLogoUploader, "logo"],
18
- [Decidim::Organization, "favicon", Decidim::Cw::OrganizationFaviconUploader, "favicon"],
19
- [Decidim::Organization, "highlighted_content_banner_image", Decidim::Cw::ImageUploader, "highlighted_content_banner_image"]
20
- ]
21
- end,
22
- "Decidim::Conference" => lambda do
23
- [
24
- [Decidim::Conference, "hero_image", Decidim::Cw::HeroImageUploader, "hero_image"],
25
- [Decidim::Conference, "banner_image", Decidim::Cw::HomepageImageUploader, "banner_image"],
26
- [Decidim::Conference, "main_logo", Decidim::Cw::Conferences::DiplomaUploader, "main_logo"],
27
- [Decidim::Conference, "signature", Decidim::Cw::Conferences::DiplomaUploader, "signature"],
28
- [Decidim::ConferenceSpeaker, "avatar", Decidim::Cw::AvatarUploader, "avatar"],
29
- [Decidim::Conferences::Partner, "logo", Decidim::Cw::Conferences::PartnerLogoUploader, "logo"]
30
- ]
31
- end,
32
- "Decidim::Votings::Voting" => lambda do
33
- [
34
- [Decidim::Votings::Voting, "banner_image", Decidim::Cw::BannerImageUploader, "banner_image"],
35
- [Decidim::Votings::Voting, "introductory_image", Decidim::Cw::BannerImageUploader, "introductory_image"]
36
- ]
37
- end,
38
- "Decidim::ParticipatoryProcess" => lambda do
39
- [
40
- [Decidim::ParticipatoryProcess, "hero_image", Decidim::Cw::HeroImageUploader, "hero_image"],
41
- [Decidim::ParticipatoryProcess, "banner_image", Decidim::Cw::BannerImageUploader, "banner_image"],
42
- [Decidim::ParticipatoryProcessGroup, "hero_image", Decidim::Cw::HeroImageUploader, "hero_image"]
43
- ]
44
- end,
45
- "Decidim::Assembly" => lambda do
46
- [
47
- [Decidim::Assembly, "hero_image", Decidim::Cw::HeroImageUploader, "hero_image"],
48
- [Decidim::Assembly, "banner_image", Decidim::Cw::BannerImageUploader, "banner_image"]
49
- ]
50
- end,
51
- "Decidim::Initiative" => lambda do
52
- [
53
- [Decidim::InitiativesType, "banner_image", Decidim::Cw::BannerImageUploader, "banner_image"]
54
- ]
55
- end
56
- }.sum do |main_model, attributes|
57
- main_model.constantize.is_a?(Class) ? attributes.call : []
58
- rescue NameError
59
- []
60
- end.freeze
61
-
62
- def self.check_content_blocks_attachments(logger:)
63
- Decidim::ContentBlock.find_each do |block|
64
- next if block.images.blank?
65
-
66
- block.manifest.images.each do |image_config|
67
- attachment = cw_images_container(block).send(image_config[:name])
68
- destination = block.images_container.send(image_config[:name])
69
-
70
- next if attachment.file.blank?
71
-
72
- if destination.attached?
73
- attachment.cache_stored_file!
74
- file = cw_file(attachment)
75
-
76
- cw_checksum = downloaded_file_checksum(file)
77
- as_checksum = destination.blob.checksum
78
-
79
- logger.info "#{cw_checksum == as_checksum ? "[OK] Checksum identical:" : "[KO] Checksum different:"} " \
80
- "Migrated Decidim::ContentBlock##{block.id} attachment #{image_config[:name]} " \
81
- "from CW attribute #{image_config[:name]} to AS " \
82
- "in Decidim::ContentBlockAttachment##{destination.record.id} file attribute"
83
- else
84
- logger.info "[SKIP] Pending migration of Decidim::ContentBlock##{block.id} attachment #{image_config[:name]} " \
85
- "from CW attribute #{image_config[:name]} to AS" \
86
- end
87
- rescue StandardError
88
- logger.info "[ERROR] Exception checking Decidim::ContentBlock##{block.id} attachment #{image_config[:name]} " \
89
- "from CW attribute #{image_config[:name]} to AS file attribute in a Decidim::ContentBlockAttachment instance #{$ERROR_INFO}"
90
- end
91
- end
92
- end
93
-
94
- def self.migrate_content_blocks_attachments!(logger:, routes_mappings: [])
95
- Decidim::ContentBlock.find_each do |block|
96
- next if block.images.blank?
97
-
98
- block.manifest.images.each do |image_config|
99
- destination = block.images_container.send(image_config[:name])
100
-
101
- if destination.attached?
102
- logger.info "[SKIP] Migrated Decidim::ContentBlock##{block.id} attachment #{image_config[:name]} " \
103
- "from CW attribute #{image_config[:name]} to AS " \
104
- "in Decidim::ContentBlockAttachment##{destination.record.id} file attribute"
105
- next
106
- end
107
-
108
- attachment = cw_images_container(block).send(image_config[:name])
109
- next if attachment.file.blank?
110
-
111
- origin_path = attachment.url
112
- attachment.cache_stored_file!
113
- content_type = attachment.content_type
114
- filename = block.images[image_config[:name].to_s]
115
- file = cw_file(attachment)
116
- destination.attach(
117
- io: file,
118
- content_type:,
119
- filename:
120
- )
121
- destination.record.save if destination.record.new_record?
122
-
123
- cw_checksum = downloaded_file_checksum(file)
124
- as_checksum = destination.blob.checksum
125
-
126
- logger.info "[OK] Migrated - #{cw_checksum == as_checksum ? "[OK] Checksum identical:" : "[KO] Checksum different:"} " \
127
- "Decidim::ContentBlock##{block.id} attachment #{image_config[:name]} " \
128
- "from CW attribute #{image_config[:name]} to AS " \
129
- "in Decidim::ContentBlockAttachment##{destination.record.id} file attribute" \
130
-
131
- routes_mappings << { instance: "Decidim::ContentBlock##{block.id}",
132
- attachment_origin_attribute: image_config[:name],
133
- origin_path:,
134
- destination_path: Rails.application.routes.url_helpers.rails_blob_url(destination.blob, only_path: true) }
135
- rescue StandardError
136
- logger.info "[ERROR] Exception migrating Decidim::ContentBlock##{block.id} attachment #{image_config[:name]} " \
137
- "from CW attribute #{image_config[:name]} to AS file attribute in a Decidim::ContentBlockAttachment instance #{$ERROR_INFO}"
138
- end
139
- end
140
- end
141
-
142
- # rubocop:disable Metrics/ParameterLists
143
- def self.migrate_attachment!(klass:, cw_attribute:, cw_uploader:, logger:, as_attribute: cw_attribute, routes_mappings: [])
144
- old_class = cw_attachments_class(klass, cw_attribute, cw_uploader)
145
-
146
- old_class.items.each do |item|
147
- next if item.send(cw_attribute).blank?
148
-
149
- copy = klass.find(item.id)
150
- # Skip record if already been processed
151
- if copy.send(as_attribute).attached?
152
- logger.info "[SKIP] Migrated #{klass}##{item.id} from CW attribute #{cw_attribute} to AS #{as_attribute} attribute"
153
- next
154
- end
155
-
156
- attachment = item.send(cw_attribute)
157
- origin_path = attachment.url
158
- attachment.cache_stored_file!
159
- content_type = attachment.content_type
160
- filename = item.attributes[cw_attribute.to_s]
161
- file = cw_file(attachment)
162
- copy.send(as_attribute).attach(
163
- io: file,
164
- content_type:,
165
- filename:
166
- )
167
-
168
- cw_checksum = downloaded_file_checksum(file)
169
- as_checksum = copy.send(as_attribute).blob.checksum
170
-
171
- logger.info "[OK] Migrated - #{cw_checksum == as_checksum ? "[OK] Checksum identical:" : "[KO] Checksum different:"} " \
172
- "#{klass}##{item.id} from CW attribute #{cw_attribute} to AS #{as_attribute} attribute"
173
-
174
- routes_mappings << {
175
- instance: "#{klass}##{item.id}",
176
- attachment_origin_attribute: cw_attribute.to_s,
177
- origin_path:,
178
- destination_path: Rails.application.routes.url_helpers.rails_blob_url(copy.send(as_attribute).blob, only_path: true)
179
- }
180
- rescue StandardError
181
- logger.info "[ERROR] Exception migrating #{klass}##{item.id} from CW attribute #{cw_attribute} to AS #{as_attribute} attribute #{$ERROR_INFO}"
182
- end
183
- end
184
- # rubocop:enable Metrics/ParameterLists
185
-
186
- def self.check_migration(klass:, cw_attribute:, cw_uploader:, logger:, as_attribute: cw_attribute)
187
- old_class = cw_attachments_class(klass, cw_attribute, cw_uploader)
188
-
189
- old_class.items.each do |item|
190
- next if item.send(cw_attribute).blank?
191
-
192
- copy = klass.find(item.id)
193
-
194
- if copy.send(as_attribute).attached?
195
- attachment = item.send(cw_attribute)
196
- attachment.cache_stored_file!
197
- file = cw_file(attachment)
198
-
199
- cw_checksum = downloaded_file_checksum(file)
200
- as_checksum = copy.send(as_attribute).blob.checksum
201
-
202
- logger.info "#{cw_checksum == as_checksum ? "[OK] Checksum identical:" : "[KO] Checksum different:"} " \
203
- "Migrated #{klass}##{item.id} from CW attribute #{cw_attribute} " \
204
- "to AS #{as_attribute} attribute"
205
- else
206
- logger.info "[SKIP] Pending migration of #{klass}##{item.id} from CW attribute #{cw_attribute} to AS #{as_attribute} attribute"
207
- end
208
- rescue StandardError
209
- logger.info "[ERROR] Exception checking #{klass}##{item.id} from CW attribute #{cw_attribute} to AS #{as_attribute} attribute #{$ERROR_INFO}"
210
- end
211
- end
212
-
213
- def self.cw_attachments_class(klass, cw_attribute, cw_uploader)
214
- has_sti = klass.column_names.include?(klass.inheritance_column)
215
-
216
- attachments_class = Class.new(ApplicationRecord) do
217
- cattr_accessor :klass
218
-
219
- self.table_name = klass.table_name
220
-
221
- if has_sti
222
- self.inheritance_column = nil
223
- scope :items, -> { where(type: klass.name) }
224
- else
225
- scope :items, -> { all }
226
- end
227
- mount_uploader cw_attribute, cw_uploader
228
-
229
- def self.to_s
230
- klass.to_s
231
- end
232
- end
233
-
234
- attachments_class.klass = klass
235
- attachments_class
236
- end
237
-
238
- def self.cw_images_container(block)
239
- manifest = block.manifest
240
- images_container_class = Class.new do
241
- extend ::CarrierWave::Mount
242
- include ActiveModel::Validations
243
-
244
- cattr_accessor :manifest, :manifest_scope
245
- attr_reader :content_block
246
-
247
- delegate :id, :organization, to: :content_block
248
-
249
- def self.to_s
250
- "decidim/#{manifest.name.to_s.underscore}_#{manifest_scope.to_s.underscore}_content_block"
251
- end
252
-
253
- def initialize(content_block)
254
- @content_block = content_block
255
- end
256
-
257
- manifest.images.each do |image_config|
258
- mount_uploader image_config[:name], image_config[:uploader].gsub("Decidim::", "Decidim::Cw::").constantize
259
- end
260
-
261
- def read_uploader(column)
262
- content_block.images[column.to_s]
263
- end
264
- end
265
-
266
- images_container_class.manifest = block.manifest
267
- images_container_class.manifest_scope = block.scope_name
268
- images_container_class.new(block)
269
- end
270
-
271
- def self.downloaded_file_checksum(file)
272
- if file.is_a?(StringIO)
273
- Digest::MD5.base64digest(file.read)
274
- else
275
- Digest::MD5.file(file).base64digest
276
- end
277
- end
278
-
279
- def self.cw_file(attachment)
280
- if attachment.file.is_a?(CarrierWave::Storage::Fog::File)
281
- URI.parse(attachment.url).open
282
- else
283
- File.open(attachment.file.file)
284
- end
285
- end
286
- end
287
- end
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module ContentParsers
5
- # Parses any blob URLs from the content and replaces them with references
6
- # to those blobs.
7
- class BlobParser < BaseParser
8
- # Matches all possible URLs pointing to ActiveStorage::Blob objects.
9
- #
10
- # Possible routes:
11
- # get "/blobs/redirect/:signed_id/*filename"
12
- # get "/blobs/proxy/:signed_id/*filename"
13
- # get "/blobs/:signed_id/*filename"
14
- # get "/representations/redirect/:signed_blob_id/:variation_key/*filename"
15
- # get "/representations/proxy/:signed_blob_id/:variation_key/*filename"
16
- # get "/representations/:signed_blob_id/:variation_key/*filename"
17
- # get "/disk/:encoded_key/*filename"
18
- #
19
- # See:
20
- # https://github.com/rails/rails/blob/a7e379896552ce43b822385c03c37f2bd47739d3/activestorage/config/routes.rb#L5-L14
21
- BLOB_REGEX = %r{
22
- # Group 1: Host part
23
- (?<host_part>
24
- # Group 2: Domain and subpath part
25
- #{URI::DEFAULT_PARSER.make_regexp(%w(https http))}
26
- )?
27
- /rails/active_storage
28
- # Group 3: Blob path, representation path or disk service path
29
- /(?<type_part>blobs/redirect|blobs/proxy|blobs|representations/redirect|representations/proxy|representations|disk)
30
- # Group 4: Signed ID for blobs or encoded key for disk service
31
- /(?<key_part>[^/]+)
32
- # Group 5: Variation part (only for representations)
33
- (
34
- # Group 6: Variation key for representations
35
- /(?<variation_part>[\w.=-]+)
36
- )?
37
- # Group 7: Filename
38
- /([\w.=-]+)
39
- }x
40
-
41
- def rewrite
42
- replace_blobs(content)
43
- end
44
-
45
- private
46
-
47
- def replace_blobs(text)
48
- text.gsub(BLOB_REGEX) do |match|
49
- named_captures = Regexp.last_match.named_captures
50
-
51
- type_part = named_captures["type_part"]
52
- key_part = named_captures["key_part"]
53
-
54
- variation_key = nil
55
- blob =
56
- if type_part == "disk"
57
- # Disk service URL
58
- decoded = ActiveStorage.verifier.verified(key_part, purpose: :blob_key)
59
- ActiveStorage::Blob.find_by(key: decoded[:key]) if decoded
60
- else
61
- # Representation or blob
62
- if type_part.start_with?("representations")
63
- # Representation
64
- variation_part = named_captures["variation_part"]
65
- variation_key = generate_variation_key(variation_part)
66
- end
67
-
68
- ActiveStorage::Blob.find_signed(key_part)
69
- end
70
- next match unless blob
71
-
72
- "#{blob.to_global_id}#{"/#{variation_key}" if variation_key}"
73
- end
74
- end
75
-
76
- def generate_variation_key(variation_part)
77
- # The variation part has to be decoded because it will eventually
78
- # expire. This way we can preserve the variation information
79
- # longer.
80
- variation = ActiveStorage.verifier.verify(variation_part, purpose: :variation)
81
- return unless variation
82
-
83
- # Convert to base64 encoded JSON string for better representation within
84
- # the URLs. This manually encoded part will not expire as it is
85
- # persisted to the database.
86
- Base64.strict_encode64(ActiveSupport::JSON.encode(variation))
87
- rescue ActiveSupport::MessageVerifier::InvalidSignature
88
- # This happens if the variation key is already expired in which
89
- # case it cannot be represented and instead a URL to the blob is
90
- # created.
91
- variation_part
92
- end
93
- end
94
- end
95
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module ContentRenderers
5
- # A renderer that searches Global IDs representing blobs in content and
6
- # replaces it with a URL to these blobs.
7
- #
8
- # e.g. gid://<APP_NAME>/ActiveStorage::Blob/1
9
- #
10
- # OR for representations
11
- #
12
- # e.g. gid://<APP_NAME>/ActiveStorage::Blob/1/<encoded variant transformations>
13
- #
14
- # The `<encoded variant transformations>` part of the URL is a Base64
15
- # encoded string that contains an unencrypted JSON-encoded value about the
16
- # blob transformations. This way the specific representations can be stored
17
- # in the database without having these values expiring.
18
- #
19
- # @see BaseRenderer Examples of how to use a content renderer
20
- class BlobRenderer < BaseRenderer
21
- # Matches a global id representing a Decidim::User
22
- GLOBAL_ID_REGEX = %r{(gid://[\w-]+/ActiveStorage::Blob/\d+)(/([\w=-]+))?}
23
-
24
- # Replaces found Global IDs matching an existing blob with a URL to
25
- # that blob. The Global IDs representing an invalid ActiveStorage::Blob
26
- # are replaced with an empty string.
27
- #
28
- # @return [String] the content ready to display (contains HTML)
29
- def render(_options = nil)
30
- replace_pattern(content, GLOBAL_ID_REGEX)
31
- end
32
-
33
- protected
34
-
35
- def replace_pattern(text, pattern)
36
- return text unless text.respond_to?(:gsub)
37
-
38
- text.gsub(pattern) do
39
- blob_gid = Regexp.last_match(1)
40
- variation_key = Regexp.last_match(3)
41
-
42
- blob = GlobalID::Locator.locate(blob_gid)
43
- if variation_key
44
- variation = begin
45
- ActiveSupport::JSON.decode(Base64.strict_decode64(variation_key))
46
- rescue JSON::ParseError
47
- variation_key
48
- end
49
- blob_url(blob, variation)
50
- else
51
- blob_url(blob)
52
- end
53
- rescue ActiveRecord::RecordNotFound => _e
54
- ""
55
- end
56
- end
57
-
58
- def blob_url(blob, variation = nil)
59
- url = begin
60
- if variation
61
- blob.variant(variation).url
62
- else
63
- blob.url
64
- end
65
- rescue ArgumentError
66
- # ArgumentError is raised in case the blob's service is set to
67
- # ActiveStorage::Service::DiskService and
68
- # `ActiveStorage::Current.url_options` is not set.
69
- end
70
- raise URI::InvalidURIError if url.blank?
71
-
72
- url
73
- rescue URI::InvalidURIError
74
- local_blob_url(blob, variation)
75
- end
76
-
77
- def local_blob_url(blob, variation = nil)
78
- if variation
79
- routes.rails_representation_url(blob.variant(variation), only_path: true)
80
- else
81
- routes.rails_blob_url(blob, only_path: true)
82
- end
83
- end
84
-
85
- def routes
86
- @routes ||= Rails.application.routes.url_helpers
87
- end
88
- end
89
- end
90
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "shellwords"
4
-
5
- module Decidim
6
- class SevenZipWrapper
7
- class << self
8
- def compress_and_encrypt(filename:, password:, input_directory:)
9
- run("cd #{escape(input_directory)} && 7z a -tzip -p#{escape(password)} -mem=AES256 #{escape(filename)} .")
10
- end
11
-
12
- def extract_and_decrypt(filename:, password:, output_directory:)
13
- run("7z x -tzip #{escape(filename)} -o#{escape(output_directory)} -p#{escape(password)}")
14
- end
15
-
16
- private
17
-
18
- def run(command)
19
- success = system(command)
20
-
21
- raise "Command failed: #{command}" unless success
22
- end
23
-
24
- def escape(string)
25
- Shellwords.escape(string)
26
- end
27
- end
28
- end
29
- end
@@ -1,114 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :decidim do
4
- namespace :active_storage_migrations do
5
- desc "Migrates attachments from Carrierwave to ActiveStorage"
6
- task migrate_from_carrierwave_to_active_storage: :environment do
7
- # Setup a new logger, using the timestamp to identify each migration
8
- logger = ActiveSupport::TaggedLogging.new(Logger.new("log/#{Time.current.strftime("%Y%m%d%H%M")}_activestorage_migration.log"))
9
- routes_mappings = []
10
-
11
- Decidim::CarrierWaveMigratorService::MIGRATION_ATTRIBUTES.each do |(klass, cw_attribute, cw_uploader, as_attribute)|
12
- Decidim::CarrierWaveMigratorService.migrate_attachment!({
13
- klass:, cw_attribute:,
14
- cw_uploader:, as_attribute:,
15
- logger:,
16
- routes_mappings:
17
- })
18
- end
19
- Decidim::CarrierWaveMigratorService.migrate_content_blocks_attachments!(logger:, routes_mappings:)
20
-
21
- path = Rails.root.join("tmp/attachment_mappings.csv")
22
- dirname = File.dirname(path)
23
- FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
24
- File.binwrite(path, Decidim::Exporters::CSV.new(routes_mappings).export.read)
25
- end
26
-
27
- desc "Checks attachments migrated from Carrierwave to ActiveStorage"
28
- task check_migration_from_carrierwave_to_active_storage: :environment do
29
- # Setup a new logger, using the timestamp to identify each migration
30
- logger = ActiveSupport::TaggedLogging.new(Logger.new("log/#{Time.current.strftime("%Y%m%d%H%M")}_activestorage_migration_check.log"))
31
- Decidim::CarrierWaveMigratorService::MIGRATION_ATTRIBUTES.each do |(klass, cw_attribute, cw_uploader, as_attribute)|
32
- Decidim::CarrierWaveMigratorService.check_migration({
33
- klass:, cw_attribute:,
34
- cw_uploader:, as_attribute:,
35
- logger:
36
- })
37
- end
38
- Decidim::CarrierWaveMigratorService.check_content_blocks_attachments(logger:)
39
- end
40
-
41
- desc "Migrates inline images to ActiveStorage editor_image attachments"
42
- task :migrate_inline_images_to_active_storage, [:admin_email] => :environment do |_t, args|
43
- user = Decidim::User.find_by(email: args[:admin_email])
44
-
45
- raise "Invalid admin. Please, provide the email of an admin with permissions to create editor images" unless user&.admin? && user&.admin_terms_accepted?
46
-
47
- inline_images_available_attributes.each do |model, attributes|
48
- puts "=== Updating model #{model.name} (attributes: #{attributes.join(", ")})..."
49
- model.all.each do |item|
50
- attributes.each do |attribute|
51
- item.update(attribute => rewrite_value(item.send(attribute), user))
52
- end
53
- end
54
- puts "=== Finished update of model #{model.name}\n\n"
55
- end
56
- end
57
-
58
- def rewrite_value(value, user)
59
- if value.is_a?(Hash)
60
- value.transform_values do |nested_value|
61
- rewrite_value(nested_value, user)
62
- end
63
- else
64
- parser = Decidim::ContentParsers::InlineImagesParser.new(value, user:)
65
- parser.rewrite
66
- end
67
- end
68
-
69
- def inline_images_available_attributes
70
- {
71
- "Decidim::Accountability::Result" => %w(description),
72
- "Decidim::Proposals::Proposal" => %w(body answer cost_report execution_period),
73
- "Decidim::Votings::Voting" => %w(description),
74
- "Decidim::Elections::Question" => %w(description),
75
- "Decidim::Elections::Answer" => %w(description),
76
- "Decidim::Elections::Election" => %w(description),
77
- "Decidim::Initiative" => %w(description answer),
78
- "Decidim::InitiativesType" => %w(description extra_fields_legal_information),
79
- "Decidim::Assembly" => %w(short_description description purpose_of_action composition internal_organisation announcement closing_date_reason special_features),
80
- "Decidim::Forms::Questionnaire" => %w(description tos),
81
- "Decidim::Forms::Question" => %w(description),
82
- "Decidim::Organization" => %w(
83
- welcome_notification_body
84
- admin_terms_of_use_body
85
- admin_terms_of_service_body
86
- description
87
- highlighted_content_banner_short_description
88
- id_documents_explanation_text
89
- ),
90
- "Decidim::StaticPage" => %w(content),
91
- "Decidim::ContextualHelpSection" => %w(content),
92
- "Decidim::Category" => %w(description),
93
- "Decidim::Blogs::Post" => %w(body),
94
- "Decidim::Pages::Page" => %w(body),
95
- "Decidim::Sortitions::Sortition" => %w(additional_info witnesses cancel_reason),
96
- "Decidim::Debates::Debate" => %w(description instructions information_updates conclusions),
97
- "Decidim::Budgets::Budget" => %w(description),
98
- "Decidim::Budgets::Project" => %w(description),
99
- "Decidim::ConferenceSpeaker" => %w(short_bio),
100
- "Decidim::Conferences::RegistrationType" => %w(description),
101
- "Decidim::Conference" => %w(short_description description objectives registration_terms),
102
- "Decidim::ParticipatoryProcessGroup" => %w(description),
103
- "Decidim::ParticipatoryProcess" => %w(short_description description announcement),
104
- "Decidim::ParticipatoryProcessStep" => %w(description),
105
- "Decidim::Meetings::AgendaItem" => %w(description),
106
- "Decidim::Meetings::Meeting" => %w(registration_terms description registration_email_custom_content closing_report)
107
- }.each_with_object({}) do |(main_model, attributes), hash|
108
- hash[main_model.constantize] = attributes
109
- rescue NameError
110
- hash
111
- end
112
- end
113
- end
114
- end