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
@@ -3,6 +3,8 @@
3
3
  module Decidim
4
4
  module Core
5
5
  class MetricHistoryType < Decidim::Api::Types::BaseObject
6
+ description "A metric history"
7
+
6
8
  field :key, GraphQL::Types::String, "The key value", null: false
7
9
  field :value, GraphQL::Types::Int, "The value for each key", null: false
8
10
 
@@ -5,9 +5,9 @@ module Decidim
5
5
  class MetricType < Decidim::Api::Types::BaseObject
6
6
  description "Metric data"
7
7
 
8
- field :name, GraphQL::Types::String, "The graphql_name of the metric", null: false
9
8
  field :count, GraphQL::Types::Int, "The last value of the metric", null: false
10
9
  field :history, [MetricHistoryType, { null: true }], "The historic values for this metric", null: false
10
+ field :name, GraphQL::Types::String, "The graphql_name of the metric", null: false
11
11
  end
12
12
  end
13
13
  end
@@ -6,12 +6,17 @@ module Decidim
6
6
  description "The current organization"
7
7
 
8
8
  field :name, Decidim::Core::TranslatedFieldType, "The name of the current organization", null: true
9
+ field :taxonomies, [Decidim::Core::TaxonomyType, { null: true }], "The taxonomies associated to this organization", null: true
9
10
 
10
11
  field :stats, [Core::StatisticType, { null: true }], description: "The statistics associated to this object", null: true
11
12
 
12
13
  def stats
13
14
  Decidim.stats.with_context(object)
14
15
  end
16
+
17
+ def taxonomies
18
+ object.taxonomies.roots
19
+ end
15
20
  end
16
21
  end
17
22
  end
@@ -5,11 +5,11 @@ module Decidim
5
5
  class ParticipatorySpaceLinkType < Decidim::Api::Types::BaseObject
6
6
  description "A link representation between participatory spaces"
7
7
 
8
- field :id, GraphQL::Types::ID, "The id of this participatory space link", null: false
9
8
  field :from_type, GraphQL::Types::String, "The origin participatory space type for this participatory space link", null: false
10
- field :to_type, GraphQL::Types::String, "The destination participatory space type for this participatory space link", null: false
9
+ field :id, GraphQL::Types::ID, "The id of this participatory space link", null: false
11
10
  field :name, GraphQL::Types::String, "The name (purpose) of this participatory space link", null: false
12
11
  field :participatory_space, ParticipatorySpaceInterface, description: "The linked participatory space (polymorphic)", null: false
12
+ field :to_type, GraphQL::Types::String, "The destination participatory space type for this participatory space link", null: false
13
13
 
14
14
  def participatory_space
15
15
  manifest_name = object.name.partition("included_").last
@@ -5,8 +5,8 @@ module Decidim
5
5
  class ParticipatorySpaceManifestType < Decidim::Api::Types::BaseObject
6
6
  description "A participatory manifest"
7
7
 
8
- field :name, GraphQL::Types::String, "The name of the manifest", null: false
9
8
  field :human_name, Decidim::Core::QuantifiableTranslatedFieldType, "The human readable name for the manifest", null: false
9
+ field :name, GraphQL::Types::String, "The name of the manifest", null: false
10
10
 
11
11
  def human_name
12
12
  {
@@ -5,8 +5,8 @@ module Decidim
5
5
  class QuantifiableTranslatedFieldType < Decidim::Api::Types::BaseObject
6
6
  description "A quantifiable translated field with singular and plural formats"
7
7
 
8
- field :single, Decidim::Core::TranslatedFieldType, "The singular format.", null: false
9
8
  field :plural, Decidim::Core::TranslatedFieldType, "The plural format.", null: false
9
+ field :single, Decidim::Core::TranslatedFieldType, "The singular format.", null: false
10
10
  end
11
11
  end
12
12
  end
@@ -6,10 +6,9 @@ module Decidim
6
6
  graphql_name "Scope"
7
7
  description "A scope"
8
8
 
9
- field :id, GraphQL::Types::ID, null: false
10
- field :name, Decidim::Core::TranslatedFieldType, "The graphql_name of this scope.", null: false
11
-
12
9
  field :children, [Decidim::Core::ScopeApiType, { null: true }], "Descendants of this scope", null: false
10
+ field :id, GraphQL::Types::ID, "The Id for this scope", null: false
11
+ field :name, Decidim::Core::TranslatedFieldType, "The graphql_name of this scope.", null: false
13
12
  field :parent, Decidim::Core::ScopeApiType, "This scope's parent scope.", null: true
14
13
  end
15
14
  end
@@ -7,13 +7,12 @@ module Decidim
7
7
  description "The current session"
8
8
 
9
9
  field :user, UserType, "The current user", null: true
10
+ field :verified_user_groups, [UserGroupType], "The current user verified user groups", null: false
10
11
 
11
12
  def user
12
13
  object
13
14
  end
14
15
 
15
- field :verified_user_groups, [UserGroupType], "The current user verified user groups", null: false
16
-
17
16
  def verified_user_groups
18
17
  Decidim::UserGroups::ManageableUserGroups.for(object).verified
19
18
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Core
5
+ class TaxonomyType < Decidim::Api::Types::BaseObject
6
+ description "A taxonomy that can be applied to other resources."
7
+
8
+ field :children, [Decidim::Core::TaxonomyType], "The children of this taxonomy.", null: false
9
+ field :id, GraphQL::Types::ID, "The id of this taxonomy.", null: false
10
+ field :is_root, Boolean, "Whether this taxonomy is a root taxonomy (root taxonomies have no parents).", null: false, method: :root?
11
+ field :name, Decidim::Core::TranslatedFieldType, "The name of this taxonomy.", null: false
12
+ field :parent, Decidim::Core::TaxonomyType, "The parent of this taxonomy.", null: true
13
+ end
14
+ end
15
+ end
@@ -5,15 +5,15 @@ module Decidim
5
5
  class TraceVersionType < Decidim::Api::Types::BaseObject
6
6
  description "A trace version type"
7
7
 
8
- field :id, GraphQL::Types::ID, "The ID of the version", null: false
8
+ field :changeset, GraphQL::Types::JSON, description: "Object with the changes in this version", null: true
9
9
  field :created_at, Decidim::Core::DateTimeType, description: "The date and time this version was created", null: true
10
10
  field :editor, Decidim::Core::AuthorInterface, description: "The editor/author of this version", null: true
11
+ field :id, GraphQL::Types::ID, "The ID of the version", null: false
11
12
 
12
13
  def editor
13
14
  author = Decidim.traceability.version_editor(object)
14
15
  author if author.is_a?(Decidim::User) || author.is_a?(Decidim::UserGroup)
15
16
  end
16
- field :changeset, GraphQL::Types::JSON, description: "Object with the changes in this version", null: true
17
17
 
18
18
  delegate :changeset, to: :object
19
19
  end
@@ -7,14 +7,12 @@ module Decidim
7
7
  description "A translated field"
8
8
 
9
9
  field :locales, [GraphQL::Types::String, { null: true }], description: "Lists all the locales in which this translation is available", null: true
10
-
11
- field :translations, [LocalizedStringType, { null: true }], description: "All the localized strings for this translation.", null: false do
12
- argument :locales, [GraphQL::Types::String], description: "A list of locales to scope the translations to.", required: false
13
- end
14
-
15
10
  field :translation, GraphQL::Types::String, description: "Returns a single translation given a locale.", null: true do
16
11
  argument :locale, GraphQL::Types::String, "A locale to search for", required: true
17
12
  end
13
+ field :translations, [LocalizedStringType, { null: true }], description: "All the localized strings for this translation.", null: false do
14
+ argument :locales, [GraphQL::Types::String], description: "A list of locales to scope the translations to.", required: false
15
+ end
18
16
 
19
17
  def locales
20
18
  (defined_translations.keys + machine_translations.keys).uniq
@@ -8,54 +8,41 @@ module Decidim
8
8
 
9
9
  implements Decidim::Core::AuthorInterface
10
10
 
11
+ field :avatar_url, GraphQL::Types::String, "The user's avatar url", null: false
12
+ field :badge, GraphQL::Types::String, "A badge for the user group", null: false
13
+ field :deleted, GraphQL::Types::Boolean, "Whether the user group's has been deleted or not", null: false
11
14
  field :id, GraphQL::Types::ID, "The user group's id", null: false
12
-
15
+ field :members, [Decidim::Core::UserType, { null: true }], "Members of this group", null: false, method: :accepted_users
16
+ field :members_count, GraphQL::Types::Int, "Number of members in this group", null: false
13
17
  field :name, GraphQL::Types::String, "The user group's name", null: false
14
-
15
18
  field :nickname, GraphQL::Types::String, "The user group nickname", null: false
19
+ field :organization_name, Decidim::Core::TranslatedFieldType, "The user group's organization name", null: false
20
+ field :profile_path, GraphQL::Types::String, "The user group's profile url", null: false
16
21
 
17
22
  def nickname
18
23
  object.presenter.nickname
19
24
  end
20
25
 
21
- field :avatar_url, GraphQL::Types::String, "The user's avatar url", null: false
22
-
23
26
  def avatar_url
24
27
  object.presenter.avatar_url
25
28
  end
26
29
 
27
- field :profile_path, GraphQL::Types::String, "The user group's profile url", null: false
28
-
29
30
  def profile_path
30
31
  object.presenter.profile_path
31
32
  end
32
33
 
33
- field :organization_name, Decidim::Core::TranslatedFieldType, "The user group's organization name", null: false
34
-
35
34
  def organization_name
36
35
  object.organization.name
37
36
  end
38
37
 
39
- field :deleted, GraphQL::Types::Boolean, "Whether the user group's has been deleted or not", null: false
40
-
41
38
  def deleted
42
39
  object.presenter.deleted?
43
40
  end
44
41
 
45
- field :badge, GraphQL::Types::String, "A badge for the user group", null: false
46
-
47
42
  def badge
48
43
  object.presenter.badge
49
44
  end
50
45
 
51
- field :members, [Decidim::Core::UserType, { null: true }], "Members of this group", null: false
52
-
53
- def members
54
- object.accepted_users
55
- end
56
-
57
- field :members_count, GraphQL::Types::Int, "Number of members in this group", null: false
58
-
59
46
  def members_count
60
47
  object.accepted_memberships.count
61
48
  end
@@ -8,28 +8,19 @@ module Decidim
8
8
 
9
9
  implements Decidim::Core::AuthorInterface
10
10
 
11
- field :id, GraphQL::Types::ID, "The user's id", null: false
12
-
13
- field :name, GraphQL::Types::String, "The user's name", null: false
14
-
15
- field :nickname, GraphQL::Types::String, "The user's nickname", null: false
16
-
17
11
  field :avatar_url, GraphQL::Types::String, "The user's avatar url", null: false
18
-
19
- field :profile_path, GraphQL::Types::String, "The user's profile url", null: false
20
-
12
+ field :badge, GraphQL::Types::String, "A badge for the user group", null: false
13
+ field :deleted, GraphQL::Types::Boolean, "Whether the user's account has been deleted or not", null: false
21
14
  field :direct_messages_enabled, GraphQL::Types::String,
22
15
  null: false,
23
16
  description: ["If the user making the request is logged in, it will return whether this recipient accepts a conversation or not.",
24
17
  " It will return false for non-logged requests."].join
25
-
18
+ field :groups, [Decidim::Core::UserGroupType, { null: true }], "Groups where this user belongs", null: false, method: :accepted_user_groups
19
+ field :id, GraphQL::Types::ID, "The user's id", null: false
20
+ field :name, GraphQL::Types::String, "The user's name", null: false
21
+ field :nickname, GraphQL::Types::String, "The user's nickname", null: false
26
22
  field :organization_name, Decidim::Core::TranslatedFieldType, "The user's organization name", null: false
27
-
28
- field :deleted, GraphQL::Types::Boolean, "Whether the user's account has been deleted or not", null: false
29
-
30
- field :badge, GraphQL::Types::String, "A badge for the user group", null: false
31
-
32
- field :groups, [Decidim::Core::UserGroupType, { null: true }], "Groups where this user belongs", null: false
23
+ field :profile_path, GraphQL::Types::String, "The user's profile url", null: false
33
24
 
34
25
  def nickname
35
26
  object.presenter.nickname
@@ -59,10 +50,6 @@ module Decidim
59
50
  object.presenter.badge
60
51
  end
61
52
 
62
- def groups
63
- object.accepted_user_groups
64
- end
65
-
66
53
  def self.authorized?(object, context)
67
54
  super && object.confirmed? && !object.blocked? && !object.deleted?
68
55
  end
@@ -159,7 +159,7 @@ module Decidim
159
159
  return unless blob
160
160
 
161
161
  if options[:only_path] || remote? || !asset_url_available?
162
- routes.rails_blob_url(blob, **default_options.merge(options))
162
+ routes.rails_blob_url(blob, **default_options, **options)
163
163
  else
164
164
  blob.url(**options)
165
165
  end
@@ -184,7 +184,7 @@ module Decidim
184
184
  if options[:host]
185
185
  rails_representation_url(**options)
186
186
  else
187
- representation_url(**options.merge(only_path: true))
187
+ representation_url(**options, only_path: true)
188
188
  end
189
189
  end
190
190
 
@@ -207,10 +207,10 @@ module Decidim
207
207
  # @param options The options for building the URL
208
208
  # @return [String, nil] The converted representation URL or `nil` if the
209
209
  # asset is not defined.
210
- def rails_representation_url(**options)
210
+ def rails_representation_url(**)
211
211
  return unless asset
212
212
 
213
- representation_url = routes.rails_representation_url(asset, **default_options.merge(options))
213
+ representation_url = routes.rails_representation_url(asset, **default_options, **)
214
214
 
215
215
  variation = asset.try(:variation)
216
216
  return representation_url unless variation
@@ -51,7 +51,8 @@ module.exports = {
51
51
  DEFAULT: "#F3F4F7",
52
52
  2: "#FAFBFC",
53
53
  3: "#EFEFEF",
54
- 4: "#E4EEFF99" // 60% opacity
54
+ 4: "#E4EEFF99", // 60% opacity
55
+ 5: "#E9E9E9"
55
56
  }
56
57
  },
57
58
  container: {
@@ -28,7 +28,7 @@ module Decidim
28
28
  # Returns nothing.
29
29
  def attachments_attribute(name)
30
30
  attribute name, Array[Integer]
31
- attribute "add_#{name}".to_sym, Array
31
+ attribute :"add_#{name}", Array
32
32
 
33
33
  # Define the getter method that fetches the attachment records based on
34
34
  # their types. For Strings and Integers, assumes they are IDs and will
@@ -21,7 +21,7 @@ module Decidim
21
21
  def self.cryptor
22
22
  @cryptor ||= begin
23
23
  key = ActiveSupport::KeyGenerator.new("attribute").generate_key(
24
- Rails.application.secrets.secret_key_base, ActiveSupport::MessageEncryptor.key_len
24
+ Rails.application.secret_key_base, ActiveSupport::MessageEncryptor.key_len
25
25
  )
26
26
  ActiveSupport::MessageEncryptor.new(key)
27
27
  end
@@ -7,7 +7,7 @@ module Decidim
7
7
  value = value.values if value.is_a?(Hash)
8
8
  return unless Array(value).reject { |r| valid_object?(r) }.any?
9
9
 
10
- record.errors.add(attribute, :invalid, **options.merge(value:))
10
+ record.errors.add(attribute, :invalid, **options, value:)
11
11
  end
12
12
 
13
13
  private
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Attributes
5
+ # Custom attributes value to represent an Integer with units.
6
+ class IntegerWithUnits < ActiveModel::Type::Value
7
+ def type
8
+ :"decidim/attributes/integer_with_units"
9
+ end
10
+
11
+ def cast(value)
12
+ return nil if value.nil?
13
+
14
+ case value
15
+ when ::Hash
16
+ [value["0"].to_i.abs, value["1"].to_s]
17
+ when ::Array
18
+ return value if value.size != 2
19
+
20
+ [value[0].to_i.abs, value[1].to_s]
21
+ else
22
+ value
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -13,6 +13,7 @@ module Decidim
13
13
  autoload :Model, "decidim/attributes/model"
14
14
  autoload :Symbol, "decidim/attributes/symbol"
15
15
  autoload :Integer, "decidim/attributes/integer"
16
+ autoload :IntegerWithUnits, "decidim/attributes/integer_with_units"
16
17
 
17
18
  # Base types
18
19
  ActiveModel::Type.register(:array, Decidim::Attributes::Array)
@@ -30,6 +31,7 @@ module Decidim
30
31
  ActiveModel::Type.register(:"decidim/attributes/clean_string", Decidim::Attributes::CleanString)
31
32
  ActiveModel::Type.register(:"decidim/attributes/rich_text", Decidim::Attributes::RichText)
32
33
  ActiveModel::Type.register(:"decidim/attributes/blob", Decidim::Attributes::Blob)
34
+ ActiveModel::Type.register(:"decidim/attributes/integer_with_units", Decidim::Attributes::IntegerWithUnits)
33
35
 
34
36
  ActiveModel::Type.register(:integer, Decidim::Attributes::Integer)
35
37
  end
@@ -37,7 +37,6 @@ module Decidim
37
37
 
38
38
  def input_field(name, type)
39
39
  return hidden_field(name) if name.to_s == "handler_name"
40
- return scopes_selector if name.to_s == "scope_id"
41
40
 
42
41
  case type
43
42
  when :date, :datetime, :time, :"decidim/attributes/localized_date"
@@ -47,12 +46,6 @@ module Decidim
47
46
  end
48
47
  end
49
48
 
50
- def scopes_selector
51
- return if object.user.blank?
52
-
53
- collection_select :scope_id, object.user.organization.scopes, :id, ->(scope) { translated_attribute(scope.name) }
54
- end
55
-
56
49
  def find_input_type(name)
57
50
  value_type = object.class.attribute_types[name]
58
51
 
@@ -70,7 +70,7 @@ module Decidim
70
70
  def reload(options = nil)
71
71
  remove_instance_variable(:@authors) if defined?(@authors)
72
72
  remove_instance_variable(:@notifiable_identities) if defined?(@notifiable_identities)
73
- super(options)
73
+ super
74
74
  end
75
75
 
76
76
  # Returns all the authors of a coauthorable.
@@ -22,7 +22,7 @@ module Decidim
22
22
  end
23
23
 
24
24
  def evaluate(&block)
25
- @caller = eval("self", block.binding, __FILE__, __LINE__)
25
+ @caller = block.binding.receiver
26
26
  instance_eval(&block)
27
27
  end
28
28
 
@@ -42,10 +42,10 @@ module Decidim
42
42
  @caller.respond_to?(method_name, include_private)
43
43
  end
44
44
 
45
- def with_events(with_transaction: false, &block)
45
+ def with_events(with_transaction: false, &)
46
46
  ActiveSupport::Notifications.publish("#{event_namespace}:before", **event_arguments)
47
47
 
48
- with_transaction ? transaction(&block) : yield
48
+ with_transaction ? transaction(&) : yield
49
49
 
50
50
  ActiveSupport::Notifications.publish("#{event_namespace}:after", **event_arguments)
51
51
  end
@@ -40,7 +40,11 @@ module Decidim
40
40
  current_user,
41
41
  **extra_params
42
42
  ) do
43
- resource.destroy!
43
+ if resource.respond_to?(:really_destroy!)
44
+ resource.really_destroy!
45
+ else
46
+ resource.destroy!
47
+ end
44
48
  end
45
49
  end
46
50
 
@@ -22,7 +22,7 @@ module Decidim
22
22
  end
23
23
 
24
24
  def form_attribute_values
25
- raise "You need to define the list of attributes to be fetched from form object fetch_form_attributes" unless defined?(:form_attributes)
25
+ raise "You need to define the list of attributes to be fetched from form object fetch_form_attributes" if form_attributes.empty?
26
26
 
27
27
  form_attributes.index_with do |field|
28
28
  form.send(field)
@@ -30,7 +30,7 @@ module Decidim
30
30
  end
31
31
 
32
32
  def file_attribute_values
33
- return {} unless defined?(:file_attributes)
33
+ return {} if file_attributes.empty?
34
34
 
35
35
  attachment_attributes(*file_attributes)
36
36
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Commands
5
+ class RestoreResource < ::Decidim::Command
6
+ # Initializes the command.
7
+ #
8
+ # @param resource [ActiveRecord::Base] the resource to restore.
9
+ # @param current_user [Decidim::User] the current user.
10
+ def initialize(resource, current_user)
11
+ @resource = resource
12
+ @current_user = current_user
13
+ end
14
+
15
+ # Restores the resource.
16
+ #
17
+ # Broadcasts :ok if successful, :invalid otherwise.
18
+ def call
19
+ return broadcast(:invalid) if invalid?
20
+
21
+ restore_resource
22
+
23
+ broadcast(:ok, resource)
24
+ rescue Decidim::Commands::HookError, StandardError
25
+ broadcast(:invalid)
26
+ end
27
+
28
+ protected
29
+
30
+ attr_reader :resource, :current_user
31
+
32
+ def invalid? = false
33
+
34
+ def restore_resource
35
+ Decidim.traceability.perform_action!(
36
+ "restore",
37
+ resource,
38
+ current_user
39
+ ) do
40
+ resource.restore
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Commands
5
+ class SoftDeleteResource < ::Decidim::Command
6
+ # Initializes the command.
7
+ #
8
+ # @param resource [ActiveRecord::Base] the resource to soft delete.
9
+ # @param current_user [Decidim::User] the current user.
10
+ def initialize(resource, current_user)
11
+ @resource = resource
12
+ @current_user = current_user
13
+ end
14
+
15
+ # Soft deletes the resource.
16
+ #
17
+ # Broadcasts :ok if successful, :invalid otherwise.
18
+ def call
19
+ return broadcast(:invalid) if invalid?
20
+
21
+ soft_delete_resource
22
+ send_notification_to_authors
23
+
24
+ broadcast(:ok, resource)
25
+ rescue Decidim::Commands::HookError, StandardError
26
+ broadcast(:invalid)
27
+ end
28
+
29
+ protected
30
+
31
+ attr_reader :resource, :current_user
32
+
33
+ def invalid? = false
34
+
35
+ def soft_delete_resource
36
+ Decidim.traceability.perform_action!(
37
+ "soft_delete",
38
+ resource,
39
+ current_user
40
+ ) do
41
+ resource.destroy!
42
+ end
43
+ end
44
+
45
+ def send_notification_to_authors
46
+ coauthors = resource.try(:coauthorships)&.map do |coauthorship|
47
+ coauthorship.decidim_author_type.constantize.find(coauthorship.decidim_author_id)
48
+ end || []
49
+
50
+ recipients = (resource.try(:authors) || [resource.try(:author)]).compact + coauthors
51
+
52
+ return if recipients.empty?
53
+
54
+ Decidim::EventsManager.publish(
55
+ event: "decidim.events.resources.soft_deleted",
56
+ event_class: Decidim::SoftDeleteResourceEvent,
57
+ resource:,
58
+ affected_users: recipients.uniq
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
@@ -142,6 +142,13 @@ module Decidim
142
142
  @seeds&.call(participatory_space)
143
143
  end
144
144
 
145
+ # The name of the named Rails route to create the url to the resource.
146
+ #
147
+ # Returns a String.
148
+ def route_name
149
+ "component"
150
+ end
151
+
145
152
  # Public: Adds configurable attributes for this component, scoped to a name. It
146
153
  # uses the DSL specified under `Decidim::SettingsManifest`.
147
154
  #
@@ -18,6 +18,7 @@ module Decidim
18
18
  autoload :AreaTypeType, "decidim/api/types/area_type_type"
19
19
  autoload :AttachmentType, "decidim/api/types/attachment_type"
20
20
  autoload :CategoryType, "decidim/api/types/category_type"
21
+ autoload :TaxonomyType, "decidim/api/types/taxonomy_type"
21
22
  autoload :ComponentType, "decidim/api/types/component_type"
22
23
  autoload :CoordinatesType, "decidim/api/types/coordinates_type"
23
24
  autoload :DecidimType, "decidim/api/types/decidim_type"
@@ -64,6 +65,7 @@ module Decidim
64
65
  autoload :AuthorableInterface, "decidim/api/interfaces/authorable_interface"
65
66
  autoload :CoauthorableInterface, "decidim/api/interfaces/coauthorable_interface"
66
67
  autoload :CategoriesContainerInterface, "decidim/api/interfaces/categories_container_interface"
68
+ autoload :TaxonomizableInterface, "decidim/api/interfaces/taxonomizable_interface"
67
69
  autoload :CategorizableInterface, "decidim/api/interfaces/categorizable_interface"
68
70
  autoload :ScopableInterface, "decidim/api/interfaces/scopable_interface"
69
71
  autoload :AttachableInterface, "decidim/api/interfaces/attachable_interface"