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
@@ -0,0 +1,118 @@
1
+ /* global jest */
2
+
3
+ import {
4
+ dateToPicker,
5
+ displayDate,
6
+ formatDate,
7
+ formatInputDate,
8
+ calculateDatepickerPos
9
+ } from "src/decidim/datepicker/datepicker_functions"
10
+
11
+ describe("dateToPicker", () => {
12
+ it('should format date from "d-m-y" to "m-d-y" -format for datepicker', () => {
13
+ const inputDate = "01/02/2023";
14
+ const formats = { separator: "/", order: "d-m-y" };
15
+
16
+ const result = dateToPicker(inputDate, formats);
17
+
18
+ expect(result).toEqual("02/01/2023");
19
+ });
20
+
21
+ it('should format date from "y-m-d" to "m-d-y" -format for datepicker', () => {
22
+ const inputDate = "2023.02.01";
23
+ const formats = { separator: ".", order: "y-m-d" };
24
+
25
+ const result = dateToPicker(inputDate, formats);
26
+
27
+ expect(result).toEqual("02/01/2023");
28
+ });
29
+ });
30
+
31
+ describe("displayDate", () => {
32
+ it('should format date in "d-m-y" order correctly', () => {
33
+ const inputDate = new Date("2023-02-01");
34
+ const formats = { separator: "/", order: "d-m-y" };
35
+
36
+ const result = displayDate(inputDate, formats);
37
+
38
+ expect(result).toEqual("01/02/2023");
39
+ });
40
+
41
+ it('should format date in "y-m-d" order correctly', () => {
42
+ const inputDate = new Date("2023-02-01");
43
+ const formats = { separator: ".", order: "y-m-d" };
44
+
45
+ const result = displayDate(inputDate, formats);
46
+
47
+ expect(result).toEqual("2023.02.01");
48
+ });
49
+ });
50
+
51
+ describe("formatDate", () => {
52
+ it('should format date in "d-m-y" -format correctly to "datetime-local" or "date" formfield', () => {
53
+ const inputDate = "01/02/2023";
54
+ const formats = { separator: "/", order: "d-m-y" };
55
+
56
+ const result = formatDate(inputDate, formats);
57
+
58
+ expect(result).toEqual("2023-02-01");
59
+ });
60
+
61
+ it('should format date in "y-m-d" -format correctly to "datetime-local" or "date" formfield', () => {
62
+ const inputDate = "2023.02.01";
63
+ const formats = { separator: ".", order: "y-m-d" };
64
+
65
+ const result = formatDate(inputDate, formats);
66
+
67
+ expect(result).toEqual("2023-02-01");
68
+ });
69
+ });
70
+
71
+ describe("formatInputDate", () => {
72
+ it('should format date in "d-m-y" order correctly', () => {
73
+ const inputDate = "2023-02-01";
74
+ const formats = { separator: "/", order: "d-m-y" };
75
+
76
+ const result = formatInputDate(inputDate, formats);
77
+
78
+ expect(result).toEqual("01/02/2023");
79
+ });
80
+
81
+ it('should format date in "y-m-d" order correctly', () => {
82
+ const inputDate = "2023-02-01";
83
+ const formats = { separator: ".", order: "y-m-d" };
84
+
85
+ const result = formatInputDate(inputDate, formats);
86
+
87
+ expect(result).toEqual("2023.02.01");
88
+ });
89
+ });
90
+
91
+ describe("calculateDatepickerPos", () => {
92
+ it("should calculate datepicker position correctly in Admin panel", () => {
93
+ Reflect.defineProperty(document.body, "clientHeight", {
94
+ value: 800,
95
+ writable: true
96
+ });
97
+
98
+ Reflect.defineProperty(window, "scrollY", {
99
+ value: 200,
100
+ writable: true
101
+ });
102
+
103
+ const datePicker = {
104
+ getBoundingClientRect: jest.fn(() => ({
105
+ top: 300
106
+ })),
107
+ clientHeight: 100
108
+ };
109
+
110
+ jest.spyOn(document, "querySelector").mockReturnValue({
111
+ clientHeight: 50
112
+ });
113
+
114
+ const result = calculateDatepickerPos(datePicker);
115
+
116
+ expect(result).toEqual(150);
117
+ });
118
+ });
@@ -0,0 +1,227 @@
1
+ import {
2
+ setHour,
3
+ setMinute,
4
+ formatInputTime,
5
+ changeHourDisplay,
6
+ changeMinuteDisplay,
7
+ hourDisplay,
8
+ minuteDisplay,
9
+ formatTime
10
+ } from "src/decidim/datepicker/datepicker_functions"
11
+
12
+ describe("setHour", () => {
13
+ it("returns the hour in correct 24-hour format", () => {
14
+ const result = setHour("15:30", 24);
15
+ expect(result).toBe(15);
16
+ });
17
+
18
+ it("returns the hour in correct 12-hour format when hour is more than 12", () => {
19
+ const result = setHour("18:45", 12);
20
+ expect(result).toBe(6);
21
+ });
22
+
23
+ it("returns 12 for 12-hour format when hour is 0", () => {
24
+ const result = setHour("00:30", 12);
25
+ expect(result).toBe(12);
26
+ });
27
+
28
+ it("returns the hour in correct 12-hour format when hour is less than or equal to 12", () => {
29
+ const result = setHour("09:15", 12);
30
+ expect(result).toBe(9);
31
+ });
32
+ });
33
+
34
+ describe("setMinute", () => {
35
+ it("returns the correct value", () => {
36
+ const result = setMinute("12:45");
37
+ expect(result).toBe(45);
38
+ });
39
+
40
+ it("returns the correct minute value when 0", () => {
41
+ const result = setMinute("08:00");
42
+ expect(result).toBe(0);
43
+ });
44
+
45
+ it("returns the correct single-digit value", () => {
46
+ const result = setMinute("09:05");
47
+ expect(result).toBe(5);
48
+ });
49
+ });
50
+
51
+ describe("formatInputTime", () => {
52
+ const setupDOM = () => {
53
+ document.body.innerHTML = `
54
+ <input type="radio" id="period_am_exampleInput" name="period">
55
+ <input type="radio" id="period_pm_exampleInput" name="period">
56
+ `;
57
+ };
58
+
59
+ describe("24-hour format", () => {
60
+ it("returns the value in correct format", () => {
61
+ setupDOM();
62
+ const time = "15:30";
63
+ const format = 24;
64
+ const input = { id: "exampleInput" };
65
+
66
+ const result = formatInputTime(time, format, input);
67
+
68
+ expect(result).toBe("15:30");
69
+ });
70
+ })
71
+
72
+ describe("12-hour format", () => {
73
+ it("returns the value in correct format and checks the PM radio-button", () => {
74
+ setupDOM();
75
+ const time = "12:45";
76
+ const format = 12;
77
+ const input = { id: "exampleInput" };
78
+
79
+ const result = formatInputTime(time, format, input);
80
+
81
+ expect(result).toBe("12:45");
82
+ expect(document.getElementById("period_pm_exampleInput").checked).toBeTruthy();
83
+ expect(document.getElementById("period_am_exampleInput").checked).toBeFalsy();
84
+ });
85
+
86
+ it("returns the value in correct format", () => {
87
+ setupDOM();
88
+ const time = "00:25";
89
+ const format = 12;
90
+ const input = { id: "exampleInput" };
91
+
92
+ const result = formatInputTime(time, format, input);
93
+
94
+ expect(result).toBe("12:25");
95
+ // We are not expecting a radio button to be selected here since in a real environment the selected button is not
96
+ // handled by this method for values < 12
97
+ });
98
+ })
99
+ });
100
+
101
+
102
+ describe("changeHourDisplay", () => {
103
+ describe("24-hour format", () => {
104
+ it("should increase the hour", () => {
105
+ expect(changeHourDisplay("increase", 10, 24)).toEqual(11);
106
+ });
107
+
108
+ it("should change hour from 23 -> 0", () => {
109
+ expect(changeHourDisplay("increase", 23, 24)).toEqual(0);
110
+ });
111
+
112
+ it("should decrease the hour", () => {
113
+ expect(changeHourDisplay("decrease", 10, 24)).toEqual(9);
114
+ });
115
+
116
+ it("should change the hour from 0 -> 23", () => {
117
+ expect(changeHourDisplay("decrease", 0, 24)).toEqual(23);
118
+ });
119
+ });
120
+
121
+ describe("12-hour format", () => {
122
+ it("should increase the hour", () => {
123
+ expect(changeHourDisplay("increase", 10, 12)).toEqual(11);
124
+ });
125
+
126
+ it("should change hour from 12 -> 1", () => {
127
+ expect(changeHourDisplay("increase", 12, 12)).toEqual(1);
128
+ });
129
+
130
+ it("should decrease the hour", () => {
131
+ expect(changeHourDisplay("decrease", 10, 12)).toEqual(9);
132
+ });
133
+
134
+ it("should change the hour from 1 -> 12", () => {
135
+ expect(changeHourDisplay("decrease", 1, 12)).toEqual(12);
136
+ });
137
+ });
138
+
139
+ it("should return null when invalid parameter", () => {
140
+ expect(changeHourDisplay("invalid", 10, 12)).toBeNull();
141
+ });
142
+ });
143
+
144
+ describe("changeMinuteDisplay", () => {
145
+ describe("increase", () => {
146
+ it("should increase the minute", () => {
147
+ expect(changeMinuteDisplay("increase", 10)).toEqual(11);
148
+ });
149
+
150
+ it("should change the minute from 59 -> 0", () => {
151
+ expect(changeMinuteDisplay("increase", 59)).toEqual(0);
152
+ });
153
+ });
154
+
155
+ describe("decrease", () => {
156
+ it("should decrease the minute", () => {
157
+ expect(changeMinuteDisplay("decrease", 10)).toEqual(9);
158
+ });
159
+
160
+ it("should change the minute from 0 -> 59", () => {
161
+ expect(changeMinuteDisplay("decrease", 0)).toEqual(59);
162
+ });
163
+ });
164
+
165
+ it("should handle invalid input by returning null", () => {
166
+ expect(changeMinuteDisplay("invalid", 10)).toBeNull();
167
+ });
168
+ });
169
+
170
+ describe("hourDisplay", () => {
171
+ it("should add a prefix zero for single-digit hours", () => {
172
+ expect(hourDisplay(5)).toEqual("05");
173
+ expect(hourDisplay(9)).toEqual("09");
174
+ });
175
+
176
+ it("should not add a prefix zero for double-digit hours", () => {
177
+ expect(hourDisplay(10)).toEqual(10);
178
+ expect(hourDisplay(15)).toEqual(15);
179
+ });
180
+ });
181
+
182
+ describe("minuteDisplay", () => {
183
+ it("should add a prefix zero for single-digit minutes", () => {
184
+ expect(minuteDisplay(5)).toEqual("05");
185
+ expect(minuteDisplay(9)).toEqual("09");
186
+ });
187
+
188
+ it("should not add a prefix zero for double-digit minutes", () => {
189
+ expect(minuteDisplay(10)).toEqual(10);
190
+ expect(minuteDisplay(15)).toEqual(15);
191
+ });
192
+ });
193
+
194
+
195
+ describe("formatTime", () => {
196
+ const id = "exampleInput";
197
+
198
+ it("should convert 12-hour time to 24-hour time for AM", () => {
199
+ document.body.innerHTML = `
200
+ <input type="radio" id="period_am_exampleInput" checked> AM
201
+ <input type="radio" id="period_pm_exampleInput"> PM
202
+ `;
203
+
204
+ expect(formatTime("09:30", 12, id)).toEqual("09:30");
205
+ expect(formatTime("12:45", 12, id)).toEqual("00:45");
206
+ });
207
+
208
+ it("should convert 12-hour time to 24-hour time for PM", () => {
209
+ document.body.innerHTML = `
210
+ <input type="radio" id="period_am_exampleInput"> AM
211
+ <input type="radio" id="period_pm_exampleInput" checked> PM
212
+ `;
213
+
214
+ expect(formatTime("03:15", 12, id)).toEqual("15:15");
215
+ expect(formatTime("11:30", 12, id)).toEqual("23:30");
216
+ });
217
+
218
+ it("should return the original time for 24-hour format", () => {
219
+ document.body.innerHTML = `
220
+ <input type="radio" id="period_am_exampleInput"> AM
221
+ <input type="radio" id="period_pm_exampleInput"> PM
222
+ `;
223
+
224
+ expect(formatTime("15:45", 24, id)).toEqual("15:45");
225
+ expect(formatTime("08:20", 24, id)).toEqual("08:20");
226
+ });
227
+ });
@@ -21,7 +21,6 @@ const updateActiveUploads = (modal) => {
21
21
  const files = document.querySelector(`[data-active-uploads=${modal.modal.id}]`)
22
22
  const previousId = Array.from(files.querySelectorAll("[type=hidden][id]"))
23
23
  const isMultiple = modal.options.multiple
24
- const isTitled = modal.options.titled
25
24
 
26
25
  // fastest way to clean children nodes
27
26
  files.textContent = ""
@@ -35,26 +34,16 @@ const updateActiveUploads = (modal) => {
35
34
  let hidden = ""
36
35
  if (file.hiddenField) {
37
36
  // if there is hiddenField, this file is new
38
- let fileField = null;
39
- if (isMultiple) {
40
- fileField = `${modal.options.resourceName}[${modal.options.addAttribute}][${ix}][file]`
41
- } else if (isTitled) {
42
- fileField = `${modal.options.resourceName}[${modal.options.addAttribute}][file]`
43
- } else {
44
- fileField = `${modal.options.resourceName}[${modal.options.addAttribute}]`;
45
- }
37
+ const fileField = isMultiple
38
+ ? `${modal.options.resourceName}[${modal.options.addAttribute}][${ix}][file]`
39
+ : `${modal.options.resourceName}[${modal.options.addAttribute}]`
46
40
 
47
41
  hidden = `<input type="hidden" name="${fileField}" value="${file.hiddenField}" />`
48
42
  } else {
49
43
  // otherwise, we keep the attachmentId
50
- let fileField = null;
51
- if (isMultiple) {
52
- fileField = `${modal.options.resourceName}[${modal.options.addAttribute}][${ix}][id]`;
53
- } else if (isTitled) {
54
- fileField = `${modal.options.resourceName}[${modal.options.addAttribute}][id]`;
55
- } else {
56
- fileField = `${modal.options.resourceName}[${modal.options.addAttribute}]`;
57
- }
44
+ const fileField = isMultiple
45
+ ? `${modal.options.resourceName}[${modal.options.addAttribute}][${ix}][id]`
46
+ : `${modal.options.resourceName}[${modal.options.addAttribute}]`
58
47
 
59
48
  // convert all node attributes to string
60
49
  const attributes = Array.from(previousId.find(({ id }) => id === file.attachmentId).attributes).reduce((acc, { name, value }) => `${acc} ${name}="${value}"`, "")
@@ -62,12 +51,10 @@ const updateActiveUploads = (modal) => {
62
51
  hidden += `<input type="hidden" name="${fileField}" value="${file.attachmentId}" />`
63
52
  }
64
53
 
65
- if (isTitled) {
54
+ if (modal.options.titled) {
66
55
  const titleValue = modal.modal.querySelectorAll('input[type="text"]')[ix].value
67
56
  // NOTE - Renaming the attachment is not supported when multiple uploader is disabled
68
- const titleField = isMultiple
69
- ? `${modal.options.resourceName}[${modal.options.addAttribute}][${ix}][title]`
70
- : `${modal.options.resourceName}[${modal.options.addAttribute}][title]`
57
+ const titleField = `${modal.options.resourceName}[${modal.options.addAttribute}][${ix}][title]`
71
58
  hidden += `<input type="hidden" name="${titleField}" value="${escapeQuotes(titleValue)}" />`
72
59
 
73
60
  title = titleValue
@@ -77,9 +77,6 @@ export default class UploadModal {
77
77
  uploader.upload.create((error, blob) => {
78
78
  if (error) {
79
79
  uploader.errors = [error]
80
- this.uploadItems.replaceChild(this.createUploadItem(file, [error], { value: 100 }), item);
81
- this.updateDropZone();
82
-
83
80
  } else {
84
81
  // attach the file hash to submit the form, when the file has been uploaded
85
82
  file.hiddenField = blob.signed_id
@@ -13,7 +13,7 @@ const allowedNodeTypes = ["heading", "paragraph"];
13
13
  const allowedNodeActive = (editor) => allowedNodeTypes.some((type) => editor.isActive(type));
14
14
 
15
15
  /**
16
- * Finds the closest allowed type node from the given position. Traversese the
16
+ * Finds the closest allowed type node from the given position. Traverses the
17
17
  * document depth upwards to search through all the node parents.
18
18
  *
19
19
  * @param {Object} position The position where to look for
@@ -9,7 +9,7 @@ const YOUTUBE_REGEX_GLOBAL = /^(https?:\/\/)?(www\.|music\.)?(youtube\.com|youtu
9
9
  const VIMEO_REGEX = /^(https?:\/\/)?(www\.|player\.)?(vimeo\.com)(.+)?$/;
10
10
  const VIMEO_REGEX_GLOBAL = /^(https?:\/\/)?(www\.|player\.)?(vimeo\.com)(.+)?$/g;
11
11
 
12
- const isValidYoutubeUrl = (url) => {
12
+ const isValidYouTubeUrl = (url) => {
13
13
  return url.match(YOUTUBE_REGEX);
14
14
  }
15
15
 
@@ -17,7 +17,7 @@ const isValidVimeoUrl = (url) => {
17
17
  return url.match(VIMEO_REGEX);
18
18
  };
19
19
 
20
- const getEmbedUrlFromYoutubeUrl = (options) => {
20
+ const getEmbedUrlFromYouTubeUrl = (options) => {
21
21
  const embedUrl = "https://www.youtube-nocookie.com/embed/";
22
22
 
23
23
  const { url } = options;
@@ -74,8 +74,8 @@ const getEmbedUrlFromVimeoUrl = (options) => {
74
74
  const getEmbedUrlFromVideoUrl = (options) => {
75
75
  const { url } = options;
76
76
 
77
- if (isValidYoutubeUrl(url)) {
78
- return getEmbedUrlFromYoutubeUrl(options);
77
+ if (isValidYouTubeUrl(url)) {
78
+ return getEmbedUrlFromYouTubeUrl(options);
79
79
  } else if (isValidVimeoUrl(url)) {
80
80
  return getEmbedUrlFromVimeoUrl(options);
81
81
  }
@@ -1,24 +1,9 @@
1
- /* global jest */
2
-
3
1
  import { Editor } from "@tiptap/core";
4
2
 
5
3
  import DecidimKit from "src/decidim/editor/extensions/decidim_kit";
6
4
 
7
5
  import { createEditorContainer } from "src/decidim/editor/test/helpers";
8
6
 
9
- // Mock picmo as it is distributed as an ES6 module that is not fully compatible
10
- // with Jest without configuration changes.
11
- jest.mock("@picmo/popup-picker",
12
- () => ({
13
- createPopup: () => {
14
- return {
15
- addEventListener: () => {},
16
- closeButton: {}
17
- }
18
- }
19
- })
20
- );
21
-
22
7
  describe("DecidimKit", () => {
23
8
  const createEditor = (config = {}) => {
24
9
  const editorElement = document.querySelector(".editor .editor-input");
@@ -141,7 +141,7 @@ describe("Indent", () => {
141
141
  expect(editor.getHTML()).toEqual("<p>Hello, world!</p>");
142
142
  });
143
143
 
144
- it("does not oudent the content if the selection is not at the beginning of the line", async () => {
144
+ it("does not outdent the content if the selection is not at the beginning of the line", async () => {
145
145
  await updateContent(editorElement, '<p class="editor-indent-2">Hello, world!</p>');
146
146
 
147
147
  editorElement.focus();
@@ -9,7 +9,7 @@ const dropzoneLocales = {
9
9
  uploaded: "Uploaded",
10
10
  validating: "Validating...",
11
11
  "title_required": "Title is required!",
12
- "file_size_too_large": "File size is too large! Maximun file size: 10MB",
12
+ "file_size_too_large": "File size is too large! Maximum file size: 10MB",
13
13
  "validation_error": "Validation error!"
14
14
  };
15
15
 
@@ -34,26 +34,13 @@ window.DragEvent = class DragEvent extends Event {};
34
34
 
35
35
  const defaultEditorConfig = {
36
36
  contentTypes: {
37
- image: ["image/jpeg", "image/png"]
37
+ image: ["image/jpeg", "image/png", "image/webp"]
38
38
  },
39
39
  uploadImagesPath: "/editor_images",
40
40
  dragAndDropHelpText: "Add images by dragging & dropping or pasting them.",
41
41
  uploadDialogSelector: "#upload_dialog"
42
42
  };
43
43
 
44
- // Mock picmo as it is distributed as an ES6 module that is not fully compatible
45
- // with Jest without configuration changes.
46
- jest.mock("@picmo/popup-picker",
47
- () => ({
48
- createPopup: () => {
49
- return {
50
- addEventListener: () => {},
51
- closeButton: {}
52
- }
53
- }
54
- })
55
- );
56
-
57
44
  // Mock the SVG icons import because jest tests are not running through webpack
58
45
  jest.mock("images/decidim/remixicon.symbol.svg", () => "test/url.svg");
59
46
 
@@ -40,7 +40,7 @@ const getMsoListStyle = (type, level, styleDefs) => {
40
40
  return Object.assign(typeStyle, levelStyle);
41
41
  };
42
42
 
43
- const converMsoListStyleToHtml = (listStyle) => {
43
+ const convertMsoListStyleToHtml = (listStyle) => {
44
44
  let tag = "ol",
45
45
  type = null;
46
46
  switch (listStyle["mso-level-number-format"]) {
@@ -108,7 +108,7 @@ export const transformMsDesktop = (html) => {
108
108
  elements.forEach((paragraph) => {
109
109
  const { type: msoType, level } = detectMsoList(paragraph);
110
110
  const listStyle = getMsoListStyle(msoType, level, listStyles);
111
- const { tag, type } = converMsoListStyleToHtml(listStyle);
111
+ const { tag, type } = convertMsoListStyleToHtml(listStyle);
112
112
 
113
113
  const li = document.createElement("li");
114
114
  const pa = document.createElement("p");
@@ -28,8 +28,8 @@ export default function updateExternalDomainLinks(element) {
28
28
  }
29
29
 
30
30
  const domain = parts[3].replace(/^www\./, "")
31
- const whitelist = window.Decidim.config.get("external_domain_whitelist") || []
32
- if (whitelist.includes(domain)) {
31
+ const allowlist = window.Decidim.config.get("external_domain_allowlist") || []
32
+ if (allowlist.includes(domain)) {
33
33
  return;
34
34
  }
35
35
 
@@ -4,7 +4,7 @@ describe("ExternalDomainLink", () => {
4
4
  const content = `
5
5
  <div id="links">
6
6
  <a href="https://github.com/" target="_blank">This is an external link</a>
7
- <a href="https://example.com/" target="_blank">This is an external link from a whitelisted domain</a>
7
+ <a href="https://example.com/" target="_blank">This is an external link from a domain in the allowlist</a>
8
8
  <div class="editor-container">
9
9
  <a href="https://example.org/" target="_blank">This is an external link within an editor</a>
10
10
  </div>
@@ -12,7 +12,7 @@ describe("ExternalDomainLink", () => {
12
12
  </div>
13
13
  `;
14
14
  const config = {
15
- "external_domain_whitelist": ["example.com"]
15
+ "external_domain_allowlist": ["example.com"]
16
16
  };
17
17
  window.Decidim = {
18
18
  config: {
@@ -33,11 +33,11 @@ describe("ExternalDomainLink", () => {
33
33
  );
34
34
  });
35
35
 
36
- it("does not update the link to the external link URL when its whitelisted", () => {
36
+ it("does not update the link to the external link URL when its in the allow list", () => {
37
37
  const $link = $("#links a")[1];
38
38
 
39
39
  expect($link.outerHTML).toEqual(
40
- '<a href="https://example.com/" target="_blank">This is an external link from a whitelisted domain</a>'
40
+ '<a href="https://example.com/" target="_blank">This is an external link from a domain in the allowlist</a>'
41
41
  );
42
42
  });
43
43
 
@@ -2,7 +2,7 @@
2
2
  /* eslint max-lines: ["error", {"max": 350, "skipBlankLines": true}] */
3
3
 
4
4
  /**
5
- * A plain Javascript component that handles the form filter.
5
+ * A plain JavaScript component that handles the form filter.
6
6
  * @class
7
7
  * @augments Component
8
8
  */
@@ -24,9 +24,9 @@ export default class FormFilterComponent {
24
24
  this._onPopState = this._onPopState.bind(this);
25
25
 
26
26
  if (window.Decidim.PopStateHandler) {
27
- this.popStateSubmiter = false;
27
+ this.popStateSubmitter = false;
28
28
  } else {
29
- this.popStateSubmiter = true;
29
+ this.popStateSubmitter = true;
30
30
  window.Decidim.PopStateHandler = this.id;
31
31
  }
32
32
  }
@@ -239,7 +239,7 @@ export default class FormFilterComponent {
239
239
  }
240
240
 
241
241
  // Only one instance should submit the form on browser history navigation
242
- if (this.popStateSubmiter) {
242
+ if (this.popStateSubmitter) {
243
243
  Rails.fire(this.$form[0], "submit");
244
244
  }
245
245
 
@@ -1,7 +1,7 @@
1
1
  import dayjs from "dayjs"
2
2
 
3
3
  $(() => {
4
- const $impersonationWarning = $(".impersonation-warning");
4
+ const $impersonationWarning = $("[data-impersonation-warning]");
5
5
  if ($impersonationWarning.length) {
6
6
  const endsAt = dayjs($impersonationWarning.data("session-ends-at"));
7
7
  const exitInterval = setInterval(() => {