decidim-core 0.31.6 → 0.32.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 (461) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -13
  3. data/app/cells/decidim/amendable/amend_button_card/show.erb +2 -2
  4. data/app/cells/decidim/amendable/amend_button_card_cell.rb +1 -1
  5. data/app/cells/decidim/author_cell.rb +4 -0
  6. data/app/cells/decidim/content_blocks/announcement_settings_form/show.erb +5 -0
  7. data/app/cells/decidim/content_blocks/announcement_settings_form_cell.rb +17 -0
  8. data/app/cells/decidim/content_blocks/cta_settings_form/show.erb +1 -1
  9. data/app/cells/decidim/content_blocks/hero_settings_form/show.erb +2 -2
  10. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +1 -1
  11. data/app/cells/decidim/content_blocks/highlighted_content_banner_settings_form/show.erb +1 -1
  12. data/app/cells/decidim/content_blocks/highlighted_participatory_spaces_cell.rb +1 -1
  13. data/app/cells/decidim/content_blocks/how_to_participate/show.erb +1 -1
  14. data/app/cells/decidim/content_blocks/html_cell.rb +1 -1
  15. data/app/cells/decidim/content_blocks/participatory_space_announcement_cell.rb +1 -3
  16. data/app/cells/decidim/content_blocks/participatory_space_hero_cell.rb +1 -5
  17. data/app/cells/decidim/content_blocks/participatory_space_hero_settings_form/show.erb +1 -1
  18. data/app/cells/decidim/content_blocks/static_page/section_cell.rb +1 -1
  19. data/app/cells/decidim/content_blocks/static_page/section_settings_form/show.erb +1 -3
  20. data/app/cells/decidim/content_blocks/static_page/summary_cell.rb +1 -1
  21. data/app/cells/decidim/content_blocks/static_page/summary_settings_form/show.erb +1 -3
  22. data/app/cells/decidim/content_blocks/static_page/two_pane_section_cell.rb +2 -2
  23. data/app/cells/decidim/content_blocks/static_page/two_pane_section_settings_form/show.erb +2 -4
  24. data/app/cells/decidim/data_consent/category.erb +5 -5
  25. data/app/cells/decidim/{participatory_space_private_user_cell.rb → member_cell.rb} +1 -1
  26. data/app/cells/decidim/onboarding_action_message_cell.rb +1 -0
  27. data/app/cells/decidim/profile/details.erb +1 -1
  28. data/app/cells/decidim/profile_cell.rb +1 -0
  29. data/app/cells/decidim/profile_member_of/show.erb +13 -0
  30. data/app/cells/decidim/profile_member_of_cell.rb +35 -0
  31. data/app/cells/decidim/resource_types_filter/show.erb +2 -2
  32. data/app/cells/decidim/tags_cell.rb +1 -1
  33. data/app/cells/decidim/upload_modal_cell.rb +0 -5
  34. data/app/cells/decidim/versions_list/show.erb +25 -0
  35. data/app/commands/decidim/create_follow.rb +3 -5
  36. data/app/commands/decidim/create_user_report.rb +1 -1
  37. data/app/commands/decidim/destroy_account.rb +4 -15
  38. data/app/commands/decidim/gallery_methods.rb +107 -0
  39. data/app/commands/decidim/multiple_attachments_methods.rb +27 -28
  40. data/app/commands/decidim/search.rb +5 -5
  41. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +1 -1
  42. data/app/controllers/concerns/decidim/devise_controllers.rb +0 -10
  43. data/app/controllers/concerns/decidim/direct_upload.rb +3 -2
  44. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +1 -1
  45. data/app/controllers/concerns/decidim/force_authentication.rb +10 -1
  46. data/app/controllers/concerns/decidim/impersonate_users.rb +4 -0
  47. data/app/controllers/concerns/decidim/locale_switcher.rb +52 -2
  48. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +1 -1
  49. data/app/controllers/concerns/decidim/participatory_space/has_members_page.rb +27 -0
  50. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -5
  51. data/app/controllers/decidim/account_controller.rb +1 -1
  52. data/app/controllers/decidim/amendments_controller.rb +5 -4
  53. data/app/controllers/decidim/components/base_controller.rb +20 -3
  54. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -1
  55. data/app/controllers/decidim/devise/passwords_controller.rb +1 -1
  56. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  57. data/app/controllers/decidim/devise/sessions_controller.rb +1 -1
  58. data/app/controllers/decidim/download_your_data_controller.rb +2 -2
  59. data/app/controllers/decidim/editor_images_controller.rb +1 -1
  60. data/app/controllers/decidim/follows_controller.rb +4 -3
  61. data/app/controllers/decidim/geolocation_controller.rb +1 -1
  62. data/app/controllers/decidim/likes_controller.rb +2 -1
  63. data/app/controllers/decidim/locales_controller.rb +3 -11
  64. data/app/controllers/decidim/messaging/conversations_controller.rb +3 -3
  65. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  66. data/app/controllers/decidim/notifications_settings_controller.rb +1 -1
  67. data/app/controllers/decidim/notifications_subscriptions_controller.rb +0 -8
  68. data/app/controllers/decidim/open_data_controller.rb +1 -1
  69. data/app/controllers/decidim/report_users_controller.rb +2 -2
  70. data/app/controllers/decidim/reports_controller.rb +1 -1
  71. data/app/controllers/decidim/user_activities_controller.rb +1 -2
  72. data/app/events/decidim/welcome_notification_event.rb +1 -1
  73. data/app/forms/decidim/upload_validation_form.rb +1 -1
  74. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +1 -0
  75. data/app/helpers/decidim/active_link_to_helper.rb +136 -0
  76. data/app/helpers/decidim/amendments_helper.rb +3 -3
  77. data/app/helpers/decidim/check_boxes_tree_helper.rb +2 -2
  78. data/app/helpers/decidim/component_path_helper.rb +9 -4
  79. data/app/helpers/decidim/filters_helper.rb +0 -2
  80. data/app/helpers/decidim/menu_helper.rb +3 -3
  81. data/app/helpers/decidim/meta_tags_helper.rb +0 -2
  82. data/app/helpers/decidim/paginate_helper.rb +14 -1
  83. data/app/helpers/decidim/sanitize_helper.rb +1 -0
  84. data/app/helpers/decidim/short_link_helper.rb +5 -5
  85. data/app/helpers/decidim/translations_helper.rb +4 -4
  86. data/app/jobs/decidim/delete_inactive_participants_job.rb +2 -2
  87. data/app/jobs/decidim/process_inactive_participant_job.rb +7 -0
  88. data/app/mailers/decidim/application_mailer.rb +7 -2
  89. data/app/mailers/decidim/decidim_devise_mailer.rb +1 -0
  90. data/app/mailers/decidim/participants_account_mailer.rb +16 -0
  91. data/app/mailers/decidim/reported_mailer.rb +4 -1
  92. data/app/models/decidim/action_log.rb +1 -1
  93. data/app/models/decidim/attachment.rb +2 -20
  94. data/app/models/decidim/authorization.rb +0 -7
  95. data/app/models/decidim/authorization_transfer.rb +1 -1
  96. data/app/models/decidim/component.rb +6 -9
  97. data/app/models/decidim/content_block.rb +3 -3
  98. data/app/models/decidim/moderation.rb +1 -1
  99. data/app/models/decidim/newsletter.rb +2 -2
  100. data/app/models/decidim/participatory_space/member.rb +55 -0
  101. data/app/models/decidim/private_export.rb +0 -6
  102. data/app/models/decidim/resource_link.rb +1 -1
  103. data/app/models/decidim/short_link.rb +1 -1
  104. data/app/models/decidim/user_base_entity.rb +2 -17
  105. data/app/models/decidim/user_moderation.rb +1 -1
  106. data/app/packs/src/decidim/controllers/assign_role/assign_role.test.js +80 -0
  107. data/app/packs/src/decidim/controllers/assign_role/controller.js +27 -0
  108. data/app/packs/src/decidim/controllers/form_validator/form_validator.js +6 -6
  109. data/app/packs/src/decidim/controllers/form_validator/form_validator.test.js +1 -23
  110. data/app/packs/src/decidim/controllers/main_menu/controller.js +115 -0
  111. data/app/packs/src/decidim/controllers/main_menu/main_menu.test.js +185 -0
  112. data/app/packs/src/decidim/controllers/mention/controller.js +140 -296
  113. data/app/packs/src/decidim/controllers/mention/input_mentions.test.js +457 -120
  114. data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +32 -68
  115. data/app/packs/src/decidim/controllers/multiple_mentions/input_multiple_mentions.test.js +23 -30
  116. data/app/packs/src/decidim/datepicker/generate_datepicker.js +1 -13
  117. data/app/packs/src/decidim/direct_uploads/upload_field.js +4 -4
  118. data/app/packs/src/decidim/direct_uploads/upload_modal.js +7 -11
  119. data/app/packs/src/decidim/editor/common/suggestion.js +1 -1
  120. data/app/packs/src/decidim/editor/extensions/decidim_kit/index.js +4 -1
  121. data/app/packs/src/decidim/editor/extensions/image/index.js +8 -5
  122. data/app/packs/src/decidim/editor/extensions/link/index.js +8 -0
  123. data/app/packs/src/decidim/editor/extensions/mention/index.js +18 -5
  124. data/app/packs/src/decidim/editor/extensions/mention_resource/index.js +16 -7
  125. data/app/packs/src/decidim/editor/test/extensions/decidim_kit.test.js +13 -4
  126. data/app/packs/src/decidim/editor/test/extensions/heading.test.js +1 -1
  127. data/app/packs/src/decidim/editor/test/extensions/image.test.js +26 -28
  128. data/app/packs/src/decidim/editor/test/extensions/mention.test.js +6 -2
  129. data/app/packs/src/decidim/editor/test/extensions/video_embed.test.js +27 -15
  130. data/app/packs/src/decidim/editor/test/helpers.js +8 -10
  131. data/app/packs/src/decidim/editor/test/toolbar/full.test.js +15 -4
  132. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_block.js +8 -4
  133. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_formatting.js +5 -1
  134. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_indent.js +9 -5
  135. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_link.js +5 -1
  136. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_list.js +8 -4
  137. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_styling.js +13 -9
  138. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_content_styling.js +6 -2
  139. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +5 -15
  140. data/app/packs/src/decidim/index.js +3 -5
  141. data/app/packs/src/decidim/sw/push-permissions.js +13 -48
  142. data/app/packs/src/decidim/sw/sw.js +1 -1
  143. data/app/packs/src/decidim/utilities/text.js +6 -6
  144. data/app/packs/src/decidim/vendor/tribute.js +1890 -0
  145. data/app/packs/stylesheets/decidim/_cards.scss +2 -1
  146. data/app/packs/stylesheets/decidim/_conversations.scss +0 -14
  147. data/app/packs/stylesheets/decidim/_datepicker.scss +0 -8
  148. data/app/packs/stylesheets/decidim/_dropdown.scss +21 -31
  149. data/app/packs/stylesheets/decidim/_floating_help.scss +1 -1
  150. data/app/packs/stylesheets/decidim/_footer.scss +0 -36
  151. data/app/packs/stylesheets/decidim/_forms.scss +5 -1
  152. data/app/packs/stylesheets/decidim/_header.scss +148 -46
  153. data/app/packs/stylesheets/decidim/_language_chooser.scss +79 -0
  154. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  155. data/app/packs/stylesheets/decidim/application.scss +1 -2
  156. data/app/packs/stylesheets/decidim/editor.scss +33 -2
  157. data/app/packs/stylesheets/decidim/geocoding_addons.scss +2 -10
  158. data/app/presenters/decidim/admin_log/participatory_space/member_presenter.rb +40 -0
  159. data/app/presenters/decidim/admin_log/static_page_resource_presenter.rb +1 -1
  160. data/app/presenters/decidim/authorization_transfer_presenter.rb +1 -1
  161. data/app/presenters/decidim/breadcrumb_root_menu_item_presenter.rb +3 -3
  162. data/app/presenters/decidim/log/user_presenter.rb +1 -0
  163. data/app/presenters/decidim/log/value_types/access_mode_presenter.rb +45 -0
  164. data/app/presenters/decidim/menu_item_presenter.rb +3 -9
  165. data/app/presenters/decidim/participatory_space/member_presenter.rb +48 -0
  166. data/app/presenters/decidim/resource_locator_presenter.rb +22 -3
  167. data/app/presenters/decidim/stats_presenter.rb +1 -1
  168. data/app/queries/decidim/last_activity.rb +1 -1
  169. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +15 -1
  170. data/app/services/decidim/email_notification_generator.rb +2 -0
  171. data/app/services/decidim/notification_generator.rb +4 -0
  172. data/app/services/decidim/notifications_subscriptions_persistor.rb +0 -6
  173. data/app/services/decidim/send_push_notification.rb +1 -5
  174. data/app/uploaders/decidim/image_uploader.rb +1 -1
  175. data/app/uploaders/decidim/organization_favicon_uploader.rb +4 -9
  176. data/app/validators/uploader_image_dimensions_validator.rb +13 -11
  177. data/app/views/decidim/gamification/badges/index.html.erb +1 -1
  178. data/app/views/decidim/homepage/show.html.erb +2 -2
  179. data/app/views/decidim/last_activities/index.html.erb +1 -1
  180. data/app/views/decidim/messaging/conversations/_error_modal.html.erb +19 -11
  181. data/app/views/decidim/messaging/conversations/_new_conversation_button.html.erb +1 -1
  182. data/app/views/decidim/messaging/conversations/_reply.html.erb +1 -1
  183. data/app/views/decidim/messaging/conversations/error.js.erb +7 -12
  184. data/app/views/decidim/messaging/conversations/new.html.erb +1 -1
  185. data/app/views/decidim/messaging/conversations/show.html.erb +2 -2
  186. data/app/views/decidim/newsletters/unsubscribe.html.erb +1 -1
  187. data/app/views/decidim/notifications_settings/show.html.erb +5 -5
  188. data/app/views/decidim/offline/show.html.erb +1 -1
  189. data/app/views/decidim/pages/index.html.erb +1 -1
  190. data/app/views/decidim/participants_account_mailer/removal_notification.html.erb +11 -0
  191. data/app/views/decidim/participatory_space/members/_member.html.erb +1 -0
  192. data/app/views/decidim/profiles/show.html.erb +1 -1
  193. data/app/views/decidim/shared/_resource_actions.html.erb +4 -4
  194. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  195. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -1
  196. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +4 -3
  197. data/app/views/decidim/user_activities/index.html.erb +1 -1
  198. data/app/views/devise/mailer/{invite_private_user.html.erb → invite_member.html.erb} +2 -2
  199. data/app/views/devise/mailer/{invite_private_user.text.erb → invite_member.text.erb} +2 -2
  200. data/app/views/layouts/decidim/_head.html.erb +2 -2
  201. data/app/views/layouts/decidim/_wrapper.html.erb +3 -3
  202. data/app/views/layouts/decidim/footer/_focus_mode_main.html.erb +0 -1
  203. data/app/views/layouts/decidim/footer/_main.html.erb +0 -1
  204. data/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +4 -1
  205. data/app/views/layouts/decidim/header/_main.html.erb +17 -8
  206. data/app/views/layouts/decidim/header/_main_language_chooser.html.erb +24 -0
  207. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +56 -56
  208. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +2 -2
  209. data/app/views/layouts/decidim/header/_main_links_mobile_item_account.html.erb +3 -1
  210. data/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +18 -5
  211. data/app/views/layouts/decidim/header/_main_search.html.erb +3 -3
  212. data/app/views/layouts/decidim/header/_menu.html.erb +5 -5
  213. data/app/views/layouts/decidim/header/_menu_breadcrumb_desktop.html.erb +13 -12
  214. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile.html.erb +28 -0
  215. data/app/views/layouts/decidim/shared/_layout_center.html.erb +1 -1
  216. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  217. data/app/views/layouts/decidim/shared/_layout_two_col.html.erb +1 -1
  218. data/config/initializers/invisible_captcha.rb +1 -0
  219. data/config/locales/ar.yml +9 -12
  220. data/config/locales/bg.yml +12 -14
  221. data/config/locales/bs-BA.yml +0 -1
  222. data/config/locales/ca-IT.yml +46 -33
  223. data/config/locales/ca.yml +46 -33
  224. data/config/locales/cs.yml +38 -27
  225. data/config/locales/da.yml +0 -1
  226. data/config/locales/de.yml +33 -27
  227. data/config/locales/el.yml +8 -9
  228. data/config/locales/en.yml +42 -28
  229. data/config/locales/eo.yml +0 -1
  230. data/config/locales/es-MX.yml +45 -32
  231. data/config/locales/es-PY.yml +45 -32
  232. data/config/locales/es.yml +45 -32
  233. data/config/locales/et.yml +0 -1
  234. data/config/locales/eu.yml +84 -71
  235. data/config/locales/fa-IR.yml +0 -1
  236. data/config/locales/fi-plain.yml +40 -32
  237. data/config/locales/fi.yml +42 -34
  238. data/config/locales/fr-CA.yml +45 -33
  239. data/config/locales/fr.yml +45 -33
  240. data/config/locales/ga-IE.yml +3 -2
  241. data/config/locales/gl.yml +7 -9
  242. data/config/locales/gn-PY.yml +0 -1
  243. data/config/locales/hr.yml +0 -1
  244. data/config/locales/hu.yml +9 -12
  245. data/config/locales/id-ID.yml +7 -9
  246. data/config/locales/is-IS.yml +1 -2
  247. data/config/locales/it.yml +7 -23
  248. data/config/locales/ja.yml +42 -47
  249. data/config/locales/ka-GE.yml +0 -1
  250. data/config/locales/kaa.yml +0 -1
  251. data/config/locales/ko.yml +0 -1
  252. data/config/locales/lb.yml +9 -10
  253. data/config/locales/lt.yml +9 -12
  254. data/config/locales/lv.yml +7 -9
  255. data/config/locales/mt.yml +0 -1
  256. data/config/locales/nl.yml +9 -10
  257. data/config/locales/no.yml +9 -10
  258. data/config/locales/oc-FR.yml +0 -1
  259. data/config/locales/pl.yml +14 -16
  260. data/config/locales/pt-BR.yml +36 -26
  261. data/config/locales/pt.yml +9 -10
  262. data/config/locales/ro-RO.yml +25 -21
  263. data/config/locales/ru.yml +0 -7
  264. data/config/locales/sk.yml +8 -1417
  265. data/config/locales/sl.yml +0 -1
  266. data/config/locales/sr-CS.yml +0 -1
  267. data/config/locales/sv.yml +47 -26
  268. data/config/locales/tr-TR.yml +10 -10
  269. data/config/locales/uk.yml +0 -4
  270. data/config/locales/vi.yml +0 -1
  271. data/config/locales/zh-CN.yml +9 -9
  272. data/config/locales/zh-TW.yml +9 -10
  273. data/config/routes.rb +138 -77
  274. data/db/data/20251213075429_rename_members_in_action_log.rb +22 -0
  275. data/db/data/20260319145808_rename_send_to_members_in_newsletter.rb +27 -0
  276. data/db/migrate/20200730142511_add_file_upload_settings_to_decidim_organizations.rb +13 -15
  277. data/db/migrate/20250523104311_move_cta_to_hero_content_block.rb +1 -1
  278. data/db/migrate/20250527122040_move_highlighted_content_banner_settings_to_content_block.rb +1 -1
  279. data/db/migrate/20250819110800_convert_private_exports_id_to_uuid.rb +2 -2
  280. data/db/migrate/20251112132305_remove_legacy_images_from_core_module.rb +27 -0
  281. data/db/migrate/20251205122428_rename_participatory_space_private_users_to_members.rb +9 -0
  282. data/db/migrate/20251216185133_rename_privatable_to_to_participatory_space_in_members.rb +10 -0
  283. data/db/migrate/20260208201405_remove_user_group_core.rb +21 -0
  284. data/db/migrate/20260208201406_remove_user_group_memberships.rb +30 -0
  285. data/db/migrate/20260208201407_remove_user_group_organizations.rb +11 -0
  286. data/db/migrate/20260217152425_remove_enable_participatory_space_filters_from_decidim_organizations.rb +7 -0
  287. data/db/migrate/20260314081619_add_index_on_decidim_members.rb +25 -0
  288. data/decidim-core.gemspec +25 -28
  289. data/lib/decidim/acts_as_tree.rb +12 -12
  290. data/lib/decidim/admin_filters_registry.rb +1 -1
  291. data/lib/decidim/amendable.rb +5 -1
  292. data/lib/decidim/api/functions/category_list.rb +1 -0
  293. data/lib/decidim/api/functions/component_finder_base.rb +1 -1
  294. data/lib/decidim/api/functions/component_list.rb +3 -1
  295. data/lib/decidim/api/functions/component_list_base.rb +1 -0
  296. data/lib/decidim/api/functions/participatory_space_finder_base.rb +1 -1
  297. data/lib/decidim/api/functions/participatory_space_list_base.rb +1 -0
  298. data/lib/decidim/api/functions/user_entity_list.rb +0 -3
  299. data/lib/decidim/api/interfaces/amendable_entity_interface.rb +1 -0
  300. data/lib/decidim/api/interfaces/amendable_interface.rb +1 -0
  301. data/lib/decidim/api/interfaces/attachable_collection_interface.rb +1 -0
  302. data/lib/decidim/api/interfaces/attachable_interface.rb +1 -0
  303. data/lib/decidim/api/interfaces/author_interface.rb +2 -1
  304. data/lib/decidim/api/interfaces/authorable_interface.rb +1 -0
  305. data/lib/decidim/api/interfaces/categories_container_interface.rb +1 -0
  306. data/lib/decidim/api/interfaces/categorizable_interface.rb +1 -0
  307. data/lib/decidim/api/interfaces/coauthorable_interface.rb +1 -0
  308. data/lib/decidim/api/interfaces/component_interface.rb +9 -8
  309. data/lib/decidim/api/interfaces/fingerprint_interface.rb +1 -0
  310. data/lib/decidim/api/interfaces/followable_interface.rb +2 -0
  311. data/lib/decidim/api/interfaces/likeable_interface.rb +2 -2
  312. data/lib/decidim/api/interfaces/localizable_interface.rb +1 -0
  313. data/lib/decidim/api/interfaces/participatory_space_interface.rb +1 -0
  314. data/lib/decidim/api/interfaces/referable_interface.rb +1 -0
  315. data/lib/decidim/api/interfaces/scopable_interface.rb +1 -0
  316. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +1 -0
  317. data/lib/decidim/api/interfaces/timestamps_interface.rb +1 -0
  318. data/lib/decidim/api/interfaces/traceable_interface.rb +1 -0
  319. data/lib/decidim/api/types/attachment_collection_type.rb +5 -3
  320. data/lib/decidim/api/types/attachment_type.rb +11 -4
  321. data/lib/decidim/api/types/badge_score_type.rb +28 -0
  322. data/lib/decidim/api/types/moderation_type.rb +25 -0
  323. data/lib/decidim/api/types/participant_details_type.rb +17 -0
  324. data/lib/decidim/api/types/reportable_type.rb +18 -0
  325. data/lib/decidim/api/types/reportable_user_type.rb +17 -0
  326. data/lib/decidim/api/types/static_page_topic_type.rb +16 -0
  327. data/lib/decidim/api/types/static_page_type.rb +22 -0
  328. data/lib/decidim/api/types/taxonomy_type.rb +2 -0
  329. data/lib/decidim/api/types/user_moderation_type.rb +36 -0
  330. data/lib/decidim/api/types/user_type.rb +13 -0
  331. data/lib/decidim/asset_router/pipeline.rb +1 -1
  332. data/lib/decidim/asset_router/storage.rb +9 -9
  333. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +3 -0
  334. data/lib/decidim/attachment_attributes.rb +9 -58
  335. data/lib/decidim/attribute_encryptor.rb +51 -10
  336. data/lib/decidim/attribute_object/model.rb +0 -5
  337. data/lib/decidim/block_registry.rb +1 -1
  338. data/lib/decidim/coauthorable.rb +2 -1
  339. data/lib/decidim/command.rb +2 -1
  340. data/lib/decidim/content_processor.rb +1 -1
  341. data/lib/decidim/content_renderers/base_renderer.rb +0 -112
  342. data/lib/decidim/content_renderers/blob_renderer.rb +7 -4
  343. data/lib/decidim/content_renderers/mention_resource_renderer.rb +6 -10
  344. data/lib/decidim/content_renderers/resource_renderer.rb +7 -16
  345. data/lib/decidim/content_renderers/user_renderer.rb +9 -11
  346. data/lib/decidim/core/api.rb +8 -0
  347. data/lib/decidim/core/content_blocks/registry_manager.rb +4 -10
  348. data/lib/decidim/core/engine.rb +2 -42
  349. data/lib/decidim/core/menu.rb +0 -26
  350. data/lib/decidim/core/test/factories.rb +29 -21
  351. data/lib/decidim/core/test/shared_examples/access_mode_restricted_participatory_spaces.rb +172 -0
  352. data/lib/decidim/core/test/shared_examples/access_mode_transparent_participatory_spaces.rb +241 -0
  353. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +10 -10
  354. data/lib/decidim/core/test/shared_examples/comments_examples.rb +121 -117
  355. data/lib/decidim/core/test/shared_examples/fingerprint_examples.rb +2 -0
  356. data/lib/decidim/core/test/shared_examples/has_members.rb +63 -0
  357. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +1 -1
  358. data/lib/decidim/core/test/shared_examples/map_examples.rb +1 -1
  359. data/lib/decidim/core/test/shared_examples/participant_details_examples.rb +16 -0
  360. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +10 -10
  361. data/lib/decidim/core/test/shared_examples/resource_liked_event_examples.rb +1 -1
  362. data/lib/decidim/core/test/shared_examples/resource_locator_presenter_examples.rb +7 -7
  363. data/lib/decidim/core/test/shared_examples/searchable_participatory_space_examples.rb +3 -3
  364. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +2 -2
  365. data/lib/decidim/core/test/shared_examples/simple_event.rb +1 -0
  366. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +2 -2
  367. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +1 -1
  368. data/lib/decidim/core/test.rb +2 -1
  369. data/lib/decidim/core/version.rb +1 -1
  370. data/lib/decidim/core.rb +222 -335
  371. data/lib/decidim/download_your_data_serializers/{download_your_data_participatory_space_private_user_serializer.rb → download_your_data_member_serializer.rb} +6 -6
  372. data/lib/decidim/download_your_data_serializers.rb +2 -2
  373. data/lib/decidim/engine_router.rb +31 -6
  374. data/lib/decidim/exporters/csv.rb +1 -1
  375. data/lib/decidim/filter_form_builder.rb +1 -1
  376. data/{app/controllers/concerns → lib}/decidim/form_factory.rb +11 -1
  377. data/lib/decidim/has_settings.rb +2 -2
  378. data/lib/decidim/legacy_form_builder.rb +1 -0
  379. data/lib/decidim/locale_router_detector.rb +41 -0
  380. data/lib/decidim/maintenance/import_models/scope.rb +1 -1
  381. data/lib/decidim/maintenance/import_models.rb +0 -2
  382. data/lib/decidim/map/autocomplete.rb +3 -4
  383. data/lib/decidim/map/frontend.rb +1 -1
  384. data/lib/decidim/map/geocoding.rb +2 -2
  385. data/lib/decidim/map/static_map.rb +10 -22
  386. data/lib/decidim/map/utility.rb +3 -6
  387. data/lib/decidim/map.rb +2 -2
  388. data/lib/decidim/menu.rb +1 -1
  389. data/lib/decidim/menu_item.rb +1 -0
  390. data/lib/decidim/menu_registry.rb +1 -1
  391. data/lib/decidim/moderation_tools.rb +1 -1
  392. data/lib/decidim/newsletter_encryptor.rb +5 -8
  393. data/lib/decidim/organization_settings.rb +2 -2
  394. data/lib/decidim/participable.rb +1 -0
  395. data/lib/decidim/participatory_space/has_members.rb +61 -0
  396. data/lib/decidim/participatory_space_manifest.rb +0 -4
  397. data/lib/decidim/participatory_space_resourceable.rb +10 -1
  398. data/lib/decidim/routes/locale_redirects.rb +47 -0
  399. data/lib/decidim/routes.rb +7 -0
  400. data/lib/decidim/search_resource_fields_mapper.rb +3 -4
  401. data/lib/decidim/searchable.rb +0 -5
  402. data/lib/decidim/seeds.rb +17 -0
  403. data/lib/decidim/shakapacker/runner.rb +4 -4
  404. data/lib/decidim/shakapacker/shakapacker.yml +28 -3
  405. data/lib/decidim/taxonomizable.rb +1 -1
  406. data/lib/decidim/translatable_attributes.rb +9 -3
  407. data/lib/decidim/view_model.rb +5 -1
  408. data/lib/devise/models/decidim_newsletterable.rb +1 -1
  409. data/lib/tasks/decidim_mailers_tasks.rake +9 -31
  410. data/lib/tasks/decidim_procfile.rake +1 -1
  411. data/lib/tasks/decidim_tasks.rake +0 -1
  412. data/lib/tasks/decidim_taxonomies.rake +1 -1
  413. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +0 -1
  414. data/lib/tasks/upgrade/decidim_encryption.rake +12 -0
  415. data/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake +0 -1
  416. data/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake +1 -1
  417. data/lib/tasks/upgrade/{fix_deleted_private_follows.rake → fix_deleted_members_follows.rake} +5 -5
  418. data/lib/tasks/upgrade/migrations.rake +0 -1
  419. data/lib/tasks/upgrade/user_groups_migration.rake +0 -1
  420. metadata +210 -138
  421. data/app/cells/decidim/content_blocks/global_menu/show.erb +0 -11
  422. data/app/cells/decidim/content_blocks/global_menu_cell.rb +0 -35
  423. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity/show.erb +0 -10
  424. data/app/cells/decidim/content_blocks/menu_breadcrumb_last_activity_cell.rb +0 -49
  425. data/app/cells/decidim/participatory_space_dropdown_metadata/links.erb +0 -9
  426. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +0 -1
  427. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +0 -11
  428. data/app/cells/decidim/participatory_space_dropdown_metadata_cell.rb +0 -26
  429. data/app/controllers/concerns/decidim/has_members_page.rb +0 -25
  430. data/app/controllers/decidim/private_downloads_controller.rb +0 -29
  431. data/app/jobs/decidim/newsletters_opt_in_job.rb +0 -11
  432. data/app/jobs/decidim/user_report_job.rb +0 -11
  433. data/app/mailers/decidim/delete_user_mailer.rb +0 -14
  434. data/app/models/decidim/participatory_space_private_user.rb +0 -51
  435. data/app/models/decidim/private_download.rb +0 -61
  436. data/app/packs/src/decidim/controllers/sticky_header/controller.js +0 -116
  437. data/app/packs/src/decidim/controllers/sticky_header/sticky_header.test.js +0 -320
  438. data/app/packs/src/decidim/dropdown_menu.js +0 -18
  439. data/app/packs/src/decidim/geocoding/reverse_geocoding.test.js +0 -197
  440. data/app/packs/src/decidim/identity_selector_dialog.js +0 -33
  441. data/app/packs/stylesheets/decidim/_editor_suggestions.scss +0 -49
  442. data/app/packs/stylesheets/decidim/_tom_select.scss +0 -23
  443. data/app/presenters/decidim/admin_log/participatory_space_private_user_presenter.rb +0 -38
  444. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +0 -46
  445. data/app/services/decidim/push_subscription_endpoint_validator.rb +0 -34
  446. data/app/views/decidim/delete_user_mailer/delete.html.erb +0 -6
  447. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +0 -1
  448. data/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +0 -26
  449. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +0 -34
  450. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +0 -10
  451. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_mobile.html.erb +0 -17
  452. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_top_left.html.erb +0 -2
  453. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +0 -33
  454. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +0 -25
  455. data/lib/decidim/core/test/shared_examples/has_private_users.rb +0 -63
  456. data/lib/decidim/core/test/shared_examples/participatory_space_dropdown_metadata_cell_examples.rb +0 -81
  457. data/lib/decidim/has_private_users.rb +0 -57
  458. data/lib/decidim/maintenance/import_models/assembly_type.rb +0 -49
  459. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +0 -21
  460. data/lib/decidim/query_extensions.rb +0 -64
  461. /data/app/cells/decidim/{participatory_space_private_user → member}/show.erb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1625dd1f860a4431caaae18f96ec93ee1751d8d135bde4da819eddbf4976e0d3
4
- data.tar.gz: ff6293ab292f7c3a18d663a524a099754d63c59dbc4d15e81ca7664f6fc74bff
3
+ metadata.gz: caaaf7bbddd64f7bb5d4341c6ebeab59b35dd0f69326b136d11958165e513801
4
+ data.tar.gz: e18600f3eec00c3fbf76b58e90a34bf4888a114f7dc5a9d35896540d30a7a20f
5
5
  SHA512:
6
- metadata.gz: 4403452ffb2df3d9ef2c5c1dd911321cffcfcfaa89ab1d4bf1b32542acc6a2a3e15ad6410a23538bd98cb33ec57496d58de2015022f3a1ce52f77a901d776d99
7
- data.tar.gz: c385ae7331b4c38b6a2b3a0679340e4739ee9da30535daea878690279776b68e1b5652951bc2151b06959935343a56dd0cbd0d7e066ccc97329dcf4712694862
6
+ metadata.gz: 847ec9bd0ae30f358fd5330e3bf61cd34adedca669986b5082e391473e3f66df4e7eab20bac8ad4478827fd66b2d3e94e46559ef4138cf289d5a71caf60e904b
7
+ data.tar.gz: b832cfbd8827d809a1792ff0f7a6688f2282e3f2bfc8975bf821175465333ade87ef0e2fd92bf9ac3512f54e40d31872d2f35a28424b8549de717e2f645141b3
data/README.md CHANGED
@@ -1,24 +1,14 @@
1
- # Decidim
1
+ # decidim-core
2
2
 
3
3
  Core functionality in Decidim. Every single decidim functionality depends on this gem.
4
4
 
5
5
  ## Usage
6
6
 
7
- You will be using indirectly on any decidim application.
7
+ This module will be using indirectly on any decidim application.
8
8
 
9
9
  ## Installation
10
10
 
11
- Add `decidim` to your `Gemfile` and you will be using it:
12
-
13
- ```ruby
14
- gem 'decidim'
15
- ```
16
-
17
- And then execute:
18
-
19
- ```bash
20
- bundle
21
- ```
11
+ This is on the default Decidim installation so you should not change anything to use this feature.
22
12
 
23
13
  ## Users
24
14
 
@@ -1,5 +1,5 @@
1
- <li role="presentation" class="dropdown__item">
2
- <%= action_authorized_link_to :amend, new_amend_path, resource: model, data: { "redirect_url" => new_amend_path }, id: "amend-button", class: "dropdown__button", role: "menuitem" do %>
1
+ <li role="menuitem" class="dropdown__item">
2
+ <%= action_authorized_link_to :amend, new_amend_path, resource: model, data: { "redirect_url" => new_amend_path }, id: "amend-button", class: "dropdown__button" do %>
3
3
  <span><%= t("button", scope: "decidim.amendments.amendable", model_name: nil) %></span>
4
4
  <%= icon "pencil-line" %>
5
5
  <% end %>
@@ -7,7 +7,7 @@ module Decidim
7
7
  def show
8
8
  return unless amendments_enabled? && model.amendable?
9
9
  return unless current_component.current_settings.amendment_creation_enabled
10
- return unless can_participate_in_private_space?
10
+ return unless can_participate_in_restricted_space?
11
11
 
12
12
  render
13
13
  end
@@ -31,6 +31,10 @@ module Decidim
31
31
  render unless current_user == model
32
32
  end
33
33
 
34
+ def perform_caching?
35
+ true
36
+ end
37
+
34
38
  def raw_model
35
39
  model.try(:__getobj__) || model
36
40
  end
@@ -0,0 +1,5 @@
1
+ <% form.fields_for :settings, form.object.settings do |settings_fields| %>
2
+ <div class="row column">
3
+ <%= settings_fields.translated :editor, :announcement, label:, required: true %>
4
+ </div>
5
+ <% end %>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ContentBlocks
5
+ class AnnouncementSettingsFormCell < Decidim::ViewModel
6
+ alias form model
7
+
8
+ def content_block
9
+ options[:content_block]
10
+ end
11
+
12
+ def label
13
+ I18n.t("decidim.content_blocks.announcement.body")
14
+ end
15
+ end
16
+ end
17
+ end
@@ -4,6 +4,6 @@
4
4
  <%= settings_fields.translated :text_field, :description, label: t("decidim.content_blocks.cta_settings_form.description") %>
5
5
  <% end %>
6
6
 
7
- <% form.fields_for :images, content_block.images_container do |images_fields| %>
7
+ <% form.fields_for :images, form.object.images do |images_fields| %>
8
8
  <%= images_fields.upload :background_image, label: t("decidim.content_blocks.cta_settings_form.background_image") %>
9
9
  <% end %>
@@ -5,7 +5,7 @@
5
5
 
6
6
  <div class="row column" data-controller="slug">
7
7
  <%= settings_fields.translated :text_field, :cta_button_path, label: t(".cta_button_path") %>
8
- <p class="help-text"><%= t(".cta_button_path_help", url: decidim_form_slug_url("", translated_attribute(form.object.settings["cta_button_path"]))) %></p>
8
+ <p class="help-text"><%= t(".cta_button_path_help", url: decidim_form_slug_url("", translated_attribute(form.object.settings.cta_button_path))) %></p>
9
9
  </div>
10
10
 
11
11
  <div class="row column">
@@ -14,7 +14,7 @@
14
14
  </div>
15
15
  <% end %>
16
16
 
17
- <% form.fields_for :images, content_block.images_container do |images_fields| %>
17
+ <% form.fields_for :images, form.object.images do |images_fields| %>
18
18
  <div class="row column">
19
19
  <%= images_fields.upload :background_image, label: t(".background_image"), button_class: "button button__sm button__transparent-secondary" %>
20
20
  </div>
@@ -32,7 +32,7 @@ module Decidim
32
32
  private
33
33
 
34
34
  def render?
35
- required_keys = [:title, :action_button_title, :action_button_subtitle, :action_button_url]
35
+ required_keys = [:title, :short_description, :action_button_title, :action_button_subtitle, :action_button_url]
36
36
  required_keys.all? { |key| model.settings.public_send(key).present? }
37
37
  end
38
38
  end
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <% end %>
22
22
 
23
- <% form.fields_for :images, content_block.images_container do |images_fields| %>
23
+ <% form.fields_for :images, form.object.images do |images_fields| %>
24
24
  <div class="row column">
25
25
  <%= images_fields.upload :background_image, label: t(".background_image"), button_class: "button button__sm button__transparent-secondary" %>
26
26
  </div>
@@ -28,7 +28,7 @@ module Decidim
28
28
  private
29
29
 
30
30
  def cache_hash
31
- [I18n.locale, model.cache_key_with_version, highlighted_spaces.map(&:cache_key_with_version)].join(Decidim.cache_key_separator)
31
+ [I18n.locale, highlighted_spaces.map(&:cache_key_with_version)].join(Decidim.cache_key_separator)
32
32
  end
33
33
 
34
34
  def section_class
@@ -37,7 +37,7 @@
37
37
  </div>
38
38
  </div>
39
39
  </div>
40
- <%= link_to decidim.pages_path, class: "button button__sm md:button__lg button__secondary mt-6" do %>
40
+ <%= link_to decidim.pages_path(), class: "button button__sm md:button__lg button__secondary mt-6" do %>
41
41
  <%= t("more_info", scope: "decidim.pages.home.extended", resource_name: current_organization_name) %>
42
42
  <%= icon "arrow-right-line", class: "fill-current" %>
43
43
  <% end %>
@@ -8,7 +8,7 @@ module Decidim
8
8
  end
9
9
 
10
10
  def html_content
11
- decidim_sanitize_editor_admin(translated_attribute(model.settings.html_content))
11
+ translated_attribute(model.settings.html_content).html_safe
12
12
  end
13
13
  end
14
14
  end
@@ -3,8 +3,6 @@
3
3
  module Decidim
4
4
  module ContentBlocks
5
5
  class ParticipatorySpaceAnnouncementCell < BaseCell
6
- delegate :announcement, to: :resource
7
-
8
6
  def show
9
7
  return if announcement_cell.blank_content?
10
8
 
@@ -12,7 +10,7 @@ module Decidim
12
10
  end
13
11
 
14
12
  def announcement_cell
15
- @announcement_cell ||= cell("decidim/announcement", announcement)
13
+ @announcement_cell ||= cell("decidim/announcement", model.settings.announcement)
16
14
  end
17
15
  end
18
16
  end
@@ -27,12 +27,8 @@ module Decidim
27
27
  decidim_escape_translated(resource.subtitle)
28
28
  end
29
29
 
30
- # If it is called from the landing page content block, use the background image defined there
31
- # Else, use the banner image defined in the space (for assemblies)
32
30
  def image_path
33
- return model.images_container.attached_uploader(:background_image).url if model.respond_to?(:images_container)
34
-
35
- attached_uploader(:banner_image).url
31
+ model.images_container.attached_uploader(:background_image).url
36
32
  end
37
33
 
38
34
  def has_cta?
@@ -8,7 +8,7 @@
8
8
  </div>
9
9
  <% end %>
10
10
 
11
- <% form.fields_for :images, content_block.images_container do |images_fields| %>
11
+ <% form.fields_for :images, form.object.images do |images_fields| %>
12
12
  <div class="row column">
13
13
  <%= images_fields.upload :background_image, label: t("decidim.content_blocks.cta_settings_form.background_image"), button_class: "button button__sm button__transparent-secondary" %>
14
14
  </div>
@@ -5,7 +5,7 @@ module Decidim
5
5
  module StaticPage
6
6
  class SectionCell < Decidim::ViewModel
7
7
  def content
8
- decidim_sanitize_editor_admin(translated_attribute(model.settings.content))
8
+ translated_attribute(model.settings.content).html_safe
9
9
  end
10
10
  end
11
11
  end
@@ -1,5 +1,3 @@
1
1
  <% form.fields_for :settings, form.object.settings do |settings_fields| %>
2
- <div class="row column">
3
- <%= settings_fields.translated :editor, :content, label: %>
4
- </div>
2
+ <%= settings_fields.translated :editor, :content, label: %>
5
3
  <% end %>
@@ -5,7 +5,7 @@ module Decidim
5
5
  module StaticPage
6
6
  class SummaryCell < Decidim::ViewModel
7
7
  def content
8
- decidim_sanitize_editor_admin(translated_attribute(model.settings.summary))
8
+ translated_attribute(model.settings.summary).html_safe
9
9
  end
10
10
  end
11
11
  end
@@ -1,5 +1,3 @@
1
1
  <% form.fields_for :settings, form.object.settings do |settings_fields| %>
2
- <div class="row column">
3
- <%= settings_fields.translated :editor, :summary, label: %>
4
- </div>
2
+ <%= settings_fields.translated :editor, :summary, label: %>
5
3
  <% end %>
@@ -5,11 +5,11 @@ module Decidim
5
5
  module StaticPage
6
6
  class TwoPaneSectionCell < Decidim::ViewModel
7
7
  def left_column
8
- decidim_sanitize_editor_admin(translated_attribute(model.settings.left_column))
8
+ translated_attribute(model.settings.left_column).html_safe
9
9
  end
10
10
 
11
11
  def right_column
12
- decidim_sanitize_editor_admin(translated_attribute(model.settings.right_column))
12
+ translated_attribute(model.settings.right_column).html_safe
13
13
  end
14
14
  end
15
15
  end
@@ -1,6 +1,4 @@
1
1
  <% form.fields_for :settings, form.object.settings do |settings_fields| %>
2
- <div class="row column">
3
- <%= settings_fields.translated :editor, :left_column, label: label_left_column %>
4
- <%= settings_fields.translated :editor, :right_column, label: label_right_column %>
5
- </div>
2
+ <%= settings_fields.translated :editor, :left_column, label: label_left_column %>
3
+ <%= settings_fields.translated :editor, :right_column, label: label_right_column %>
6
4
  <% end %>
@@ -13,12 +13,12 @@
13
13
  <%= icon "close-line", class: "cookies__category-toggle-icon" %>
14
14
  </label>
15
15
 
16
- <h3 id="accordion-title-<%= category[:slug] %>" class="cookies__category-trigger-title">
17
- <%= category[:title] %>
18
- </h3>
19
-
20
16
  <div id="accordion-trigger-<%= category[:slug] %>" role="group" data-controls="accordion-panel-<%= category[:slug] %>" aria-labelledby="accordion-title-<%= category[:slug] %>">
21
- <span aria-hidden="true">
17
+ <h3 id="accordion-title-<%= category[:slug] %>" class="cookies__category-trigger-title">
18
+ <%= category[:title] %>
19
+ </h3>
20
+
21
+ <span>
22
22
  <%= icon "arrow-down-s-line", class: "cookies__category-trigger-arrow" %>
23
23
  <%= icon "arrow-up-s-line", class: "cookies__category-trigger-arrow" %>
24
24
  </span>
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  # This cell renders the card for an instance of an Assembly member
5
- class ParticipatorySpacePrivateUserCell < Decidim::ViewModel
5
+ class MemberCell < Decidim::ViewModel
6
6
  property :name
7
7
  property :role
8
8
  property :nickname
@@ -8,6 +8,7 @@ module Decidim
8
8
  #
9
9
  class OnboardingActionMessageCell < Decidim::ViewModel
10
10
  include ActiveLinkTo
11
+ include Decidim::ActiveLinkToHelper
11
12
 
12
13
  alias user model
13
14
 
@@ -20,4 +20,4 @@
20
20
  </div>
21
21
  </div>
22
22
  <p class="profile__description"><%= description %></p>
23
- <%= render_hook(:user_profile_bottom) %>
23
+ <%= cell "decidim/profile_member_of", model %>
@@ -7,6 +7,7 @@ module Decidim
7
7
  include Decidim::AriaSelectedLinkToHelper
8
8
  include Decidim::ViewHooksHelper
9
9
  include ActiveLinkTo
10
+ include Decidim::ActiveLinkToHelper
10
11
 
11
12
  delegate :current_organization, :current_user, to: :controller
12
13
  delegate :avatar_url, :nickname, :personal_url, :followers_count, :users_followings, :officialized_as, to: :presented_profile
@@ -0,0 +1,13 @@
1
+ <div class="profile__description">
2
+ <div class="font-semibold"><%= t("member_of", scope: "decidim.participatory_space.pages.user_profile.member_of") %></div>
3
+ <% shown = false %>
4
+ <% sorted_types.each do |type| %>
5
+ <% spaces = grouped_members[type].map(&:participatory_space).sort_by { |s| translated_attribute(s.title) } %>
6
+ <% spaces.each do |space| %>
7
+ <%= "&nbsp;&#183;&nbsp;".html_safe if shown %>
8
+ <% path = Decidim::EngineRouter.main_proxy(space).public_send("#{type.demodulize.underscore}_path", space) %>
9
+ <%= link_to decidim_escape_translated(space.title), path, class: "hover:underline" %>
10
+ <% shown = true %>
11
+ <% end %>
12
+ <% end %>
13
+ </div>
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class ProfileMemberOfCell < Decidim::ViewModel
5
+ include Decidim::Core::Engine.routes.url_helpers
6
+
7
+ def members
8
+ @members ||= Decidim::ParticipatorySpace::Member.where(user:)
9
+ .includes(:participatory_space)
10
+ .published
11
+ .select { |m| m.participatory_space.present? && m.participatory_space.published? }
12
+ .sort_by { |m| translated_attribute(m.participatory_space.title) }
13
+ end
14
+
15
+ def show
16
+ return unless members.any?
17
+
18
+ render
19
+ end
20
+
21
+ private
22
+
23
+ def user
24
+ model
25
+ end
26
+
27
+ def grouped_members
28
+ @grouped_members ||= members.group_by(&:participatory_space_type)
29
+ end
30
+
31
+ def sorted_types
32
+ @sorted_types ||= grouped_members.keys.sort_by { |k| k.split("::").last.downcase }
33
+ end
34
+ end
35
+ end
@@ -10,8 +10,8 @@
10
10
  </button>
11
11
  <ul id="dropdown-menu-resource">
12
12
  <% resource_types.each do |resource_type| %>
13
- <li role="presentation">
14
- <%= link_to filter_url(resource_type[0]), class: "filter#{" is-active" if filter_param == resource_type[0]}", role: "menuitem" do %>
13
+ <li role="menuitem">
14
+ <%= link_to filter_url(resource_type[0]), class: "filter#{" is-active" if filter_param == resource_type[0]}" do %>
15
15
  <span class="sr-only"><%= resource_type[1] %></span>
16
16
  <%= text_with_resource_icon(*resource_type) %>
17
17
  <% end %>
@@ -25,7 +25,7 @@ module Decidim
25
25
  @taxonomies ||= model.taxonomies.map do |taxonomy|
26
26
  {
27
27
  name: decidim_sanitize_translated(taxonomy.name),
28
- url: resource_locator(model).index(filter: { "with_any_taxonomies[#{taxonomy.root_taxonomy.id}]" => [taxonomy.id.to_s] })
28
+ url: resource_locator(model).index(filter: { "with_any_taxonomies" => { taxonomy.root_taxonomy.id => [taxonomy.id.to_s] } })
29
29
  }
30
30
  end
31
31
  end
@@ -177,11 +177,6 @@ module Decidim
177
177
 
178
178
  def file_attachment_path(attachment)
179
179
  return unless attachment
180
-
181
- if attachment.respond_to?(:record) && attachment.record.is_a?(Decidim::Authorization) && attachment.name.to_s == "verification_attachment"
182
- return decidim.private_download_path(Decidim::PrivateDownload.for(attachment.record, attachment_name: attachment.name).token)
183
- end
184
-
185
180
  return Rails.application.routes.url_helpers.rails_blob_url(attachment, only_path: true) if attachment.is_a? ActiveStorage::Blob
186
181
 
187
182
  if attachment.try(:attached?)
@@ -1,3 +1,28 @@
1
1
  <% reverse_ordered_versions.each_with_index do |version, index| %>
2
2
  <%= cell("decidim/versions_list_item", version, index:, versioned_resource:, version_path:, i18n_scope:, total:) %>
3
3
  <% end %>
4
+
5
+ <% if versioned_resource.class.include?(Decidim::Fingerprintable) %>
6
+ <% fingerprint_id = dom_id(versioned_resource, :fingerprint_dialog) %>
7
+ <section class="mt-4 ml-2">
8
+ <%= content_tag :button, t("decidim.fingerprint.check"), class: "button button__lg button__text-secondary font-normal text-sm underline", data: { dialog_open: fingerprint_id } %>
9
+ </section>
10
+ <%= decidim_modal id: fingerprint_id, class: "fingerprint-modal" do %>
11
+ <div data-dialog-container>
12
+ <%= icon "fingerprint-line" %>
13
+ <h2 id="dialog-title-<%= fingerprint_id %>" tabindex="-1" data-dialog-title><%= t "decidim.fingerprint.title" %></h2>
14
+ <div class="fingerprint-modal__container">
15
+ <p id="dialog-desc-<%= fingerprint_id %>"><%= t "decidim.fingerprint.explanation" %></p>
16
+ <div>
17
+ <span class="fingerprint-modal__span"><%= t "decidim.fingerprint.value" %>:</span>
18
+ <code class="fingerprint-modal__code"><%= decidim_html_escape versioned_resource.fingerprint.value %></code>
19
+ </div>
20
+ <div>
21
+ <span class="fingerprint-modal__span"><%= t "decidim.fingerprint.source" %>:</span>
22
+ <code class="fingerprint-modal__code"><%= decidim_html_escape versioned_resource.fingerprint.source %></code>
23
+ </div>
24
+ <p><%= t("decidim.fingerprint.replicate_help", online_calculator_link: link_to(t("decidim.fingerprint.online_calculator_name"), "https://www.md5calc.com/sha256", target: "_blank", rel: "noopener")).html_safe %></p>
25
+ </div>
26
+ </div>
27
+ <% end %>
28
+ <% end %>
@@ -20,6 +20,7 @@ module Decidim
20
20
  # Returns nothing.
21
21
  def call
22
22
  return broadcast(:invalid) if form.invalid?
23
+ return broadcast(:invalid) unless current_user.is_a?(Decidim::User)
23
24
 
24
25
  create_follow!
25
26
  increment_score
@@ -32,13 +33,10 @@ module Decidim
32
33
  attr_reader :follow, :form
33
34
 
34
35
  def create_follow!
35
- @follow = Follow.find_by(
36
+ @follow = Follow.where(
36
37
  followable: form.followable,
37
38
  user: current_user
38
- ) || Follow.create!(
39
- followable: form.followable,
40
- user: current_user
41
- )
39
+ ).first_or_create!
42
40
  end
43
41
 
44
42
  def increment_score
@@ -58,7 +58,7 @@ module Decidim
58
58
  current_user.organization.admins.each do |admin|
59
59
  next unless admin.email_on_moderations
60
60
 
61
- Decidim::UserReportJob.perform_later(admin, report)
61
+ UserReportMailer.notify(admin, report).deliver_later
62
62
  end
63
63
  end
64
64
 
@@ -15,7 +15,7 @@ module Decidim
15
15
  def call
16
16
  return broadcast(:invalid) unless @form.valid?
17
17
 
18
- with_events(with_transaction: true) do
18
+ Decidim::User.transaction do
19
19
  destroy_user_account!
20
20
  destroy_user_identities
21
21
  destroy_follows
@@ -28,7 +28,7 @@ module Decidim
28
28
  destroy_user_badges
29
29
  destroy_user_likes
30
30
  destroy_user_reports
31
- destroy_participatory_space_private_user
31
+ destroy_member
32
32
  delegate_destroy_to_participatory_spaces
33
33
  end
34
34
 
@@ -101,8 +101,8 @@ module Decidim
101
101
  Decidim::Follow.where(user: current_user).find_each(&:destroy)
102
102
  end
103
103
 
104
- def destroy_participatory_space_private_user
105
- Decidim::ParticipatorySpacePrivateUser.where(user: current_user).find_each(&:destroy)
104
+ def destroy_member
105
+ Decidim::ParticipatorySpace::Member.where(user: current_user).find_each(&:destroy)
106
106
  end
107
107
 
108
108
  def delegate_destroy_to_participatory_spaces
@@ -110,16 +110,5 @@ module Decidim
110
110
  space_manifest.invoke_on_destroy_account(current_user)
111
111
  end
112
112
  end
113
-
114
- # We use memoization in this particular email, as we want to have the data available before the actual anonymization
115
- def event_arguments
116
- @event_arguments ||= {
117
- user_id: current_user.id,
118
- user_email: current_user.email,
119
- user_name: current_user.name,
120
- locale: current_user.locale,
121
- organization: current_user.organization
122
- }
123
- end
124
113
  end
125
114
  end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A module with all the gallery common methods
5
+ # Allows to create several image attachments at once
6
+ module GalleryMethods
7
+ private
8
+
9
+ def build_gallery(attached_to = nil)
10
+ @gallery = []
11
+ @form.add_photos.compact_blank.each do |photo|
12
+ if photo.is_a?(Hash) && photo.has_key?(:id)
13
+ update_attachment_title_for(photo)
14
+ next
15
+ end
16
+
17
+ @gallery << Attachment.new(
18
+ title: photos_title(photo),
19
+ attached_to: attached_to || gallery_attached_to,
20
+ file: photos_signed_id(photo), # Define attached_to before this
21
+ content_type: photos_content_type(photo)
22
+ )
23
+ end
24
+ end
25
+
26
+ def update_attachment_title_for(photo)
27
+ Decidim::Attachment.find(photo[:id]).update(title: photos_title(photo))
28
+ end
29
+
30
+ def image?(signed_id)
31
+ blob(signed_id).content_type.start_with? "image"
32
+ end
33
+
34
+ def gallery_invalid?
35
+ @gallery.each do |photo|
36
+ if photo.invalid? && photo.errors.has_key?(:file)
37
+ @form.errors.add(:add_photos, photo.errors[:file])
38
+ return true
39
+ end
40
+ end
41
+ false
42
+ end
43
+
44
+ def create_gallery(first_weight: 0)
45
+ weight = first_weight
46
+ # Add the weights first to the old photos
47
+ @form.photos.each do |photo|
48
+ photo.update!(weight:)
49
+ weight += 1
50
+ end
51
+ @gallery.map! do |photo|
52
+ photo.weight = weight
53
+ photo.attached_to = gallery_attached_to
54
+ photo.save!
55
+ weight += 1
56
+ @form.photos << photo
57
+ end
58
+ end
59
+
60
+ def photo_cleanup!
61
+ gallery_attached_to.photos.each do |photo|
62
+ next unless @form.photos.map(&:id).exclude?(photo.id)
63
+
64
+ photo.destroy! if (@form.respond_to?(:documents) && @form.documents.map(&:id).exclude?(photo.id)) || !@form.respond_to?(:documents)
65
+ end
66
+ # manually reset cached photos
67
+ gallery_attached_to.reload
68
+ gallery_attached_to.instance_variable_set(:@photos, nil)
69
+ end
70
+
71
+ # maybe a custom settings options would be nice
72
+ def gallery_allowed?
73
+ true
74
+ end
75
+
76
+ def process_gallery?
77
+ gallery_allowed? && @form.add_photos.any?
78
+ end
79
+
80
+ def gallery_attached_to
81
+ return @attached_to if @attached_to.present?
82
+ return form.current_organization if form.respond_to?(:current_organization)
83
+
84
+ form.current_component.organization if form.respond_to?(:current_component)
85
+ end
86
+
87
+ def photos_signed_id(photo)
88
+ return photo[:file] if photo.is_a?(Hash)
89
+
90
+ photo
91
+ end
92
+
93
+ def photos_title(photo)
94
+ return { I18n.locale => photo[:title] } if photo.is_a?(Hash) && photo.has_key?(:title)
95
+
96
+ { I18n.locale => "" }
97
+ end
98
+
99
+ def photos_content_type(photo)
100
+ blob(photos_signed_id(photo)).content_type
101
+ end
102
+
103
+ def blob(signed_id)
104
+ ActiveStorage::Blob.find_signed(signed_id)
105
+ end
106
+ end
107
+ end