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
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ class TaxonomyImporter
6
+ def initialize(organization, roots)
7
+ @organization = organization
8
+ @roots = roots
9
+ @result = { taxonomy_map: {}, taxonomies_created: [], taxonomies_assigned: {}, filters_created: {}, components_assigned: {}, failed_resources: [], failed_components: [] }
10
+ end
11
+
12
+ attr_reader :organization, :roots, :result
13
+
14
+ def import!(&)
15
+ roots.each do |name, element|
16
+ root = find_taxonomy!(root_taxonomies, name)
17
+ element["taxonomies"].each do |item_name, taxonomy|
18
+ import_taxonomy_item(root, item_name, taxonomy)
19
+ yield "Taxonomy imported", item_name if block_given?
20
+ end
21
+ element["filters"].each do |filter|
22
+ import_filter(root, filter)
23
+ yield "Filter imported", filter["name"] if block_given?
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def import_taxonomy_item(parent, name, item)
31
+ taxonomy = find_taxonomy!(parent.children, name)
32
+ taxonomy.update!(name: item["name"]) if item["name"].present?
33
+ result[:taxonomy_map][taxonomy.id] = item["origin"]
34
+
35
+ item["resources"].each do |object_id, _name|
36
+ apply_taxonomy_to_resource(object_id, taxonomy)
37
+ end
38
+ item["children"].each do |child_name, child|
39
+ import_taxonomy_item(taxonomy, child_name, child)
40
+ end
41
+ rescue ActiveRecord::RecordInvalid => e
42
+ abort "Error importing taxonomy item #{name} with parent #{parent.name} (#{e.message})"
43
+ end
44
+
45
+ def apply_taxonomy_to_resource(object_id, taxonomy)
46
+ resource = GlobalID::Locator.locate(object_id)
47
+ return result[:failed_resources] << object_id unless resource
48
+
49
+ name = taxonomy.name[organization.default_locale]
50
+
51
+ begin
52
+ if resource.respond_to? :taxonomy
53
+ resource.update(decidim_taxonomy_id: taxonomy.id)
54
+ else
55
+ return if resource.taxonomies.include?(taxonomy)
56
+
57
+ resource.taxonomies << taxonomy
58
+ end
59
+ result[:taxonomies_assigned][name] ||= []
60
+ result[:taxonomies_assigned][name] << object_id unless result[:taxonomies_assigned][name].include?(object_id)
61
+ rescue ActiveRecord::RecordInvalid
62
+ result[:failed_resources] << object_id
63
+ end
64
+ end
65
+
66
+ # rubocop:disable Metrics/CyclomaticComplexity
67
+ # rubocop:disable Metrics/PerceivedComplexity
68
+ def import_filter(root, data)
69
+ filter = find_taxonomy_filter!(root, data)
70
+
71
+ data["items"].each do |item_names|
72
+ taxonomy = root
73
+ item_names.each do |item_name|
74
+ taxonomy = find_taxonomy!(taxonomy.children, item_name)
75
+ end
76
+ next if filter.filter_items.exists?(taxonomy_item: taxonomy)
77
+
78
+ filter.filter_items.create!(taxonomy_item: taxonomy) do
79
+ result[:filters_created][filter.internal_name[organization.default_locale]] ||= []
80
+ result[:filters_created][filter.internal_name[organization.default_locale]] << item_names.join(" > ")
81
+ end
82
+ end
83
+
84
+ data["components"].each do |component_id|
85
+ component = GlobalID::Locator.locate(component_id)
86
+ if component
87
+ begin
88
+ component.update!(settings: { taxonomy_filters: [filter.id.to_s] })
89
+ result[:components_assigned][filter.internal_name[organization.default_locale]] ||= []
90
+ result[:components_assigned][filter.internal_name[organization.default_locale]] << component_id
91
+ rescue ActiveRecord::RecordInvalid
92
+ result[:failed_components] << component_id
93
+ end
94
+ else
95
+ result[:failed_components] << component_id
96
+ end
97
+ end
98
+ rescue ActiveRecord::RecordInvalid => e
99
+ abort "Error importing filter #{data} for root taxonomy #{root.name} (#{e.message})"
100
+ end
101
+ # rubocop:enable Metrics/CyclomaticComplexity
102
+ # rubocop:enable Metrics/PerceivedComplexity
103
+
104
+ def find_taxonomy(association, name)
105
+ association.find_by("name->>? = ?", organization.default_locale, name)
106
+ end
107
+
108
+ def find_taxonomy!(association, name)
109
+ find_taxonomy(association, name) || create_taxonomy!(association, name)
110
+ end
111
+
112
+ def create_taxonomy!(association, name)
113
+ association.create!(name: { organization.default_locale => name }, organization:) do
114
+ result[:taxonomies_created] << name
115
+ end
116
+ rescue ActiveRecord::RecordInvalid => e
117
+ abort "Error creating taxonomy #{name} with parent #{association.new.parent.name[organization.default_locale]} (#{e.message})"
118
+ end
119
+
120
+ def find_taxonomy_filter!(root_taxonomy, data)
121
+ name = data["internal_name"] || data["name"]
122
+ attributes = {
123
+ "participatory_space_manifests" => data["participatory_space_manifests"] || []
124
+ }
125
+ attributes["internal_name"] = { organization.default_locale => data["internal_name"] } if data["internal_name"]
126
+ attributes["name"] = { organization.default_locale => data["public_name"] } if data["public_name"]
127
+
128
+ find_taxonomy_filter(root_taxonomy, name:, participatory_space_manifests: data["participatory_space_manifests"]) || root_taxonomy.taxonomy_filters.create!(attributes)
129
+ end
130
+
131
+ def find_taxonomy_filter(root_taxonomy, name:, participatory_space_manifests:)
132
+ root_taxonomy.taxonomy_filters.all.detect do |filter|
133
+ filter.internal_name[organization.default_locale] == name && filter.participatory_space_manifests == participatory_space_manifests
134
+ end
135
+ end
136
+
137
+ def root_taxonomies
138
+ organization.taxonomies.roots
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ class TaxonomyPlan
6
+ def initialize(organization, models, importer: TaxonomyImporter)
7
+ @organization = organization
8
+ @models = models
9
+ @importer = importer
10
+ end
11
+
12
+ attr_reader :organization, :models, :importer
13
+
14
+ def import(data, &)
15
+ data["imported_taxonomies"].each do |model_name, taxonomies|
16
+ klass = importer.new(organization, taxonomies)
17
+ if block_given?
18
+ yield klass, model_name
19
+ else
20
+ klass.import!
21
+ end
22
+ end
23
+ end
24
+
25
+ def to_json(*_args, &)
26
+ I18n.with_locale(organization.default_locale) do
27
+ JSON.pretty_generate(to_h(&))
28
+ end
29
+ end
30
+
31
+ def to_h(&)
32
+ {
33
+ organization: {
34
+ id: organization.id,
35
+ locale: organization.default_locale,
36
+ host: organization.host,
37
+ name: translate(organization.name)
38
+ },
39
+ existing_taxonomies:,
40
+ imported_taxonomies: imported_taxonomies(&)
41
+ }
42
+ end
43
+
44
+ def imported_taxonomies
45
+ return @imported_taxonomies if defined?(@imported_taxonomies)
46
+
47
+ @imported_taxonomies = {}
48
+ models.map do |model|
49
+ yield model if block_given?
50
+ @imported_taxonomies[model.table_name] = model.with(organization).to_taxonomies
51
+ end
52
+ @imported_taxonomies
53
+ end
54
+
55
+ def existing_taxonomies
56
+ organization.taxonomies.roots.to_h do |root|
57
+ [
58
+ translate(root.name),
59
+ root.children.to_h do |taxonomy|
60
+ [
61
+ translate(taxonomy.name),
62
+ taxonomy.children.map do |child|
63
+ translate(child.name)
64
+ end
65
+ ]
66
+ end
67
+ ]
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def translate(translatable)
74
+ return translatable[organization.default_locale.to_s]
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/maintenance/import_models"
4
+ module Decidim
5
+ # This class should not be imported automatically by the Decidim web app
6
+ # It holds utilities for maintenance tasks (such as importing taxonomies)
7
+ # and compatibility models that might not be longer present in the current Decidim version
8
+ module Maintenance
9
+ autoload :TaxonomyImporter, "decidim/maintenance/taxonomy_importer"
10
+ autoload :TaxonomyPlan, "decidim/maintenance/taxonomy_plan"
11
+ end
12
+ end
@@ -9,24 +9,68 @@ module Decidim
9
9
  # Provides all the necessary functionality to initialize the front-end
10
10
  # geocoding autocompletion functionality.
11
11
  class Builder < Decidim::Map::Frontend::Builder
12
- # Displays the geocoding field element's markup for the view.
12
+ delegate :icon, :content_tag, :asset_pack_path, to: :template
13
+
14
+ # Renders the geocoding field element for the view. If the component supports
15
+ # geolocation (as determined by `show_my_location_button?`), the field will include
16
+ # a button allowing the user to use their current location to autofill the address.
17
+ # Otherwise, a standard geocoding input field is rendered without the location button.
13
18
  #
14
- # @param object_name [String, Symbol] The name for the object for which
15
- # the field is generated for.
16
- # @param method [String, Symbol] The method/property in the object that
17
- # the field is for.
18
- # @param options [Hash] Extra options for the field.
19
- # @return [String] The field element's markup.
19
+ # @param object_name [String, Symbol] The name of the object the field is being generated for.
20
+ # @param method [String, Symbol] The specific attribute or property of the object.
21
+ # @param options [Hash] Additional options for customizing the field's behavior and appearance.
22
+ # @return [String] The HTML markup for the geocoding field.
20
23
  def geocoding_field(object_name, method, options = {})
21
24
  options[:autocomplete] ||= "off"
22
-
23
25
  append_assets
26
+
27
+ if show_my_location_button?
28
+ geocoding_field_with_location_button(object_name, method, options)
29
+ else
30
+ geocoding_field_without_location_button(object_name, method, options)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def geocoding_field_with_location_button(object_name, method, options)
37
+ template.snippets.add(:decidim_geocoding_scripts, template.append_javascript_pack_tag("decidim_geocoding"))
38
+ template.snippets.add(:decidim_geocoding_styles, template.append_stylesheet_pack_tag("decidim_geocoding"))
39
+
40
+ template.content_tag(:div, class: "geocoding-container") do
41
+ template.text_field(
42
+ object_name,
43
+ method,
44
+ options.merge("data-decidim-geocoding" => view_options.to_json)
45
+ ) +
46
+ template.content_tag(:div, class: "input-group-button user-device-location") do
47
+ template.content_tag(:button, class: "button button__sm md:button__sm button__text-secondary", type: "button", data: {
48
+ input: "#{object_name}_#{method}",
49
+ latitude: "#{object_name}_latitude",
50
+ longitude: "#{object_name}_longitude",
51
+ error_no_location: I18n.t("errors.no_device_location", scope: "decidim.proposals.forms"),
52
+ error_unsupported: I18n.t("errors.device_not_supported", scope: "decidim.proposals.forms"),
53
+ url: Decidim::Core::Engine.routes.url_helpers.locate_path
54
+ }) do
55
+ icon("map-pin-line", role: "img", "aria-hidden": true) + " #{I18n.t("use_my_location", scope: "decidim.proposals.forms")}"
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ def geocoding_field_without_location_button(object_name, method, options)
24
62
  template.text_field(
25
63
  object_name,
26
64
  method,
27
65
  options.merge("data-decidim-geocoding" => view_options.to_json)
28
66
  )
29
67
  end
68
+
69
+ def show_my_location_button?
70
+ return unless template.respond_to?(:current_component)
71
+
72
+ template.current_component.manifest_name.to_sym == :proposals
73
+ end
30
74
  end
31
75
 
32
76
  # This module will be included in the main application's form builder in
@@ -71,7 +71,7 @@ module Decidim
71
71
  content = template.capture { yield }.html_safe if block_given?
72
72
 
73
73
  template.content_tag(:div, map_html_options) do
74
- (content || "")
74
+ content || ""
75
75
  end
76
76
  end
77
77
 
@@ -49,46 +49,7 @@ module Decidim
49
49
  private
50
50
 
51
51
  def language_code
52
- primary = I18n.locale.to_s
53
- secondary = primary.split("-")[0]
54
- available_language_codes[primary] || available_language_codes[secondary] || ""
55
- end
56
-
57
- def available_language_codes
58
- @available_language_codes ||= {
59
- "ar" => "ara", # Arabic
60
- "eu" => "baq", # Basque
61
- "ca" => "cat", # Catalan
62
- "zh" => "chi", # Chinese (simplified)
63
- # "" => "cht", # Chinese (traditional)
64
- "cs" => "cze", # Czech
65
- "da" => "dan", # Danish
66
- "nl" => "dut", # Dutch
67
- "en" => "eng", # English
68
- "fi" => "fin", # Finnish
69
- "fr" => "fre", # French
70
- "de" => "ger", # German
71
- "ga" => "gle", # Gaelic
72
- "el" => "gre", # Greek
73
- "he" => "heb", # Hebrew
74
- "hi" => "hin", # Hindi
75
- "id" => "ind", # Indonesian
76
- "it" => "ita", # Italian
77
- "no" => "nor", # Norwegian
78
- "fa" => "per", # Persian
79
- "pl" => "pol", # Polish
80
- "pt" => "por", # Portuguese
81
- "ru" => "rus", # Russian
82
- "si" => "sin", # Sinhalese
83
- "es" => "spa", # Spanish
84
- "sv" => "swe", # Swedish
85
- "th" => "tha", # Thai
86
- "tr" => "tur", # Turkish
87
- "uk" => "ukr", # Ukrainian
88
- "ur" => "urd", # Urdu
89
- "vi" => "vie", # Vietnamese
90
- "cy" => "wel" # Welsh
91
- }
52
+ I18n.locale.to_s
92
53
  end
93
54
  end
94
55
  end
@@ -29,9 +29,7 @@ module Decidim
29
29
  # Some of the matches that have "resultType" == "street" do not even
30
30
  # contain the street name unless they also have the "streets" key in
31
31
  # the "scoring" -> "fieldScore" attribute defined.
32
- street_result = results.find do |r|
33
- r.data["scoring"]["fieldScore"].has_key?("streets")
34
- end
32
+ street_result = find_street_with_name(results)
35
33
  return street_result.address if street_result
36
34
 
37
35
  # Otherwise, sort the results based on their exact distances from
@@ -51,6 +49,14 @@ module Decidim
51
49
 
52
50
  results.first.address
53
51
  end
52
+
53
+ private
54
+
55
+ def find_street_with_name(results)
56
+ results.find do |r|
57
+ r.data && r.data["scoring"] && r.data["scoring"]["fieldScore"] && r.data["scoring"]["fieldScore"].has_key?("streets")
58
+ end
59
+ end
54
60
  end
55
61
  end
56
62
  end
data/lib/decidim/map.rb CHANGED
@@ -73,12 +73,9 @@ module Decidim
73
73
  @utility_modules ||= {}
74
74
  @utility_modules[category] = mod
75
75
 
76
- # Dynamically define the category method.
77
- module_eval %{
78
- def self.#{category}(options) # def self.dynamic(options)
79
- utility(:#{category}, options) # utility(:dynamic, options)
80
- end # end
81
- }, __FILE__, __LINE__ - 4
76
+ define_singleton_method(category) do |options|
77
+ utility(category, options)
78
+ end
82
79
 
83
80
  mod
84
81
  end
@@ -28,12 +28,16 @@ module Decidim
28
28
 
29
29
  # Public: fetches the participatory space of the resource's component or from the resource itself
30
30
  def participatory_space
31
- @participatory_space ||= @reportable.component&.participatory_space || @reportable.try(:participatory_space)
31
+ @participatory_space ||= if reportable.class.respond_to?(:participatory_space?)
32
+ reportable
33
+ else
34
+ reportable.component&.participatory_space || reportable.try(:participatory_space)
35
+ end
32
36
  end
33
37
 
34
38
  # Public: updates the reported content for the moderation object associated with resource
35
39
  def update_reported_content!
36
- moderation.update!(reported_content: @reportable.reported_searchable_content_text)
40
+ moderation.update!(reported_content: reportable.reported_searchable_content_text)
37
41
  end
38
42
 
39
43
  # Public: creates a new report for the given resource, having a basic set of options
@@ -54,6 +58,8 @@ module Decidim
54
58
 
55
59
  # Public: Broadcasts a notification to the author of the resource that has been hidden
56
60
  def send_notification_to_author
61
+ return if affected_users.blank?
62
+
57
63
  data = {
58
64
  event: "decidim.events.reports.resource_hidden",
59
65
  event_class: Decidim::ResourceHiddenEvent,
@@ -61,14 +67,13 @@ module Decidim
61
67
  extra: {
62
68
  report_reasons:
63
69
  },
64
- affected_users: @reportable.try(:authors) || [@reportable.try(:normalized_author)]
70
+ affected_users:
65
71
  }
66
72
 
67
73
  Decidim::EventsManager.publish(**data)
68
74
  end
69
75
 
70
- # Public: hides the resource
71
- def hide!
76
+ def hide_with_admin_log!
72
77
  Decidim.traceability.perform_action!(
73
78
  "hide",
74
79
  moderation,
@@ -77,13 +82,32 @@ module Decidim
77
82
  reportable_type: @reportable.class.name
78
83
  }
79
84
  ) do
85
+ hide!
86
+ end
87
+ end
88
+
89
+ # Public: hides the resources
90
+ def hide!
91
+ Decidim.traceability.perform_action_without_log!(current_user) do
80
92
  @reportable.moderation.update!(hidden_at: Time.current)
81
93
  @reportable.try(:touch)
82
94
  end
95
+
96
+ if @reportable.is_a?(Decidim::Comments::Commentable)
97
+ @reportable.comment_threads.each do |comment|
98
+ Decidim::HideChildResourcesJob.perform_later(comment, @current_user.id)
99
+ end
100
+ end
101
+
102
+ send_notification_to_author
83
103
  end
84
104
 
85
105
  private
86
106
 
107
+ def affected_users
108
+ @affected_users ||= (@reportable.try(:authors) || [@reportable.try(:normalized_author)]).select { |author| author.is_a?(Decidim::User) }
109
+ end
110
+
87
111
  def report_reasons
88
112
  @reportable.moderation.reports.pluck(:reason).uniq
89
113
  end
@@ -14,7 +14,7 @@ module Decidim
14
14
 
15
15
  def self.crypt_data
16
16
  key = ActiveSupport::KeyGenerator.new("sent_at").generate_key(
17
- Rails.application.secrets.secret_key_base, ActiveSupport::MessageEncryptor.key_len
17
+ Rails.application.secret_key_base, ActiveSupport::MessageEncryptor.key_len
18
18
  )
19
19
  ActiveSupport::MessageEncryptor.new(key)
20
20
  end
@@ -66,7 +66,7 @@ module Decidim
66
66
  return tokenizer.hex_digest(id)
67
67
  end
68
68
 
69
- Digest::MD5.hexdigest("#{id}-#{Rails.application.secrets.secret_key_base}")
69
+ Digest::MD5.hexdigest("#{id}-#{Rails.application.secret_key_base}")
70
70
  end
71
71
 
72
72
  def build_pad_url(id)
@@ -14,25 +14,25 @@ module Decidim
14
14
 
15
15
  def skip_space_slug?(method_name)
16
16
  [
17
- "edit_#{underscored_name}_path".to_sym,
18
- "edit_#{underscored_name}_url".to_sym,
19
- "new_#{underscored_name}_path".to_sym,
20
- "new_#{underscored_name}_url".to_sym,
21
- "#{underscored_name}_path".to_sym,
22
- "#{underscored_name}_url".to_sym,
23
- "#{underscored_name.pluralize}_path".to_sym,
24
- "#{underscored_name.pluralize}_url".to_sym
17
+ :"edit_#{underscored_name}_path",
18
+ :"edit_#{underscored_name}_url",
19
+ :"new_#{underscored_name}_path",
20
+ :"new_#{underscored_name}_url",
21
+ :"#{underscored_name}_path",
22
+ :"#{underscored_name}_url",
23
+ :"#{underscored_name.pluralize}_path",
24
+ :"#{underscored_name.pluralize}_url"
25
25
  ].include?(method_name)
26
26
  end
27
27
 
28
28
  def slug_param_name
29
- "#{underscored_name}_slug".to_sym
29
+ :"#{underscored_name}_slug"
30
30
  end
31
31
 
32
32
  def mounted_params
33
33
  {
34
34
  :host => organization.host,
35
- "#{underscored_name}_slug".to_sym => slug
35
+ :"#{underscored_name}_slug" => slug
36
36
  }
37
37
  end
38
38
 
@@ -37,6 +37,16 @@ module Decidim
37
37
  raise "Not implemented"
38
38
  end
39
39
 
40
+ def self.ransackable_attributes(auth_object = nil)
41
+ return [] unless auth_object&.admin?
42
+
43
+ %w(name nickname email invitation_accepted_at last_sign_in_at role)
44
+ end
45
+
46
+ def self.ransackable_associations(_auth_object = nil)
47
+ []
48
+ end
49
+
40
50
  def self.order_by_name
41
51
  includes(:user).order("decidim_users.name ASC")
42
52
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module PrivateDownloadHelper
5
+ def attach_archive(export_data, name, user)
6
+ private_exports = user.private_exports.build
7
+ private_exports.export_type = name
8
+ private_exports.file.attach(io: StringIO.open(FileZipper.new(export_data.filename(name), export_data.read).zip), filename: "#{name}.zip")
9
+ private_exports.expires_at = Decidim.download_your_data_expiry_time.from_now
10
+ private_exports.metadata = {}
11
+ private_exports.save!
12
+ private_exports.reload
13
+ end
14
+ end
15
+ end