decidim-core 0.29.2 → 0.30.0.rc2

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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  3. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  4. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  5. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  6. data/app/cells/decidim/author_cell.rb +1 -1
  7. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  8. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  9. data/app/cells/decidim/comments_button_cell.rb +14 -2
  10. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  11. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  12. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  13. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  14. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  15. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  16. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  17. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  18. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  19. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  20. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  21. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  22. data/app/cells/decidim/follow_button/show.erb +1 -2
  23. data/app/cells/decidim/follow_button_cell.rb +5 -0
  24. data/app/cells/decidim/map/show.erb +3 -0
  25. data/app/cells/decidim/map/template.erb +14 -0
  26. data/app/cells/decidim/map_cell.rb +39 -0
  27. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  28. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  29. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  30. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  31. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  32. data/app/cells/decidim/progress_bar/show.erb +2 -2
  33. data/app/cells/decidim/report_button_cell.rb +1 -0
  34. data/app/cells/decidim/resource_history/show.erb +20 -0
  35. data/app/cells/decidim/resource_history_cell.rb +66 -0
  36. data/app/cells/decidim/share_button_cell.rb +0 -4
  37. data/app/cells/decidim/share_widget/modal.erb +26 -0
  38. data/app/cells/decidim/share_widget/show.erb +2 -0
  39. data/app/cells/decidim/share_widget_cell.rb +20 -0
  40. data/app/cells/decidim/tags/show.erb +7 -4
  41. data/app/cells/decidim/tags_cell.rb +11 -72
  42. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  43. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  44. data/app/commands/decidim/create_omniauth_registration.rb +13 -3
  45. data/app/commands/decidim/create_report.rb +1 -5
  46. data/app/commands/decidim/create_user_group.rb +6 -2
  47. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  48. data/app/commands/decidim/update_account.rb +11 -3
  49. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  50. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  51. data/app/commands/decidim/update_user_group.rb +7 -1
  52. data/app/constraints/decidim/current_component.rb +1 -1
  53. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  54. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  55. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  56. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  57. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  58. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  59. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  60. data/app/controllers/concerns/decidim/headers/browser_feature_permissions.rb +50 -0
  61. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  62. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  63. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  64. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  65. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  66. data/app/controllers/decidim/application_controller.rb +10 -0
  67. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  68. data/app/controllers/decidim/components/base_controller.rb +3 -7
  69. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  70. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  71. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  72. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  73. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  74. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  75. data/app/controllers/decidim/follows_controller.rb +1 -1
  76. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  77. data/app/controllers/decidim/homepage_controller.rb +0 -1
  78. data/app/controllers/decidim/open_data_controller.rb +33 -8
  79. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  80. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  81. data/app/forms/decidim/amendable/form.rb +4 -2
  82. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  83. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  84. data/app/forms/decidim/omniauth_registration_form.rb +14 -1
  85. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  86. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  87. data/app/helpers/decidim/amendments_helper.rb +0 -9
  88. data/app/helpers/decidim/application_helper.rb +6 -2
  89. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  90. data/app/helpers/decidim/cache_helper.rb +1 -1
  91. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  92. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  93. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  94. data/app/helpers/decidim/layout_helper.rb +6 -0
  95. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  96. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  97. data/app/helpers/decidim/modal_helper.rb +23 -0
  98. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  99. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  100. data/app/helpers/decidim/orders_helper.rb +2 -1
  101. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  102. data/app/helpers/decidim/passwords_helper.rb +2 -2
  103. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  104. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  105. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  106. data/app/jobs/decidim/export_job.rb +5 -1
  107. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  108. data/app/jobs/decidim/hide_child_resources_job.rb +24 -0
  109. data/app/jobs/decidim/open_data_job.rb +4 -4
  110. data/app/mailers/decidim/export_mailer.rb +7 -12
  111. data/app/models/decidim/action_log.rb +11 -0
  112. data/app/models/decidim/category.rb +4 -0
  113. data/app/models/decidim/component.rb +25 -3
  114. data/app/models/decidim/metric.rb +2 -1
  115. data/app/models/decidim/moderation.rb +16 -0
  116. data/app/models/decidim/newsletter.rb +12 -8
  117. data/app/models/decidim/organization.rb +7 -3
  118. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  119. data/app/models/decidim/private_export.rb +24 -0
  120. data/app/models/decidim/push_notification_message.rb +1 -1
  121. data/app/models/decidim/report.rb +1 -1
  122. data/app/models/decidim/scope.rb +4 -0
  123. data/app/models/decidim/share_token.rb +36 -10
  124. data/app/models/decidim/taxonomization.rb +23 -0
  125. data/app/models/decidim/taxonomy.rb +139 -0
  126. data/app/models/decidim/taxonomy_filter.rb +130 -0
  127. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  128. data/app/models/decidim/user.rb +9 -23
  129. data/app/models/decidim/user_base_entity.rb +12 -0
  130. data/app/models/decidim/user_moderation.rb +9 -0
  131. data/app/models/decidim/user_report.rb +4 -0
  132. data/app/packs/entrypoints/decidim_core.js +1 -0
  133. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  134. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  135. data/app/packs/images/decidim/brands/google.svg +7 -1
  136. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  137. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  138. data/app/packs/src/decidim/clipboard.js +18 -9
  139. data/app/packs/src/decidim/confirm.js +79 -59
  140. data/app/packs/src/decidim/decidim_application.js +1 -0
  141. data/app/packs/src/decidim/form_remote.js +1 -1
  142. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  143. data/app/packs/src/decidim/impersonation.js +1 -1
  144. data/app/packs/src/decidim/index.js +11 -1
  145. data/app/packs/src/decidim/map/provider/here.js +1 -1
  146. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  147. data/app/packs/src/decidim/session_timeouter.js +1 -1
  148. data/app/packs/src/decidim/sticky_footer.js +29 -0
  149. data/app/packs/src/decidim/sticky_header.js +6 -31
  150. data/app/packs/src/decidim/user_registrations.js +13 -0
  151. data/app/packs/src/decidim/utilities/dom.js +148 -0
  152. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  153. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  154. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  155. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  156. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  157. data/app/packs/stylesheets/decidim/_hashtags.scss +5 -0
  158. data/app/packs/stylesheets/decidim/_header.scss +5 -3
  159. data/app/packs/stylesheets/decidim/_layout.scss +32 -2
  160. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  161. data/app/packs/stylesheets/decidim/_modal.scss +42 -0
  162. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  163. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  164. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  165. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  166. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  167. data/app/packs/stylesheets/decidim/application.scss +2 -0
  168. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  169. data/app/packs/stylesheets/decidim/map.scss +7 -10
  170. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  171. data/app/permissions/decidim/permissions.rb +8 -2
  172. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  173. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  174. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  175. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  176. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  177. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  178. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  179. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  180. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  181. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  182. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  183. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  184. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  185. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  186. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  187. data/app/queries/decidim/public_activities.rb +1 -12
  188. data/app/queries/decidim/stats_users_count.rb +2 -2
  189. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  190. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  191. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  192. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  193. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  194. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  195. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  196. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  197. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  198. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  199. data/app/services/decidim/action_authorizer.rb +32 -3
  200. data/app/services/decidim/base_diff_renderer.rb +1 -1
  201. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  202. data/app/services/decidim/onboarding_manager.rb +272 -0
  203. data/app/services/decidim/open_data_exporter.rb +139 -13
  204. data/app/services/decidim/traceability.rb +13 -0
  205. data/app/uploaders/decidim/application_uploader.rb +1 -1
  206. data/app/validators/etiquette_validator.rb +9 -2
  207. data/app/validators/passthru_validator.rb +1 -1
  208. data/app/validators/translated_etiquette_validator.rb +32 -0
  209. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  210. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  211. data/app/views/decidim/application/_collection.html.erb +30 -18
  212. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  213. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  214. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  215. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  216. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  217. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  218. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  219. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  220. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  221. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  222. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  223. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  224. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  225. data/app/views/decidim/open_data/index.html.erb +108 -0
  226. data/app/views/decidim/pages/show.html.erb +2 -1
  227. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  228. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  229. data/app/views/decidim/shared/_orders.html.erb +2 -2
  230. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  231. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  232. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  233. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  234. data/app/views/layouts/decidim/_application.html.erb +0 -1
  235. data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
  236. data/app/views/layouts/decidim/_logo.html.erb +1 -1
  237. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  238. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  239. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  240. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  241. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  242. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  243. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  244. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  245. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  246. data/config/assets.rb +2 -1
  247. data/config/locales/ar.yml +27 -59
  248. data/config/locales/bg.yml +3 -64
  249. data/config/locales/ca.yml +370 -61
  250. data/config/locales/cs.yml +371 -54
  251. data/config/locales/de.yml +365 -54
  252. data/config/locales/el.yml +1 -48
  253. data/config/locales/en.yml +363 -54
  254. data/config/locales/eo.yml +0 -2
  255. data/config/locales/es-MX.yml +363 -57
  256. data/config/locales/es-PY.yml +363 -57
  257. data/config/locales/es.yml +367 -58
  258. data/config/locales/eu.yml +373 -65
  259. data/config/locales/fi-plain.yml +365 -57
  260. data/config/locales/fi.yml +370 -59
  261. data/config/locales/fr-CA.yml +178 -54
  262. data/config/locales/fr.yml +179 -52
  263. data/config/locales/ga-IE.yml +0 -21
  264. data/config/locales/gl.yml +1 -34
  265. data/config/locales/hu.yml +1 -53
  266. data/config/locales/id-ID.yml +1 -34
  267. data/config/locales/is-IS.yml +0 -16
  268. data/config/locales/it.yml +5 -60
  269. data/config/locales/ja.yml +215 -56
  270. data/config/locales/lb.yml +1 -52
  271. data/config/locales/lt.yml +1 -59
  272. data/config/locales/lv.yml +1 -40
  273. data/config/locales/nl.yml +1 -53
  274. data/config/locales/no.yml +2 -52
  275. data/config/locales/pl.yml +4 -66
  276. data/config/locales/pt-BR.yml +11 -52
  277. data/config/locales/pt.yml +2 -52
  278. data/config/locales/ro-RO.yml +219 -117
  279. data/config/locales/ru.yml +0 -20
  280. data/config/locales/sk.yml +1 -41
  281. data/config/locales/sv.yml +138 -59
  282. data/config/locales/tr-TR.yml +1 -50
  283. data/config/locales/uk.yml +0 -18
  284. data/config/locales/zh-CN.yml +1 -50
  285. data/config/locales/zh-TW.yml +1 -54
  286. data/config/routes.rb +4 -10
  287. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  288. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  289. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  290. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  291. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  292. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  293. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  294. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  295. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  296. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  297. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  298. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  299. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  300. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  301. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  302. data/decidim-core.gemspec +14 -17
  303. data/lib/decidim/action_authorization.rb +3 -2
  304. data/lib/decidim/amendable.rb +1 -1
  305. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  306. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  307. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  308. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  309. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  310. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  311. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  312. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  313. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  314. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  315. data/lib/decidim/api/types/amendment_type.rb +5 -7
  316. data/lib/decidim/api/types/area_api_type.rb +3 -3
  317. data/lib/decidim/api/types/attachment_type.rb +3 -3
  318. data/lib/decidim/api/types/category_type.rb +2 -2
  319. data/lib/decidim/api/types/decidim_type.rb +5 -1
  320. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  321. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  322. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  323. data/lib/decidim/api/types/metric_type.rb +1 -1
  324. data/lib/decidim/api/types/organization_type.rb +5 -0
  325. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  326. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  327. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  328. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  329. data/lib/decidim/api/types/session_type.rb +1 -2
  330. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  331. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  332. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  333. data/lib/decidim/api/types/user_group_type.rb +7 -20
  334. data/lib/decidim/api/types/user_type.rb +7 -20
  335. data/lib/decidim/asset_router/storage.rb +4 -4
  336. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +2 -1
  337. data/lib/decidim/attachment_attributes.rb +1 -1
  338. data/lib/decidim/attribute_encryptor.rb +1 -1
  339. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  340. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  341. data/lib/decidim/attributes.rb +2 -0
  342. data/lib/decidim/authorization_form_builder.rb +0 -7
  343. data/lib/decidim/coauthorable.rb +1 -1
  344. data/lib/decidim/command.rb +3 -3
  345. data/lib/decidim/commands/destroy_resource.rb +5 -1
  346. data/lib/decidim/commands/resource_handler.rb +2 -2
  347. data/lib/decidim/commands/restore_resource.rb +45 -0
  348. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  349. data/lib/decidim/component_manifest.rb +7 -0
  350. data/lib/decidim/core/api.rb +2 -0
  351. data/lib/decidim/core/engine.rb +21 -7
  352. data/lib/decidim/core/menu.rb +0 -5
  353. data/lib/decidim/core/seeds.rb +42 -2
  354. data/lib/decidim/core/test/factories.rb +105 -2
  355. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  356. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  357. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  358. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  359. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  360. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  361. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  362. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  363. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  364. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  365. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  366. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  367. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  368. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  369. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  370. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  371. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  372. data/lib/decidim/core/test/shared_examples/reports_examples.rb +60 -5
  373. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  374. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  375. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  376. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  377. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +46 -0
  378. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  379. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  380. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  381. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  382. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  383. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  384. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -2
  385. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  386. data/lib/decidim/core/test.rb +9 -5
  387. data/lib/decidim/core/version.rb +1 -1
  388. data/lib/decidim/core.rb +58 -0
  389. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  390. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  391. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  392. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  393. data/lib/decidim/download_your_data_serializers.rb +19 -0
  394. data/lib/decidim/exporters/csv.rb +6 -0
  395. data/lib/decidim/exporters/export_manifest.rb +14 -0
  396. data/lib/decidim/exporters/pdf.rb +26 -22
  397. data/lib/decidim/filter_form_builder.rb +12 -15
  398. data/lib/decidim/form_builder.rb +6 -129
  399. data/lib/decidim/has_category.rb +5 -1
  400. data/lib/decidim/has_private_users.rb +4 -0
  401. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  402. data/lib/decidim/has_upload_validations.rb +1 -1
  403. data/lib/decidim/legacy_form_builder.rb +118 -0
  404. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  405. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  406. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  407. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  408. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  409. data/lib/decidim/maintenance/import_models/category.rb +139 -0
  410. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  411. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  412. data/lib/decidim/maintenance/import_models.rb +19 -0
  413. data/lib/decidim/maintenance/taxonomy_importer.rb +142 -0
  414. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  415. data/lib/decidim/maintenance.rb +12 -0
  416. data/lib/decidim/map/autocomplete.rb +52 -8
  417. data/lib/decidim/map/dynamic_map.rb +1 -1
  418. data/lib/decidim/map/provider/dynamic_map/here.rb +1 -40
  419. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  420. data/lib/decidim/map.rb +3 -6
  421. data/lib/decidim/moderation_tools.rb +29 -5
  422. data/lib/decidim/newsletter_encryptor.rb +1 -1
  423. data/lib/decidim/paddable.rb +1 -1
  424. data/lib/decidim/participable.rb +10 -10
  425. data/lib/decidim/participatory_space_user.rb +10 -0
  426. data/lib/decidim/private_download_helper.rb +15 -0
  427. data/lib/decidim/record_encryptor.rb +51 -46
  428. data/lib/decidim/resourceable.rb +16 -0
  429. data/lib/decidim/seeds.rb +18 -20
  430. data/lib/decidim/settings_manifest.rb +34 -1
  431. data/lib/decidim/soft_deletable.rb +17 -0
  432. data/lib/decidim/taxonomizable.rb +72 -0
  433. data/lib/decidim/view_model.rb +0 -1
  434. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  435. data/lib/tasks/decidim_procfile.rake +6 -0
  436. data/lib/tasks/decidim_tasks.rake +1 -0
  437. data/lib/tasks/decidim_taxonomies.rake +160 -0
  438. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  439. data/lib/tasks/upgrade/clean_hidden_resources.rake +33 -0
  440. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  441. data/lib/tasks/upgrade/migrations.rake +94 -0
  442. metadata +198 -103
  443. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  444. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  445. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  446. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  447. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  448. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  449. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  450. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  451. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  452. data/app/commands/decidim/update_user_interests.rb +0 -41
  453. data/app/controllers/decidim/scopes_controller.rb +0 -84
  454. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  455. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  456. data/app/forms/decidim/user_interests_form.rb +0 -17
  457. data/app/helpers/decidim/categories_helper.rb +0 -26
  458. data/app/helpers/decidim/scopes_helper.rb +0 -105
  459. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  460. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  461. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  462. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  463. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  464. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +0 -212
  465. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  466. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  467. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  468. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  469. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  470. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  471. data/app/views/decidim/scopes/picker.html.erb +0 -53
  472. data/app/views/decidim/shared/_comments.html.erb +0 -0
  473. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  474. data/app/views/decidim/shared/_tags.html.erb +0 -1
  475. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  476. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  477. data/app/views/decidim/user_interests/show.html.erb +0 -22
  478. data/config/initializers/foundation_rails_helper.rb +0 -4
  479. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  480. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  481. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  482. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  483. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  484. data/lib/decidim/seven_zip_wrapper.rb +0 -29
@@ -11,6 +11,7 @@ module Decidim
11
11
  include FormFactory
12
12
  include Messaging::ConversationHelper
13
13
  include HasProfileBreadcrumb
14
+ include AjaxPermissionHandler
14
15
 
15
16
  before_action :authenticate_user!
16
17
  before_action :ensure_profile_manager
@@ -18,9 +19,6 @@ module Decidim
18
19
  helper Decidim::ResourceHelper
19
20
  helper_method :user, :conversations, :conversation
20
21
 
21
- # overwrite original rescue_from to ensure we print messages from ajax methods (update)
22
- rescue_from Decidim::ActionForbidden, with: :ajax_user_has_no_permission
23
-
24
22
  def index
25
23
  enforce_permission_to :list, :conversation, interlocutor: user
26
24
  end
@@ -94,14 +92,6 @@ module Decidim
94
92
 
95
93
  private
96
94
 
97
- # Rescue ajax calls and print the update.js view which prints the info on the message ajax form
98
- # Only if the request is AJAX, otherwise behave as Decidim standards
99
- def ajax_user_has_no_permission
100
- return user_has_no_permission unless request.xhr?
101
-
102
- render_unprocessable_entity I18n.t("actions.unauthorized", scope: "decidim.core")
103
- end
104
-
105
95
  def render_unprocessable_entity(message)
106
96
  render action: :update, locals: { error: message }, status: :unprocessable_entity
107
97
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class SoftDeleteResourceEvent < Decidim::Events::SimpleEvent
5
+ i18n_attributes :resource_type, :resource_title
6
+
7
+ def resource_type
8
+ resource.model_name.human
9
+ end
10
+
11
+ def resource_title
12
+ translated_attribute resource.title
13
+ end
14
+ end
15
+ end
@@ -94,7 +94,8 @@ module Decidim
94
94
  .from_model(@i18n_amendable)
95
95
  .with_context(
96
96
  current_component: @i18n_amendable.component,
97
- current_participatory_space: @i18n_amendable.participatory_space
97
+ current_participatory_space: @i18n_amendable.participatory_space,
98
+ current_organization: @i18n_amendable.organization
98
99
  )
99
100
  end
100
101
 
@@ -114,7 +115,8 @@ module Decidim
114
115
  def form_context
115
116
  context.to_h.merge(
116
117
  current_component: amendable.component,
117
- current_participatory_space: amendable.participatory_space
118
+ current_participatory_space: amendable.participatory_space,
119
+ current_organization: amendable.organization
118
120
  )
119
121
  end
120
122
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # The form object of ephemeral users.
5
+ class EphemeralUserForm < Form
6
+ mimic :user
7
+
8
+ attribute :locale
9
+ attribute :name
10
+ attribute :nickname
11
+ attribute :organization
12
+ attribute :verified, Boolean, default: false
13
+
14
+ def name
15
+ super || I18n.t("decidim.ephemeral_user", locale:)
16
+ end
17
+
18
+ def nickname
19
+ super || User.nicknamize(name)
20
+ end
21
+ end
22
+ end
@@ -7,6 +7,7 @@ module Decidim
7
7
  mimic :user
8
8
 
9
9
  attribute :email_on_moderations, Boolean
10
+ attribute :email_on_assigned_proposals, Boolean
10
11
  attribute :newsletter_notifications, Boolean
11
12
  attribute :notifications_from_followed, Boolean
12
13
  attribute :notifications_from_own_activity, Boolean
@@ -11,6 +11,7 @@ module Decidim
11
11
  attribute :provider, String
12
12
  attribute :uid, String
13
13
  attribute :tos_agreement, Boolean
14
+ attribute :newsletter, Boolean
14
15
  attribute :oauth_signature, String
15
16
  attribute :avatar_url, String
16
17
  attribute :raw_data, Hash
@@ -21,11 +22,23 @@ module Decidim
21
22
  validates :uid, presence: true
22
23
 
23
24
  def self.create_signature(provider, uid)
24
- Digest::MD5.hexdigest("#{provider}-#{uid}-#{Rails.application.secrets.secret_key_base}")
25
+ Digest::MD5.hexdigest("#{provider}-#{uid}-#{Rails.application.secret_key_base}")
25
26
  end
26
27
 
27
28
  def normalized_nickname
28
29
  UserBaseEntity.nicknamize(nickname || name, organization: current_organization)
29
30
  end
31
+
32
+ def newsletter_at
33
+ return nil unless newsletter?
34
+
35
+ Time.current
36
+ end
37
+
38
+ def valid_tos?
39
+ return if tos_agreement.nil?
40
+
41
+ errors.add :tos_agreement, :accepted
42
+ end
30
43
  end
31
44
  end
@@ -7,6 +7,17 @@ module Decidim
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
+ DEFAULT_KEY_MATCHING = {
11
+ alert: :alert,
12
+ notice: :success,
13
+ info: :info,
14
+ secondary: :secondary,
15
+ success: :success,
16
+ error: :alert,
17
+ warning: :warning,
18
+ primary: :primary
19
+ }.freeze
20
+
10
21
  # Displays the flash messages found in ActionDispatch's +flash+ hash using
11
22
  # FoundationRailsHelper's +callout+ component.
12
23
  #
@@ -20,7 +31,7 @@ module Decidim
20
31
  #
21
32
  # @return [String] the HTML with all the flash messages
22
33
  def display_flash_messages(closable: true, key_matching: {})
23
- key_matching = FoundationRailsHelper::FlashHelper::DEFAULT_KEY_MATCHING.merge(key_matching)
34
+ key_matching = DEFAULT_KEY_MATCHING.merge(key_matching)
24
35
  key_matching.default = :primary
25
36
 
26
37
  capture do
@@ -106,13 +117,17 @@ module Decidim
106
117
  end
107
118
 
108
119
  def message(value)
109
- return content_tag(:div, value, class: "flash__message flex items-center") unless value.is_a?(Hash)
120
+ return content_tag(:div, value, class: "flash__message") unless value.is_a?(Hash)
110
121
 
111
122
  content_tag(:div, class: "flash__message") do
112
123
  concat value[:title]
113
124
  concat content_tag(:span, value[:body], class: "flash__message-body")
114
125
  end
115
126
  end
127
+
128
+ def ignored_key?(key)
129
+ [:timedout].include?(key)
130
+ end
116
131
  end
117
132
  end
118
133
  end
@@ -57,26 +57,35 @@ module Decidim
57
57
  url = arguments[0]
58
58
  html_options = arguments[1]
59
59
  else
60
- body = content_tag :span, arguments[0]
60
+ body = arguments[0]
61
61
  url = arguments[1]
62
62
  html_options = arguments[2]
63
63
  end
64
64
 
65
- html_options ||= {}
65
+ html_options = (html_options || {}).with_indifferent_access
66
66
  resource = html_options.delete(:resource)
67
67
  permissions_holder = html_options.delete(:permissions_holder)
68
+ authorization_status = get_authorization_status(action, resource, permissions_holder)
69
+ redirect_path = valid_redirect(url, tag:, method: html_options[:method])
70
+ onboarding_options = onboarding_data_attributes(authorization_status, action, resource, permissions_holder, redirect_path)
68
71
 
69
- if !current_user
70
- html_options = clean_authorized_to_data_open(html_options)
71
-
72
+ if sign_in_required?(authorization_status)
73
+ html_options = clean_authorized_to_data_open(html_options.merge(onboarding_options))
72
74
  html_options["data-dialog-open"] = "loginModal"
73
- url = "#"
74
- elsif action && !action_authorized_to(action, resource:, permissions_holder:).ok?
75
- html_options = clean_authorized_to_data_open(html_options)
76
75
 
77
- html_options["data-dialog-open"] = "authorizationModal"
78
- html_options["data-dialog-remote-url"] = modal_path(action, resource)
79
76
  url = "#"
77
+ elsif authorization_status&.ok? == false
78
+ html_options = clean_authorized_to_data_open(html_options.merge(onboarding_options))
79
+ if pending_steps?(authorization_status)
80
+ tag = "link"
81
+ html_options["method"] = "post"
82
+ html_options.delete(:remote)
83
+ url = decidim_verifications.renew_onboarding_data_authorizations_path
84
+ else
85
+ html_options["data-dialog-open"] = "authorizationModal"
86
+ html_options["data-dialog-remote-url"] = modal_path(action, resource, html_options)
87
+ url = "#"
88
+ end
80
89
  end
81
90
 
82
91
  html_options["onclick"] = "event.preventDefault();" if url == ""
@@ -84,25 +93,33 @@ module Decidim
84
93
  if block
85
94
  send("#{tag}_to", url, html_options, &body)
86
95
  else
87
- send("#{tag}_to", body, url, html_options)
96
+ send("#{tag}_to", content_tag(:span, body), url, html_options)
88
97
  end
89
98
  end
90
99
  # rubocop: enable Metrics/PerceivedComplexity
91
100
 
92
- def modal_path(action, resource)
101
+ def modal_path(action, resource, opts = {})
102
+ if (default_path = opts.delete(:authorizations_modal_path)).present?
103
+ return default_path
104
+ end
105
+
93
106
  resource_params = if resource
94
107
  { resource_name: resource.resource_manifest.name, resource_id: resource.id }
95
108
  else
96
109
  {}
97
110
  end
98
- if current_component.present?
99
- decidim.authorization_modal_path(authorization_action: action, component_id: current_component&.id, **resource_params)
111
+
112
+ component = try(:current_component)
113
+ if component.present?
114
+ decidim.authorization_modal_path(authorization_action: action, component_id: component&.id, **resource_params)
100
115
  else
101
116
  decidim.free_resource_authorization_modal_path(authorization_action: action, **resource_params)
102
117
  end
103
118
  end
104
119
 
105
120
  def clean_authorized_to_data_open(html_options)
121
+ return {} if html_options.blank?
122
+
106
123
  html_options.delete(:"data-dialog-open")
107
124
  html_options.delete(:"data-dialog-remote-url")
108
125
 
@@ -115,9 +132,53 @@ module Decidim
115
132
  html_options[key].delete("open_url")
116
133
  html_options[key].delete(:"open-url")
117
134
  html_options[key].delete("open-url")
135
+ html_options[key].delete(:"dialog-open")
136
+ html_options[key].delete(:"dialog-remote-url")
118
137
  end
119
138
 
120
139
  html_options
121
140
  end
141
+
142
+ def get_authorization_status(action, resource, permissions_holder)
143
+ return if action.blank?
144
+
145
+ permissions_holder ||= resource.blank? ? try(:current_component) : nil
146
+ return if permissions_holder.blank? && resource.try(:component).blank?
147
+
148
+ action_authorized_to(action, resource:, permissions_holder:)
149
+ end
150
+
151
+ def pending_steps?(authorization_status)
152
+ authorization_status.pending_authorizations_count.positive? && authorization_status.global_code != :unauthorized
153
+ end
154
+
155
+ def onboarding_data_attributes(authorization_status, action, resource, permissions_holder, redirect_path = nil)
156
+ return {} if action.blank?
157
+ return {} unless pending_steps?(authorization_status)
158
+
159
+ permissions_holder ||= try(:current_component) if resource.blank?
160
+ return {} if [resource, permissions_holder].all?(&:blank?)
161
+
162
+ {
163
+ "data-onboarding-model" => resource&.to_gid,
164
+ "data-onboarding-permissions-holder" => permissions_holder&.to_gid,
165
+ "data-onboarding-action" => action,
166
+ "data-onboarding-redirect-path" => redirect_path
167
+ }.compact
168
+ end
169
+
170
+ def valid_redirect(path, opts = {})
171
+ return if opts[:tag]&.to_sym == :button
172
+ return if path == "#"
173
+ return if opts[:method].present? && opts[:method].to_s != "get"
174
+
175
+ path
176
+ end
177
+
178
+ def sign_in_required?(authorization_status)
179
+ return if current_user.present?
180
+
181
+ !authorization_status&.ephemeral?
182
+ end
122
183
  end
123
184
  end
@@ -16,15 +16,6 @@ module Decidim
16
16
  cell("decidim/amendable/announcement", emendation)
17
17
  end
18
18
 
19
- # Returns Html action button card to AMEND an amendable resource
20
- def amend_button_for(amendable)
21
- return unless amendments_enabled? && amendable.amendable?
22
- return unless current_component.current_settings.amendment_creation_enabled
23
- return unless can_participate_in_private_space?
24
-
25
- cell("decidim/amendable/amend_button_card", amendable)
26
- end
27
-
28
19
  # Checks if the user can participate in a participatory space
29
20
  # based on its settings related with Decidim::HasPrivateUsers.
30
21
  def can_participate_in_private_space?
@@ -4,11 +4,15 @@ module Decidim
4
4
  # Main module to add application-wide helpers.
5
5
  module ApplicationHelper
6
6
  include Decidim::OmniauthHelper
7
- include Decidim::ScopesHelper
7
+ include Decidim::DecidimFormHelper
8
8
  include Decidim::ContextualHelpHelper
9
9
  include Decidim::AmendmentsHelper
10
10
  include Decidim::CacheHelper
11
11
 
12
+ def layout_item_classes
13
+ "layout-item"
14
+ end
15
+
12
16
  # Truncates a given text respecting its HTML tags.
13
17
  #
14
18
  # text - The String text to be truncated.
@@ -99,7 +103,7 @@ module Decidim
99
103
  # Renders the cell contents.
100
104
  def cell(name, model, options = {}, &)
101
105
  options = { context: { view_context: self, current_user: } }.deep_merge(options)
102
- super(name, model, options, &)
106
+ super
103
107
  end
104
108
 
105
109
  def prevent_timeout_seconds
@@ -56,5 +56,11 @@ module Decidim
56
56
  active: active_item.active?
57
57
  }
58
58
  end
59
+
60
+ def render_schema_org_breadcrumb_list(breadcrumb_items)
61
+ exporter_options = { breadcrumb_items:, base_url: request.base_url, organization_name: current_organization_name }
62
+ exported_breadcrumb_list = Decidim::Exporters::JSON.new([exporter_options], Decidim::SchemaOrgBreadcrumbListSerializer).export.read
63
+ JSON.pretty_generate(JSON.parse(exported_breadcrumb_list).first)
64
+ end
59
65
  end
60
66
  end
@@ -8,7 +8,7 @@ module Decidim
8
8
  def cache(name = {}, options = {}, &)
9
9
  name = Array(name) + [current_locale]
10
10
 
11
- super(name, options, &)
11
+ super
12
12
  end
13
13
  end
14
14
  end
@@ -9,6 +9,7 @@ module Decidim
9
9
  # used in filters that uses checkboxes trees
10
10
  def check_boxes_tree_options(value, label, **options)
11
11
  parent_id = options.delete(:parent_id) || ""
12
+ object = options.delete(:object)
12
13
  checkbox_options = {
13
14
  value:,
14
15
  label:,
@@ -16,10 +17,16 @@ module Decidim
16
17
  include_hidden: false,
17
18
  label_options: {
18
19
  "data-children-checkbox": parent_id,
19
- value:
20
+ value:,
21
+ for: "#{options[:namespace]}_#{options[:id]}"
20
22
  }
21
23
  }
22
24
  options.merge!(checkbox_options)
25
+ # as taxonomies work with a nested array of values, we need to manually check if the value is checked
26
+ matches = options[:id]&.match(/^with_any_taxonomies_([0-9]+)__taxonomy-([0-9_]+)/)
27
+ if matches.present? && object.respond_to?(:with_any_taxonomies) && object.with_any_taxonomies&.dig(matches[1]).is_a?(Array)
28
+ options[:checked] = object.with_any_taxonomies[matches[1]].include?(value.to_s)
29
+ end
23
30
 
24
31
  if options.delete(:is_root_check_box) == true
25
32
  options[:label_options].merge!("data-global-checkbox": "")
@@ -37,10 +44,14 @@ module Decidim
37
44
  end
38
45
 
39
46
  # struct for leafs of checkboxes trees
40
- TreePoint = Struct.new(:value, :label) do
47
+ TreePoint = Struct.new(:value, :label, :root) do
41
48
  def tree_node?
42
49
  is_a?(TreeNode)
43
50
  end
51
+
52
+ def root?
53
+ root.present? || value.blank?
54
+ end
44
55
  end
45
56
 
46
57
  # Overwrite this method in your component helper to define
@@ -49,52 +60,29 @@ module Decidim
49
60
  raise StandardError, "Not implemented"
50
61
  end
51
62
 
52
- def filter_categories_values
53
- sorted_main_categories = current_participatory_space.categories.first_class.includes(:subcategories).sort_by do |category|
54
- [category.weight, decidim_escape_translated(category.name)]
55
- end
56
-
57
- categories_values = sorted_main_categories.flat_map do |category|
58
- sorted_descendant_categories = category.descendants.includes(:subcategories).sort_by do |subcategory|
59
- [subcategory.weight, decidim_escape_translated(subcategory.name)]
60
- end
61
-
62
- subcategories = sorted_descendant_categories.flat_map do |subcategory|
63
- TreePoint.new(subcategory.id.to_s, decidim_escape_translated(subcategory.name))
64
- end
65
-
66
- TreeNode.new(
67
- TreePoint.new(category.id.to_s, decidim_escape_translated(category.name)),
68
- subcategories
69
- )
70
- end
71
-
63
+ def filter_taxonomy_values_for(taxonomy_filter)
64
+ taxonomies = filter_taxonomy_values_children(taxonomy_filter.taxonomies)
72
65
  TreeNode.new(
73
- TreePoint.new("", t("decidim.core.application_helper.filter_category_values.all")),
74
- categories_values
66
+ TreePoint.new(taxonomy_filter.root_taxonomy_id, t("decidim.core.application_helper.filter_taxonomy_values.all"), true),
67
+ taxonomies
75
68
  )
76
69
  end
77
70
 
78
- def resource_filter_scope_values(resource)
79
- if resource.is_a?(Scope)
80
- filter_scopes_values_from([resource], current_participatory_space)
81
- else
82
- filter_scopes_values
71
+ def filter_taxonomy_values_children(children)
72
+ children.map do |id, hash|
73
+ TreeNode.new(
74
+ TreePoint.new(id, decidim_escape_translated(hash[:taxonomy].name).html_safe),
75
+ filter_taxonomy_values_children(hash[:children])
76
+ )
83
77
  end
84
78
  end
85
79
 
86
- def filter_scopes_values
87
- return filter_scopes_values_from_parent(current_component.scope) if current_component.scope.present?
88
-
89
- main_scopes = current_participatory_space.scopes.top_level
90
- .includes(:scope_type, :children)
91
- filter_scopes_values_from(main_scopes, current_participatory_space)
92
- end
93
-
80
+ # pending initiatives removal
94
81
  def filter_global_scopes_values
95
82
  filter_scopes_values_from(current_organization.scopes.top_level)
96
83
  end
97
84
 
85
+ # pending initiatives removal
98
86
  def filter_areas_values
99
87
  areas_or_types = areas_for_select(current_organization)
100
88
 
@@ -135,22 +123,6 @@ module Decidim
135
123
 
136
124
  private
137
125
 
138
- def filter_scopes_values_from_parent(scope)
139
- scopes_values = []
140
- scope.children.each do |child|
141
- unless child.children
142
- scopes_values << TreePoint.new(child.id.to_s, translated_attribute(child.name, current_participatory_space.organization))
143
- next
144
- end
145
- scopes_values << TreeNode.new(
146
- TreePoint.new(child.id.to_s, translated_attribute(child.name, current_participatory_space.organization)),
147
- scope_children_to_tree(child, current_participatory_space)
148
- )
149
- end
150
-
151
- filter_tree_from(scopes_values)
152
- end
153
-
154
126
  def filter_scopes_values_from(scopes, participatory_space = nil)
155
127
  scopes_values = scopes.compact.flat_map do |scope|
156
128
  TreeNode.new(
@@ -62,35 +62,6 @@ module Decidim
62
62
  end
63
63
  end
64
64
 
65
- # A custom helper to include a scope picker field without requiring a form
66
- # object
67
- #
68
- # name - The input name
69
- # value - The input value as a scope id
70
- # options - The set of options to send to the field
71
- # :id - The id to generate for the element (optional)
72
- #
73
- # Returns a scopes picker tag to be included in an html template.
74
- def scopes_picker_field_tag(name, value, id: nil)
75
- picker_options = {
76
- id: id || sanitize_to_id(name),
77
- class: "picker-single",
78
- name:
79
- }
80
-
81
- prompt_params = yield(nil)
82
- selected_scopes = value ? Decidim::Scope.where(id: value) : []
83
- scopes = selected_scopes.map { |scope| [scope, yield(scope)] }
84
-
85
- template = ""
86
- template += render("decidim/scopes/scopes_picker_input",
87
- picker_options:,
88
- prompt_params:,
89
- scopes:,
90
- values_on_top: true)
91
- template.html_safe
92
- end
93
-
94
65
  # A custom helper to include a translated field without requiring a form object.
95
66
  #
96
67
  # type - The type of the translated input field.
@@ -220,20 +191,5 @@ module Decidim
220
191
 
221
192
  organization.area_types
222
193
  end
223
-
224
- def ordered_scopes_descendants(root = nil)
225
- root = try(:current_participatory_space)&.scope if root == false
226
- if root.present?
227
- root.descendants
228
- else
229
- current_organization.scopes
230
- end.sort { |a, b| a.part_of.reverse <=> b.part_of.reverse }
231
- end
232
-
233
- def ordered_scopes_descendants_for_select(root = nil)
234
- ordered_scopes_descendants(root).map do |scope|
235
- [" #{"&nbsp;" * 4 * (scope.part_of.count - 1)} #{translated_attribute(scope.name)}".html_safe, scope&.id]
236
- end
237
- end
238
194
  end
239
195
  end
@@ -3,16 +3,6 @@
3
3
  module Decidim
4
4
  # A Helper for views with Endorsable resources.
5
5
  module EndorsableHelper
6
- # Invokes the decidim/endorsement_buttons cell.
7
- def endorsement_buttons_cell(resource)
8
- cell("decidim/endorsement_block", resource)
9
- end
10
-
11
- # Invokes the decidim/endorsers_list cell.
12
- def endorsers_list_cell(resource)
13
- cell("decidim/endorsers_list", resource)
14
- end
15
-
16
6
  #
17
7
  # Public: Checks if the given resource has been endorsed by all identities of the user.
18
8
  #
@@ -154,6 +154,12 @@ module Decidim
154
154
  "#{request.base_url}#{"?#{params.to_query}" unless params.empty?}"
155
155
  end
156
156
 
157
+ def root_url
158
+ return onboarding_manager.root_path if current_user&.ephemeral?
159
+
160
+ decidim.root_url(host: current_organization.host)
161
+ end
162
+
157
163
  private
158
164
 
159
165
  def each_decidim_engine
@@ -29,10 +29,9 @@ module Decidim
29
29
  # Generates a visualization of users for listing conversations threads
30
30
  #
31
31
  def username_list(users, shorten: false)
32
- content_tags = []
33
32
  first_users = shorten ? users.first(3) : users
34
- first_users.each do |u|
35
- content_tags.push(u.deleted? ? t("decidim.profile.deleted") : u.name)
33
+ content_tags = first_users.map do |u|
34
+ u.deleted? ? t("decidim.profile.deleted") : u.name
36
35
  end
37
36
 
38
37
  return content_tags.join(", ") unless shorten