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,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddComponentCounterToTaxonomyFilters < ActiveRecord::Migration[7.0]
4
+ def change
5
+ add_column :decidim_taxonomy_filters, :components_count, :integer, null: false, default: 0
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddNamesAndSpaceBooleanToTaxonomyFilters < ActiveRecord::Migration[7.0]
4
+ def change
5
+ add_column :decidim_taxonomy_filters, :name, :jsonb, default: {}
6
+ add_column :decidim_taxonomy_filters, :internal_name, :jsonb, default: {}
7
+ add_column :decidim_taxonomy_filters, :space_filter, :boolean, null: false, default: false
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddTaxonomyToMetrics < ActiveRecord::Migration[7.0]
4
+ def change
5
+ add_reference :decidim_metrics, :decidim_taxonomy, index: true
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddParticipatorySpaceManifestsFromTaxonomyFilters < ActiveRecord::Migration[7.0]
4
+ def change
5
+ remove_column :decidim_taxonomy_filters, :space_manifest
6
+ remove_column :decidim_taxonomy_filters, :space_filter
7
+ add_column :decidim_taxonomy_filters, :participatory_space_manifests, :string, array: true, default: [], null: false
8
+ end
9
+ end
data/decidim-core.gemspec CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.summary = "The core of the Decidim framework."
23
23
  s.description = "Adds core features so other engines can hook into the framework."
24
24
  s.license = "AGPL-3.0-or-later"
25
- s.required_ruby_version = "~> 3.2.0"
25
+ s.required_ruby_version = "~> 3.3.0"
26
26
 
27
27
  s.files = Dir.chdir(__dir__) do
28
28
  `git ls-files -z`.split("\x0").select do |f|
@@ -36,57 +36,54 @@ Gem::Specification.new do |s|
36
36
 
37
37
  s.add_dependency "active_link_to", "~> 1.0"
38
38
  s.add_dependency "acts_as_list", "~> 1.0"
39
- s.add_dependency "batch-loader", "~> 1.2"
40
- s.add_dependency "browser", "~> 2.7"
39
+ s.add_dependency "batch-loader", "~> 2.0"
40
+ s.add_dependency "browser", "~> 6.2.0"
41
41
  s.add_dependency "cells-erb", "~> 0.1.0"
42
42
  s.add_dependency "cells-rails", "~> 0.1.3"
43
43
  s.add_dependency "charlock_holmes", "~> 0.7"
44
+ s.add_dependency "chartkick", "~> 5.1.2"
44
45
  s.add_dependency "date_validator", "~> 0.12.0"
45
46
  s.add_dependency "devise", "~> 4.7"
46
- s.add_dependency "devise-i18n", "~> 1.2", "< 1.11.1"
47
+ s.add_dependency "devise-i18n", "~> 1.2"
47
48
  s.add_dependency "diffy", "~> 3.3"
48
49
  s.add_dependency "doorkeeper", "~> 5.6", ">= 5.6.6"
49
50
  s.add_dependency "doorkeeper-i18n", "~> 4.0"
50
51
  s.add_dependency "file_validators", "~> 3.0"
51
52
  s.add_dependency "fog-local", "~> 0.6"
52
- s.add_dependency "foundation_rails_helper", "~> 4.0"
53
53
  s.add_dependency "geocoder", "~> 1.8"
54
54
  s.add_dependency "hashdiff", ">= 0.4.0", "< 2.0.0"
55
+ s.add_dependency "hexapdf", "~> 1.1.0"
55
56
  s.add_dependency "image_processing", "~> 1.2"
56
57
  s.add_dependency "invisible_captcha", "~> 0.12"
57
58
  s.add_dependency "kaminari", "~> 1.2", ">= 1.2.1"
58
59
  s.add_dependency "loofah", "~> 2.19", ">= 2.19.1"
59
60
  s.add_dependency "mime-types", ">= 1.16", "< 4.0"
60
61
  s.add_dependency "mini_magick", "~> 4.9"
61
- s.add_dependency "net-smtp", "~> 0.3.1"
62
+ s.add_dependency "net-smtp", "~> 0.5.0"
62
63
  s.add_dependency "nokogiri", "~> 1.16", ">= 1.16.2"
63
64
  s.add_dependency "omniauth", "~> 2.0"
64
65
  s.add_dependency "omniauth-facebook", "~> 5.0"
65
66
  s.add_dependency "omniauth-google-oauth2", "~> 1.0"
66
67
  s.add_dependency "omniauth-rails_csrf_protection", "~> 1.0"
67
68
  s.add_dependency "omniauth-twitter", "~> 1.4"
68
- s.add_dependency "paper_trail", "~> 12.0"
69
- s.add_dependency "pg", "~> 1.4.0", "< 2"
69
+ s.add_dependency "paper_trail", "~> 16.0"
70
+ s.add_dependency "paranoia", "~> 3.0.0"
71
+ s.add_dependency "pg", "~> 1.5.0", "< 2"
70
72
  s.add_dependency "pg_search", "~> 2.2"
71
73
  s.add_dependency "premailer-rails", "~> 1.10"
72
- # We need psych 4+ in order to use the `aliases: true` option,
73
- # see https://stackoverflow.com/questions/71191685/visit-psych-nodes-alias-unknown-alias-default-psychbadalias
74
- # Also note that we need Rails 6.1.5+,
75
- # see https://gist.github.com/yahonda/2776d8d7b6ea7045359f38c10449937b
76
- s.add_dependency "psych", "~> 4.0"
77
74
  s.add_dependency "rack", "~> 2.2", ">= 2.2.8.1"
78
75
  s.add_dependency "rack-attack", "~> 6.0"
79
76
  s.add_dependency "rails", "~> 7.0.8"
80
77
  s.add_dependency "rails-i18n", "~> 7.0"
81
- s.add_dependency "ransack", "~> 3.2.1"
78
+ s.add_dependency "ransack", "~> 4.2.0"
82
79
  s.add_dependency "redis", "~> 4.1"
83
- s.add_dependency "request_store", "~> 1.5.0"
80
+ s.add_dependency "request_store", "~> 1.7.0"
84
81
  s.add_dependency "rubyXL", "~> 3.4"
85
82
  s.add_dependency "rubyzip", "~> 2.0"
86
83
  s.add_dependency "shakapacker", "~> 7.1.0"
87
- s.add_dependency "valid_email2", "~> 4.0"
84
+ s.add_dependency "valid_email2", "~> 7.0"
88
85
  s.add_dependency "web-push", "~> 3.0"
89
- s.add_dependency "wisper", "~> 2.0"
86
+ s.add_dependency "wisper", "~> 3.0"
90
87
 
91
88
  s.add_development_dependency "decidim-api", Decidim::Core.version
92
89
  s.add_development_dependency "decidim-dev", Decidim::Core.version
@@ -14,7 +14,7 @@ module Decidim
14
14
 
15
15
  def action_authorized_to(action, resource: nil, permissions_holder: nil)
16
16
  action_authorization_cache[action_authorization_cache_key(action, resource, permissions_holder)] ||=
17
- ::Decidim::ActionAuthorizer.new(current_user, action, permissions_holder || resource&.component || current_component, resource).authorize
17
+ ::Decidim::ActionAuthorizer.new(current_user, action, permissions_holder || resource.try(:component) || current_component, resource).authorize
18
18
  end
19
19
 
20
20
  def action_authorization_cache
@@ -29,7 +29,8 @@ module Decidim
29
29
  elsif permissions_holder
30
30
  "#{action}-#{permissions_holder.class.name}-#{permissions_holder.id}"
31
31
  else
32
- "#{action}-#{current_component.id}"
32
+ component = resource.try(:component) || current_component
33
+ "#{action}-#{component.id}"
33
34
  end
34
35
  end
35
36
  end
@@ -57,7 +57,7 @@ module Decidim
57
57
  when "participants"
58
58
  return only_amendables unless user
59
59
 
60
- where.not(id: joins(:amendable).where.not("decidim_amendments.decidim_user_id = ?", user.id))
60
+ where.not(id: joins(:amendable).where.not(decidim_amendments: { decidim_user_id: user.id }))
61
61
  else # Assume 'all'
62
62
  all
63
63
  end
@@ -10,9 +10,11 @@ module Decidim
10
10
  type: [ID, { null: true }],
11
11
  description: "Returns the sub-categories for the given parent category or top-level categories if set to `null`",
12
12
  required: false,
13
- prepare: lambda { |parent_id, _ctx|
14
- { parent_id: }
15
- }
13
+ prepare: :prepare_parent_id
14
+
15
+ def self.prepare_parent_id(parent_id, _ctx)
16
+ { parent_id: }
17
+ end
16
18
  end
17
19
  end
18
20
  end
@@ -9,40 +9,53 @@ module Decidim
9
9
  graphql_name "ComponentFilter"
10
10
  description "A type used for filtering any component parent objects"
11
11
 
12
- argument :type,
13
- type: GraphQL::Types::String,
14
- description: "Filters by type of component",
15
- required: false,
16
- prepare: lambda { |value, _ctx|
17
- { manifest_name: value.downcase }
18
- }
19
12
  argument :name,
20
13
  type: GraphQL::Types::String,
21
14
  description: "Filters by name of the component, additional locale parameter can be provided to specify in which to search",
22
15
  required: false,
23
- prepare: lambda { |search, ctx|
24
- lambda { |model_name, locale|
25
- locale = ctx[:current_organization].default_locale if locale.blank?
26
- op = Arel::Nodes::InfixOperation.new("->>", model_name.arel_table[:name], Arel::Nodes.build_quoted(locale))
27
- op.matches("%#{search}%")
28
- }
29
- }
16
+ prepare: :prepare_name
17
+
18
+ argument :type,
19
+ type: GraphQL::Types::String,
20
+ description: "Filters by type of component",
21
+ required: false,
22
+ prepare: :prepare_type
30
23
 
31
24
  argument :with_geolocation_enabled,
32
25
  type: GraphQL::Types::Boolean,
33
26
  description: "Returns components with geolocation activated (may be Proposals or Meetings)",
34
27
  required: false,
35
- prepare: lambda { |active, _ctx|
36
- ->(_model_name, _locale) { ["(settings->'global'->>'geocoding_enabled')::boolean is ? or manifest_name='meetings'", active] }
37
- }
28
+ prepare: :prepare_geolocation_enabled
38
29
 
39
30
  argument :with_comments_enabled,
40
31
  type: GraphQL::Types::Boolean,
41
32
  description: "Returns components with comments enabled globally (can still be deactivated in the current step if the component has steps)",
42
33
  required: false,
43
- prepare: lambda { |active, _ctx|
44
- ->(_model_name, _locale) { ["(settings->'global'->>'comments_enabled')::boolean is ?", active] }
45
- }
34
+ prepare: :prepare_comments_enabled
35
+
36
+ def self.prepare_comments_enabled(active, _ctx)
37
+ lambda do |_model_name, _locale|
38
+ ["(settings->'global'->>'comments_enabled')::boolean is ?", active]
39
+ end
40
+ end
41
+
42
+ def self.prepare_geolocation_enabled(active, _ctx)
43
+ lambda do |_model_name, _locale|
44
+ ["(settings->'global'->>'geocoding_enabled')::boolean is ? or manifest_name='meetings'", active]
45
+ end
46
+ end
47
+
48
+ def self.prepare_name(search, ctx)
49
+ lambda do |model_name, locale|
50
+ locale = ctx[:current_organization].default_locale if locale.blank?
51
+ op = Arel::Nodes::InfixOperation.new("->>", model_name.arel_table[:name], Arel::Nodes.build_quoted(locale))
52
+ op.matches("%#{search}%")
53
+ end
54
+ end
55
+
56
+ def self.prepare_type(value, _ctx)
57
+ { manifest_name: value.downcase }
58
+ end
46
59
  end
47
60
  end
48
61
  end
@@ -27,63 +27,72 @@ module Decidim
27
27
  ```
28
28
  "
29
29
 
30
- argument :type,
31
- type: String,
32
- description: "Filters by type of entity (User or UserGroup)",
30
+ argument :exclude_ids,
31
+ type: [ID],
32
+ description: "Excludes users contained in given ids. Valid values are one or more IDs (passed as an array)",
33
33
  required: false,
34
- prepare: lambda { |value, _ctx|
35
- type = value.downcase.camelcase
36
- type = "UserGroup" if %w(Group Usergroup).include?(type)
37
- { type: "Decidim::#{type}" }
38
- }
34
+ prepare: :prepare_exclude_ids
39
35
  argument :name,
40
36
  type: String,
41
37
  description: "Filters by name of the user entity. Searches (case-insensitive) any fragment of the provided string",
42
38
  required: false,
43
- prepare: lambda { |value, _ctx|
44
- [
45
- lambda { |model_class, _locale|
46
- model_class.arel_table[:name].matches("%#{value}%")
47
- }
48
- ]
49
- }
39
+ prepare: :prepare_name
50
40
  argument :nickname,
51
41
  type: String,
52
42
  description: "Filters by nickname of the user entity. Searches (case-insensitive) any fragment of the provided string",
53
43
  required: false,
54
- prepare: lambda { |value, _ctx|
55
- value = value[1..-1] if value.starts_with? "@"
56
- [
57
- lambda { |model_class, _locale|
58
- model_class.arel_table[:nickname].matches("%#{value}%")
59
- }
60
- ]
61
- }
44
+ prepare: :prepare_nickname
45
+ argument :type,
46
+ type: String,
47
+ description: "Filters by type of entity (User or UserGroup)",
48
+ required: false,
49
+ prepare: :prepare_type
62
50
  argument :wildcard,
63
51
  type: String,
64
52
  description: "Filters by nickname or name of the user entity. Searches (case-insensitive) any fragment of the provided string",
65
53
  required: false,
66
- prepare: lambda { |value, _ctx|
67
- value = value[1..-1] if value.starts_with? "@"
68
- [
69
- lambda { |model_class, _locale|
70
- op_name = model_class.arel_table[:name].matches("%#{value}%")
71
- op_nick = model_class.arel_table[:nickname].matches("%#{value}%")
72
- op_name.or(op_nick)
73
- }
74
- ]
75
- }
76
- argument :exclude_ids,
77
- type: [ID],
78
- description: "Excludes users contained in given ids. Valid values are one or more IDs (passed as an array)",
79
- required: false,
80
- prepare: lambda { |value, _ctx|
81
- [
82
- lambda { |model_class, _locale|
83
- model_class.arel_table[:id].not_in(value)
84
- }
85
- ]
86
- }
54
+ prepare: :prepare_wildcard
55
+ def self.prepare_nickname(value, _ctx)
56
+ value = value[1..-1] if value.starts_with? "@"
57
+ [
58
+ lambda do |model_class, _locale|
59
+ model_class.arel_table[:nickname].matches("%#{value}%")
60
+ end
61
+ ]
62
+ end
63
+
64
+ def self.prepare_name(value, _ctx)
65
+ [
66
+ lambda do |model_class, _locale|
67
+ model_class.arel_table[:name].matches("%#{value}%")
68
+ end
69
+ ]
70
+ end
71
+
72
+ def self.prepare_exclude_ids(value, _ctx)
73
+ [
74
+ lambda do |model_class, _locale|
75
+ model_class.arel_table[:id].not_in(value)
76
+ end
77
+ ]
78
+ end
79
+
80
+ def self.prepare_type(value, _ctx)
81
+ type = value.downcase.camelcase
82
+ type = "UserGroup" if %w(Group Usergroup).include?(type)
83
+ { type: "Decidim::#{type}" }
84
+ end
85
+
86
+ def self.prepare_wildcard(value, _ctx)
87
+ value = value[1..-1] if value.starts_with? "@"
88
+ [
89
+ lambda do |model_class, _locale|
90
+ op_name = model_class.arel_table[:name].matches("%#{value}%")
91
+ op_nick = model_class.arel_table[:nickname].matches("%#{value}%")
92
+ op_name.or(op_nick)
93
+ end
94
+ ]
95
+ end
87
96
  end
88
97
  end
89
98
  end
@@ -9,24 +9,26 @@ module Decidim
9
9
  description "A type used for sorting any component parent objects"
10
10
 
11
11
  argument :id, GraphQL::Types::String, "Sort by ID, valid values are ASC or DESC", required: false
12
- argument :weight, GraphQL::Types::String, "Sort by weight (order in the website), valid values are ASC or DESC", required: false
13
- argument :type,
14
- type: GraphQL::Types::String,
15
- description: "Sort by type of component, alphabetically, valid values are ASC or DESC",
16
- required: false,
17
- as: :manifest_name
18
12
  argument :name,
19
13
  type: GraphQL::Types::String,
20
14
  description: "Sort by name of the component, alphabetically, valid values are ASC or DESC",
21
15
  required: false,
22
16
  as: :name,
23
- prepare: lambda { |direction, ctx|
24
- lambda { |locale|
25
- locale = ctx[:current_organization].default_locale if locale.blank?
26
- field = Arel::Nodes::InfixOperation.new("->", Arel.sql("name"), Arel::Nodes.build_quoted(locale))
27
- Arel::Nodes::InfixOperation.new("", field, Arel.sql(direction.upcase))
28
- }
29
- }
17
+ prepare: :prepared_name
18
+ argument :type,
19
+ type: GraphQL::Types::String,
20
+ description: "Sort by type of component, alphabetically, valid values are ASC or DESC",
21
+ required: false,
22
+ as: :manifest_name
23
+ argument :weight, GraphQL::Types::String, "Sort by weight (order in the website), valid values are ASC or DESC", required: false
24
+
25
+ def self.prepared_name(direction, ctx)
26
+ lambda do |locale|
27
+ locale = ctx[:current_organization].default_locale if locale.blank?
28
+ field = Arel::Nodes::InfixOperation.new("->", Arel.sql("name"), Arel::Nodes.build_quoted(locale))
29
+ Arel::Nodes::InfixOperation.new("", field, Arel.sql(direction.upcase))
30
+ end
31
+ end
30
32
  end
31
33
  end
32
34
  end
@@ -7,10 +7,6 @@ module Decidim
7
7
  description "A type used for sorting any component parent objects"
8
8
 
9
9
  argument :id, GraphQL::Types::String, "Sort by ID, valid values are ASC or DESC", required: false
10
- argument :type,
11
- type: GraphQL::Types::String,
12
- description: "Sort by type of user entity (user or group), alphabetically, valid values are ASC or DESC",
13
- required: false
14
10
  argument :name,
15
11
  type: GraphQL::Types::String,
16
12
  description: "Sort by name of the user entity (user or group), alphabetically, valid values are ASC or DESC",
@@ -19,6 +15,10 @@ module Decidim
19
15
  type: GraphQL::Types::String,
20
16
  description: "Sort by nickname of the user entity (user or group), alphabetically, valid values are ASC or DESC",
21
17
  required: false
18
+ argument :type,
19
+ type: GraphQL::Types::String,
20
+ description: "Sort by type of user entity (user or group), alphabetically, valid values are ASC or DESC",
21
+ required: false
22
22
  end
23
23
  end
24
24
  end
@@ -9,6 +9,9 @@ module Decidim
9
9
  description "An author"
10
10
 
11
11
  field :id, ID, "The author ID", null: false
12
+
13
+ field :deleted, Boolean, "Whether the author's account has been deleted or not", null: false
14
+
12
15
  field :name, String, "The author's name", null: false
13
16
  field :nickname, String, "The author's nickname", null: false
14
17
 
@@ -21,8 +24,6 @@ module Decidim
21
24
  object.organization.name
22
25
  end
23
26
 
24
- field :deleted, Boolean, "Whether the author's account has been deleted or not", null: false
25
-
26
27
  def self.resolve_type(obj, _ctx)
27
28
  return Decidim::Core::UserType if obj.is_a? Decidim::User
28
29
  return Decidim::Core::UserGroupType if obj.is_a? Decidim::UserGroup
@@ -12,6 +12,11 @@ module Decidim
12
12
  description: "The total amount of co-authors that contributed to the entity. Note that this field may include also non-user authors like meetings or the organization",
13
13
  null: true
14
14
 
15
+ field :authors, [Decidim::Core::AuthorInterface, { null: true }],
16
+ method: :user_identities,
17
+ description: "The resource co-authors. Include only users or groups of users",
18
+ null: false
19
+
15
20
  field :author, Decidim::Core::AuthorInterface,
16
21
  description: "The resource author. Note that this can be null on official proposals or meeting-proposals",
17
22
  null: true
@@ -20,11 +25,6 @@ module Decidim
20
25
  author = object.creator_identity
21
26
  author if author.is_a?(Decidim::User) || author.is_a?(Decidim::UserGroup)
22
27
  end
23
-
24
- field :authors, [Decidim::Core::AuthorInterface, { null: true }],
25
- method: :user_identities,
26
- description: "The resource co-authors. Include only users or groups of users",
27
- null: false
28
28
  end
29
29
  end
30
30
  end
@@ -9,11 +9,11 @@ module Decidim
9
9
 
10
10
  field :endorsements, [Decidim::Core::AuthorInterface, { null: true }], "The endorsements of this object.", null: false
11
11
 
12
+ field :endorsements_count, Integer, description: "The total amount of endorsements the object has received", null: true
13
+
12
14
  def endorsements
13
15
  object.endorsements.map(&:normalized_author)
14
16
  end
15
-
16
- field :endorsements_count, Integer, description: "The total amount of endorsements the object has received", null: true
17
17
  end
18
18
  end
19
19
  end
@@ -8,11 +8,13 @@ module Decidim
8
8
  description "The interface that all participatory spaces should implement."
9
9
 
10
10
  field :id, GraphQL::Types::ID, "The participatory space's unique ID", null: false
11
-
11
+ field :components, [ComponentInterface, { null: true }], null: true, description: "Lists the components this space contains." do
12
+ argument :filter, ComponentInputFilter, "Provides several methods to filter the results", required: false
13
+ argument :order, ComponentInputSort, "Provides several methods to order the results", required: false
14
+ end
15
+ field :stats, [Decidim::Core::StatisticType, { null: true }], "The statistics collection of this participatory space", null: true
12
16
  field :title, TranslatedFieldType, "The graphql_name of this participatory space.", null: false
13
-
14
17
  field :type, String, description: "The participatory space class name. i.e. Decidim::ParticipatoryProcess", null: false
15
-
16
18
  field :manifest, Decidim::Core::ParticipatorySpaceManifestType, description: "The manifest information for the participatory space.", null: false
17
19
 
18
20
  def type
@@ -23,17 +25,10 @@ module Decidim
23
25
  ParticipatorySpaceManifestPresenter.new(object.manifest, object.organization)
24
26
  end
25
27
 
26
- field :components, [ComponentInterface, { null: true }], null: true, description: "Lists the components this space contains." do
27
- argument :filter, ComponentInputFilter, "Provides several methods to filter the results", required: false
28
- argument :order, ComponentInputSort, "Provides several methods to order the results", required: false
29
- end
30
-
31
28
  def components(filter: {}, order: {})
32
29
  ComponentList.new.call(object, { filter:, order: }, context)
33
30
  end
34
31
 
35
- field :stats, [Decidim::Core::StatisticType, { null: true }], null: true
36
-
37
32
  def stats
38
33
  return if object.respond_to?(:show_statistics) && !object.show_statistics
39
34
 
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Core
5
+ # This interface represents a categorizable object.
6
+ module TaxonomizableInterface
7
+ include Decidim::Api::Types::BaseInterface
8
+ description "An interface that can be used in taxonomizable objects."
9
+
10
+ field :taxonomies, [Decidim::Core::TaxonomyType], "The object's taxonomies", null: true
11
+ end
12
+ end
13
+ end
@@ -5,15 +5,13 @@ module Decidim
5
5
  class AmendmentType < Decidim::Api::Types::BaseObject
6
6
  description "An amendment"
7
7
 
8
- field :id, GraphQL::Types::ID, "The id of this amendment", null: false
9
- field :state, GraphQL::Types::String, "The status of this amendment", null: false
10
- field :amender, Decidim::Core::AuthorInterface, "The author of this amendment", null: false
11
-
12
- field :amendable_type, GraphQL::Types::String, method: :decidim_amendable_type, description: "Type of the amendable object", null: false
13
- field :emendation_type, GraphQL::Types::String, method: :decidim_emendation_type, description: "Type of the emendation object", null: false
14
-
15
8
  field :amendable, AmendableEntityInterface, "The original amended resource (currently, a proposal only)", null: false
9
+ field :amendable_type, GraphQL::Types::String, method: :decidim_amendable_type, description: "Type of the amendable object", null: false
10
+ field :amender, Decidim::Core::AuthorInterface, "The author of this amendment", null: false
16
11
  field :emendation, AmendableEntityInterface, "The emendation (currently, a proposal only)", null: false
12
+ field :emendation_type, GraphQL::Types::String, method: :decidim_emendation_type, description: "Type of the emendation object", null: false
13
+ field :id, GraphQL::Types::ID, "The id of this amendment", null: false
14
+ field :state, GraphQL::Types::String, "The status of this amendment", null: false
17
15
  end
18
16
  end
19
17
  end
@@ -3,14 +3,14 @@
3
3
  module Decidim
4
4
  module Core
5
5
  class AreaApiType < Decidim::Api::Types::BaseObject
6
+ implements Decidim::Core::TimestampsInterface
7
+
6
8
  graphql_name "Area"
7
9
  description "An area."
8
10
 
11
+ field :area_type, Decidim::Core::AreaTypeType, "The area type of this area", null: true
9
12
  field :id, GraphQL::Types::ID, "Internal ID for this area", null: false
10
13
  field :name, Decidim::Core::TranslatedFieldType, "The graphql_name of this area.", null: false
11
- field :area_type, Decidim::Core::AreaTypeType, "The area type of this area", null: true
12
- field :created_at, Decidim::Core::DateTimeType, "The time this assembly was created", null: false
13
- field :updated_at, Decidim::Core::DateTimeType, "The time this assembly was updated", null: false
14
14
  end
15
15
  end
16
16
  end
@@ -5,11 +5,11 @@ module Decidim
5
5
  class AttachmentType < Decidim::Api::Types::BaseObject
6
6
  description "A file attachment"
7
7
 
8
- field :title, Decidim::Core::TranslatedFieldType, "The title of this attachment.", null: false
9
8
  field :description, Decidim::Core::TranslatedFieldType, "The description of this attachment.", null: false
10
- field :url, GraphQL::Types::String, "The url of this attachment", null: false
11
- field :type, GraphQL::Types::String, "The type of this attachment", method: :file_type, null: false
12
9
  field :thumbnail, GraphQL::Types::String, "A thumbnail of this attachment, if it is an image.", method: :thumbnail_url, null: true
10
+ field :title, Decidim::Core::TranslatedFieldType, "The title of this attachment.", null: false
11
+ field :type, GraphQL::Types::String, "The type of this attachment", method: :file_type, null: false
12
+ field :url, GraphQL::Types::String, "The url of this attachment", null: false
13
13
  end
14
14
  end
15
15
  end
@@ -5,10 +5,10 @@ module Decidim
5
5
  class CategoryType < Decidim::Api::Types::BaseObject
6
6
  description "A category that can be applied to other resources."
7
7
 
8
- field :id, GraphQL::Types::ID, null: false
8
+ field :id, GraphQL::Types::ID, "The id for this category", null: false
9
9
  field :name, Decidim::Core::TranslatedFieldType, "The name of this category.", null: false
10
- field :subcategories, [Decidim::Core::CategoryType, { null: true }], "Subcategories of this category.", null: false
11
10
  field :parent, Decidim::Core::CategoryType, "This category's parent category.", null: true
11
+ field :subcategories, [Decidim::Core::CategoryType, { null: true }], "Subcategories of this category.", null: false
12
12
  end
13
13
  end
14
14
  end
@@ -6,8 +6,12 @@ module Decidim
6
6
  class DecidimType < Decidim::Api::Types::BaseObject
7
7
  description "Decidim's framework-related properties."
8
8
 
9
- field :version, GraphQL::Types::String, "The current decidim's version of this deployment.", null: false
10
9
  field :application_name, GraphQL::Types::String, "The current installation's name.", null: false
10
+ field :version, GraphQL::Types::String, "The current decidim's version of this deployment.", null: true
11
+
12
+ def version
13
+ object.version if Decidim::Api.disclose_system_version
14
+ end
11
15
  end
12
16
  end
13
17
  end
@@ -5,8 +5,8 @@ module Decidim
5
5
  class FingerprintType < Decidim::Api::Types::BaseObject
6
6
  description "A fingerprint object"
7
7
 
8
- field :value, GraphQL::Types::String, "The the hash value for the fingerprint", null: false
9
8
  field :source, GraphQL::Types::String, description: "Returns the source String (usually a json) from which the fingerprint is generated.", null: false
9
+ field :value, GraphQL::Types::String, "The the hash value for the fingerprint", null: false
10
10
  end
11
11
  end
12
12
  end
@@ -7,8 +7,8 @@ module Decidim
7
7
  description "Represents a particular translation of a LocalizedStringType"
8
8
 
9
9
  field :locale, GraphQL::Types::String, "The standard locale of this translation.", null: false
10
- field :text, GraphQL::Types::String, "The content of this translation.", null: true
11
10
  field :machine_translated, GraphQL::Types::Boolean, "Whether this string is machine translated or not.", null: false
11
+ field :text, GraphQL::Types::String, "The content of this translation.", null: true
12
12
 
13
13
  def machine_translated
14
14
  if object.respond_to?(:machine_translated)