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
@@ -19,5 +19,24 @@ module Decidim
19
19
  Decidim.participatory_space_manifests.map(&:data_portable_entities).flatten |
20
20
  (Decidim::Comments.data_portable_entities.flatten if defined?(Decidim::Comments))
21
21
  end
22
+
23
+ def self.help_definitions_for(user)
24
+ export_format = "CSV"
25
+ help_definition = {}
26
+
27
+ data_entities.each do |object|
28
+ klass = Object.const_get(object)
29
+ exporter = Exporters.find_exporter(export_format).new(klass.user_collection(user), klass.export_serializer)
30
+ entity = klass.model_name.route_key
31
+ headers = exporter.headers_without_locales
32
+ help_definition[entity] = {}
33
+
34
+ headers.each do |header|
35
+ help_definition[entity][header] = I18n.t("decidim.open_data.help.#{entity}.#{header}", default: I18n.t("decidim.download_your_data.help.#{entity}.#{header}"))
36
+ end
37
+ end
38
+
39
+ help_definition
40
+ end
22
41
  end
23
42
  end
@@ -30,6 +30,12 @@ module Decidim
30
30
  @headers ||= processed_collection.inject([]) { |keys, resource| keys | resource.keys }
31
31
  end
32
32
 
33
+ def headers_without_locales
34
+ return [] if collection.empty?
35
+
36
+ @headers_without_locales ||= @serializer.new(collection.first).run.keys
37
+ end
38
+
33
39
  protected
34
40
 
35
41
  def custom_sanitize(value)
@@ -14,6 +14,12 @@ module Decidim
14
14
 
15
15
  # A setting to choose if the collection exported by this manifest should
16
16
  # be included in the open data export available for all users.
17
+ #
18
+ # Optionally, you can define a specific serializer using the `open_data_serializer` method
19
+ # to have a granular control on which fields are added to the open data export.
20
+ # This is specially useful for ParticipatorySpaces, as the serializer is used for the
21
+ # export/import feature, and we do not want to publish some of the data available there
22
+ # (as the components settings).
17
23
  attribute :include_in_open_data, Boolean, default: false
18
24
 
19
25
  attr_reader :name, :manifest
@@ -73,6 +79,14 @@ module Decidim
73
79
  @serializer ||= serializer || Decidim::Exporters::Serializer
74
80
  end
75
81
 
82
+ # Public: Sets the open data serializer when an argument is provided, returns the
83
+ # stored serializer otherwise.
84
+ #
85
+ # See more information in the `serializer` method.
86
+ def open_data_serializer(serializer = nil)
87
+ @open_data_serializer ||= serializer || nil
88
+ end
89
+
76
90
  DEFAULT_FORMATS = %w(CSV JSON Excel).freeze
77
91
 
78
92
  # Public: Sets the available formats if an argument is provided and
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "wicked_pdf"
3
+ require "hexapdf"
4
4
 
5
5
  module Decidim
6
6
  module Exporters
@@ -10,47 +10,51 @@ module Decidim
10
10
  # the desired template, layout and orientation.
11
11
  #
12
12
  class PDF < Exporter
13
+ include Decidim::TranslatableAttributes
14
+ include Decidim::SanitizeHelper
15
+
13
16
  # Public: Exports a PDF version of the collection by rendering
14
17
  # the template into html and then converting it to PDF.
15
18
  #
16
19
  # Returns an ExportData instance.
17
20
  def export
18
- html = controller.render_to_string(
19
- template:,
20
- layout:,
21
- locals:
22
- )
21
+ composer.styles(**styles)
23
22
 
24
- document = WickedPdf.new.pdf_from_string(html, orientation:)
23
+ add_data!
25
24
 
26
- ExportData.new(document, "pdf")
25
+ ExportData.new(composer.write_to_string, "pdf")
27
26
  end
28
27
 
29
- # may be overwritten if needed
30
- def orientation
31
- "Portrait"
28
+ protected
29
+
30
+ delegate :document, to: :composer
31
+ delegate :layout, to: :document
32
+
33
+ def font
34
+ @font ||= load_font("source-sans-pro-v21-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-regular.ttf")
32
35
  end
33
36
 
34
- # implementing classes should return a valid ERB path here
35
- def template
36
- raise NotImplementedError
37
+ def bold_font
38
+ @bold_font ||= load_font("source-sans-pro-v21-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-700.ttf")
37
39
  end
38
40
 
39
- # implementing classes should return a valid ERB path here
40
- def layout
41
- raise NotImplementedError
41
+ def load_font(path)
42
+ document.fonts.add(Decidim::Core::Engine.root.join("app/packs/fonts/decidim/").join(path))
42
43
  end
43
44
 
44
- # This method may be overwritten if the template needs more local variables
45
- def locals
46
- { collection: }
45
+ def composer
46
+ @composer ||= ::HexaPDF::Composer.new(page_size:, page_orientation:)
47
47
  end
48
48
 
49
- protected
49
+ def page_size = :A4
50
50
 
51
- def controller
51
+ def page_orientation = :portrait
52
+
53
+ def add_data!
52
54
  raise NotImplementedError
53
55
  end
56
+
57
+ def styles = {}
54
58
  end
55
59
  end
56
60
  end
@@ -13,9 +13,8 @@ module Decidim
13
13
  # if represented by an array containing a value and a name or a check_boxes_tree
14
14
  # struct as defined in Decidim::CheckBoxesTreeHelper for more complex situations
15
15
  # which require nested options.
16
- # @param label_scope [String] The scope used to translate the title of the section.
17
- # @param id [String] The id of the section. It is also used to get the translation of
18
- # the section title.
16
+ # @param label [String] The title of the section.
17
+ # @param id [String] The id of the section.
19
18
  # @param options [Hash] Additional options. Except :type, the rest of options are passed
20
19
  # to the partial used to generate the section.
21
20
  # @option options [Symbol, String] :type The type of selector to use with the collection.
@@ -23,7 +22,7 @@ module Decidim
23
22
  # tree struct is passed. The default selector for arrays is radio_buttons.
24
23
  #
25
24
  # @return [ActionView::OutputBuffer] the HTML of the generated collection filter.
26
- def collection_filter(method:, collection:, label_scope:, id:, **options)
25
+ def collection_filter(method:, collection:, label:, id:, **options)
27
26
  type = options.delete(:type) || default_form_type_for_collection(collection)
28
27
 
29
28
  case type.to_s
@@ -31,29 +30,27 @@ module Decidim
31
30
  options.merge!(builder_type: type.to_s.pluralize)
32
31
  type = "collection"
33
32
  when "check_boxes_tree"
34
- options.merge!(check_boxes_tree_id: check_boxes_tree_id(method))
33
+ options.merge!(check_boxes_tree_id: check_boxes_tree_id(method.to_s.gsub(/\[|\]/, "_"), id))
35
34
  end
36
35
 
37
36
  @template.render(
38
37
  "decidim/shared/filters/#{type}",
39
- **options.merge(
40
- method:,
41
- collection:,
42
- label_scope:,
43
- id:,
44
- form: self
45
- )
38
+ **options, method:,
39
+ collection:,
40
+ label:,
41
+ id:,
42
+ form: self
46
43
  )
47
44
  end
48
45
 
49
46
  def dropdown_label(item, method, options = {})
50
- @template.render("decidim/shared/filters/dropdown_label", **options.merge(item:, method:, form: self))
47
+ @template.render("decidim/shared/filters/dropdown_label", **options, item:, method:, form: self)
51
48
  end
52
49
 
53
50
  private
54
51
 
55
- def check_boxes_tree_id(method)
56
- method
52
+ def check_boxes_tree_id(*args)
53
+ args.map(&:to_s).join("_")
57
54
  end
58
55
 
59
56
  def default_form_type_for_collection(collection)
@@ -1,11 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "foundation_rails_helper/form_builder"
4
-
5
3
  module Decidim
6
4
  # This custom FormBuilder adds fields needed to deal with translatable fields,
7
5
  # following the conventions set on `Decidim::TranslatableAttributes`.
8
- class FormBuilder < FoundationRailsHelper::FormBuilder
6
+ class FormBuilder < LegacyFormBuilder
9
7
  include ActionView::Context
10
8
  include Decidim::TranslatableAttributes
11
9
  include Decidim::Map::Autocomplete::FormBuilder
@@ -62,7 +60,7 @@ module Decidim
62
60
  #
63
61
  # Renders form fields for each locale.
64
62
  def translated(type, name, options = {})
65
- return translated_one_locale(type, name, locales.first, options.merge(label: (options[:label] || label_for(name)))) if locales.count == 1
63
+ return translated_one_locale(type, name, locales.first, options.merge(label: options[:label] || label_for(name))) if locales.count == 1
66
64
 
67
65
  tabs_id = sanitize_tabs_selector(options[:tabs_id] || "#{object_name}-#{name}-tabs")
68
66
 
@@ -98,7 +96,7 @@ module Decidim
98
96
  field attribute, options do |opts|
99
97
  opts[:autocomplete] ||= :off
100
98
  opts[:class] ||= "input-group-field"
101
- method(__method__).super_method.super_method.call(attribute, opts)
99
+ super(attribute, opts)
102
100
  end
103
101
  end
104
102
 
@@ -225,35 +223,6 @@ module Decidim
225
223
  end
226
224
  end
227
225
 
228
- # Public: Generates a select field with the categories. Only leaf categories can be set as selected.
229
- #
230
- # name - The name of the field (usually category_id)
231
- # collection - A collection of categories.
232
- # options - An optional Hash with options:
233
- # - prompt - An optional String with the text to display as prompt.
234
- # - disable_parents - A Boolean to disable parent categories. Defaults to `true`.
235
- # html_options - HTML options for the select
236
- #
237
- # Returns a String.
238
- def categories_select(name, collection, options = {}, html_options = {})
239
- options = {
240
- disable_parents: true
241
- }.merge(options)
242
-
243
- disable_parents = options[:disable_parents]
244
-
245
- selected = object.send(name)
246
- selected = selected.first if selected.is_a?(Array) && selected.length > 1
247
- categories = categories_for_select(collection)
248
- disabled = if disable_parents
249
- disabled_categories_for(collection)
250
- else
251
- []
252
- end
253
-
254
- select(name, @template.options_for_select(categories, selected:, disabled:), options, html_options)
255
- end
256
-
257
226
  # Public: Generates a select field for areas.
258
227
  #
259
228
  # name - The name of the field (usually area_id)
@@ -301,46 +270,6 @@ module Decidim
301
270
  select(name, @template.options_for_select(resources, selected: options[:selected]), options)
302
271
  end
303
272
 
304
- # Public: Generates a picker field for scope selection.
305
- #
306
- # attribute - The name of the field (usually scope_id)
307
- # options - An optional Hash with options:
308
- # - multiple - Multiple mode, to allow multiple scopes selection.
309
- # - label - Show label?
310
- # - checkboxes_on_top - Show checked picker values on top (default) or below the picker prompt (only for multiple pickers)
311
- # - namespace - prepend a custom name to the html element's DOM id.
312
- #
313
- # Also it should receive a block that returns a Hash with :url and :text for each selected scope (and for null scope for prompt)
314
- #
315
- # Returns a String.
316
- def scopes_picker(attribute, options = {})
317
- id = if self.options.has_key?(:namespace)
318
- "#{self.options[:namespace]}_#{sanitize_for_dom_selector(@object_name)}"
319
- else
320
- "#{sanitize_for_dom_selector(@object_name)}_#{attribute}"
321
- end
322
-
323
- picker_options = {
324
- id:,
325
- class: "picker-#{options[:multiple] ? "multiple" : "single"}",
326
- name: "#{@object_name}[#{attribute}]"
327
- }
328
-
329
- picker_options[:class] += " is-invalid-input" if error?(attribute)
330
-
331
- prompt_params = yield(nil)
332
- scopes = selected_scopes(attribute).map { |scope| [scope, yield(scope)] }
333
- template = ""
334
- template += "<label>#{label_for(attribute) + required_for_attribute(attribute)}</label>" unless options[:label] == false
335
- template += @template.render("decidim/scopes/scopes_picker_input",
336
- picker_options:,
337
- prompt_params:,
338
- scopes:,
339
- values_on_top: !options[:multiple] || options[:checkboxes_on_top])
340
- template += error_and_help_text(attribute, options)
341
- template.html_safe
342
- end
343
-
344
273
  # Public: Generates a picker field for selection (either simple or multiselect).
345
274
  #
346
275
  # attribute - The name of the object's attribute.
@@ -378,7 +307,7 @@ module Decidim
378
307
  custom_label(attribute, options[:label], options[:label_options], field_before_label: true) do
379
308
  options.delete(:label)
380
309
  options.delete(:label_options)
381
- @template.check_box(@object_name, attribute, objectify_options(options.except(:help_text)), checked_value, unchecked_value)
310
+ super(attribute, options.except(:help_text), checked_value, unchecked_value)
382
311
  end + error_and_help_text(attribute, options)
383
312
  end
384
313
 
@@ -563,8 +492,6 @@ module Decidim
563
492
  end
564
493
 
565
494
  help_text = options.delete(:help_text)
566
- prefix = options.delete(:prefix)
567
- postfix = options.delete(:postfix)
568
495
 
569
496
  class_options = extract_validations(attribute, options).merge(class_options)
570
497
 
@@ -573,7 +500,7 @@ module Decidim
573
500
  content = content.html_safe
574
501
 
575
502
  html = error_and_help_text(attribute, options.merge(help_text:))
576
- html + wrap_prefix_and_postfix(content, prefix, postfix)
503
+ html + content
577
504
  end
578
505
 
579
506
  # rubocop: disable Metrics/CyclomaticComplexity
@@ -716,30 +643,6 @@ module Decidim
716
643
  content_tag(:span, text, class: "form-error")
717
644
  end
718
645
 
719
- def categories_for_select(scope)
720
- sorted_main_categories = scope.first_class.includes(:subcategories).sort_by do |category|
721
- [category.weight, translated_attribute(category.name, category.participatory_space.organization)]
722
- end
723
-
724
- sorted_main_categories.flat_map do |category|
725
- parent = [[translated_attribute(category.name, category.participatory_space.organization), category.id]]
726
-
727
- sorted_subcategories = category.subcategories.sort_by do |subcategory|
728
- [subcategory.weight, translated_attribute(subcategory.name, subcategory.participatory_space.organization)]
729
- end
730
-
731
- sorted_subcategories.each do |subcategory|
732
- parent << ["- #{translated_attribute(subcategory.name, subcategory.participatory_space.organization)}", subcategory.id]
733
- end
734
-
735
- parent
736
- end
737
- end
738
-
739
- def disabled_categories_for(scope)
740
- scope.first_class.joins(:subcategories).pluck(:id)
741
- end
742
-
743
646
  def tab_element_class_for(type, index)
744
647
  element_class = "tabs-#{type}"
745
648
  element_class += " is-active" if index.zero?
@@ -803,15 +706,6 @@ module Decidim
803
706
  ).html_safe
804
707
  end
805
708
 
806
- # Private: Returns an array of scopes related to object attribute
807
- def selected_scopes(attribute)
808
- selected = object.send(attribute) || []
809
- selected = selected.values if selected.is_a?(Hash)
810
- selected = [selected] unless selected.is_a?(Array)
811
- selected = Decidim::Scope.where(id: selected.map(&:to_i)) unless selected.first.is_a?(Decidim::Scope)
812
- selected
813
- end
814
-
815
709
  # Private: Returns the help text and error tags at the end of the field.
816
710
  # Modified to change the tag to a valid HTML tag inside the <label> element.
817
711
  def error_and_help_text(attribute, options = {})
@@ -870,24 +764,7 @@ module Decidim
870
764
 
871
765
  content_tag(:span,
872
766
  content_tag(:span, options[:value], class: name),
873
- class: column_classes(options).to_s)
874
- end
875
-
876
- # Private: Wraps the prefix and postfix for the field. Overridden from
877
- # FoundationRailsHelper to make the generated HTML valid since these
878
- # elements are printed within <label> elements and <div>'s are not allowed
879
- # there.
880
- def wrap_prefix_and_postfix(block, prefix_options, postfix_options)
881
- prefix = tag_from_options("prefix", prefix_options)
882
- postfix = tag_from_options("postfix", postfix_options)
883
-
884
- input_size = calculate_input_size(prefix_options, postfix_options)
885
- klass = column_classes(input_size.marshal_dump).to_s
886
- input = content_tag(:span, block, class: klass)
887
-
888
- return block unless input_size.changed?
889
-
890
- content_tag(:span, prefix + input + postfix, class: "row collapse")
767
+ class: "columns")
891
768
  end
892
769
 
893
770
  def language_selector_select(locales, tabs_id, name)
@@ -60,7 +60,11 @@ module Decidim
60
60
  def category_belongs_to_organization
61
61
  return unless category
62
62
 
63
- errors.add(:category, :invalid) unless component.categories.exists?(id: category.id)
63
+ errors.add(:category, :invalid) unless component_categories.exists?(id: category.id)
64
+ end
65
+
66
+ def component_categories
67
+ Decidim::Category.where(participatory_space: component.participatory_space)
64
68
  end
65
69
  end
66
70
  end
@@ -33,6 +33,10 @@ module Decidim
33
33
  end
34
34
  end
35
35
 
36
+ def members_public_page?
37
+ private_space && participatory_space_private_users.published.any?
38
+ end
39
+
36
40
  def can_participate?(user)
37
41
  return true unless private_space?
38
42
  return false unless user
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module HasTaxonomySettings
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ after_save :update_components_counter_cache
11
+ after_destroy :update_components_counter_cache
12
+
13
+ def has_taxonomy_settings?
14
+ settings.respond_to?(:taxonomy_filters)
15
+ end
16
+
17
+ def available_taxonomy_filters
18
+ return Decidim::TaxonomyFilter.none unless has_taxonomy_settings?
19
+
20
+ @available_taxonomy_filters ||= Decidim::TaxonomyFilter.for(organization).where(id: settings.taxonomy_filters)
21
+ end
22
+
23
+ def available_root_taxonomies
24
+ return Decidim::Taxonomy.none unless has_taxonomy_settings?
25
+
26
+ @available_root_taxonomies ||= organization.taxonomies.roots.where(id: available_taxonomy_filters.map(&:root_taxonomy_id))
27
+ end
28
+
29
+ def available_taxonomy_ids
30
+ return [] unless has_taxonomy_settings?
31
+
32
+ @available_taxonomy_ids ||= Decidim::TaxonomyFilterItem.where(
33
+ taxonomy_filter_id: available_taxonomy_filters.where(id: settings.taxonomy_filters).pluck(:id)
34
+ ).pluck(:taxonomy_item_id)
35
+ end
36
+
37
+ def update_components_counter_cache
38
+ return unless has_taxonomy_settings?
39
+
40
+ current_filters = attribute("settings")&.dig("global", "taxonomy_filters") || []
41
+ previous_filters = attribute_previously_was("settings")&.dig("global", "taxonomy_filters") || []
42
+
43
+ Decidim::TaxonomyFilter.for(organization).where(id: (current_filters + previous_filters)).each(&:update_components_count)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -25,7 +25,7 @@ module Decidim
25
25
  def validates_avatar(attribute = :avatar, options = {})
26
26
  validates_upload(
27
27
  attribute,
28
- **options.merge(max_size: ->(record) { record.maximum_avatar_size })
28
+ **options, max_size: ->(record) { record.maximum_avatar_size }
29
29
  )
30
30
  end
31
31
 
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2015 Sébastien Gruhier (http://xilinus.com/) - MIT LICENSE
4
+ #
5
+ # This file has been copied and modified from https://github.com/sgruhier/foundation_rails_helper/blob/master/lib/foundation_rails_helper/form_builder.rb
6
+ # We have done this so we can decouple Decidim from this dependency, which is not updated to Rails 7.1
7
+ # We also plan to fully remove Foundation CSS legacy code in the future
8
+
9
+ module Decidim
10
+ class LegacyFormBuilder < ActionView::Helpers::FormBuilder
11
+ include ActionView::Helpers::TagHelper
12
+ include ActionView::Helpers::OutputSafetyHelper
13
+ %w(file_field email_field text_field text_area url_field
14
+ number_field date_field datetime_field search_field color_field)
15
+ .each do |method_name|
16
+ define_method(method_name) do |*args|
17
+ attribute = args[0]
18
+ options = args[1] || {}
19
+ field(attribute, options) do |opts|
20
+ super(attribute, opts)
21
+ end
22
+ end
23
+ end
24
+
25
+ def label(attribute, text = nil, options = {})
26
+ if error?(attribute)
27
+ options[:class] ||= ""
28
+ options[:class] += " is-invalid-label"
29
+ end
30
+
31
+ super(attribute, (text || "").html_safe, options)
32
+ end
33
+
34
+ def radio_button(attribute, tag_value, options = {})
35
+ options[:label_options] ||= {}
36
+ label_options = options.delete(:label_options)&.merge!(value: tag_value)
37
+ label_text = options.delete(:label)
38
+ l = label(attribute, label_text, label_options) unless label_text == false
39
+ r = @template.radio_button(@object_name, attribute, tag_value,
40
+ objectify_options(options))
41
+
42
+ "#{r}#{l}".html_safe
43
+ end
44
+
45
+ def datetime_select(attribute, options = {}, html_options = {})
46
+ field attribute, options, html_options do |html_opts|
47
+ super(attribute, options, html_opts.merge(autocomplete: :off))
48
+ end
49
+ end
50
+
51
+ def date_select(attribute, options = {}, html_options = {})
52
+ field attribute, options, html_options do |html_opts|
53
+ super(attribute, options, html_opts.merge(autocomplete: :off))
54
+ end
55
+ end
56
+
57
+ def time_zone_select(attribute, priorities = nil, options = {}, html_options = {})
58
+ field attribute, options, html_options do |html_opts|
59
+ super(attribute, priorities, options,
60
+ html_opts.merge(autocomplete: :off))
61
+ end
62
+ end
63
+
64
+ def select(attribute, choices, options = {}, html_options = {})
65
+ field attribute, options, html_options do |html_opts|
66
+ html_options[:autocomplete] ||= :off
67
+ super(attribute, choices, options, html_opts)
68
+ end
69
+ end
70
+
71
+ # rubocop:disable Metrics/ParameterLists
72
+ def collection_select(attribute, collection, value_method, text_method, options = {}, html_options = {})
73
+ field attribute, options, html_options do |html_opts|
74
+ html_options[:autocomplete] ||= :off
75
+ super(attribute, collection, value_method, text_method, options,
76
+ html_opts)
77
+ end
78
+ end
79
+ # rubocop:enable Metrics/ParameterLists
80
+
81
+ def autocomplete(attribute, url, options = {})
82
+ field attribute, options do |opts|
83
+ opts.merge!(update_elements: opts[:update_elements],
84
+ min_length: 0, value: object.send(attribute))
85
+ autocomplete_field(attribute, url, opts)
86
+ end
87
+ end
88
+
89
+ def submit(value = nil, options = {})
90
+ options[:class] ||= "button"
91
+ super
92
+ end
93
+
94
+ def error_for(attribute, options = {})
95
+ return unless error?(attribute)
96
+
97
+ class_name = "form-error is-visible"
98
+ class_name += " #{options[:class]}" if options[:class]
99
+
100
+ error_messages = object.errors[attribute].join(", ")
101
+ error_messages = error_messages.html_safe if options[:html_safe_errors]
102
+ content_tag(:small, error_messages,
103
+ class: class_name.sub("is-invalid-input", ""))
104
+ end
105
+
106
+ private
107
+
108
+ def error?(attribute)
109
+ object.respond_to?(:errors) && object.errors[attribute].present?
110
+ end
111
+
112
+ def default_label_text(object, attribute)
113
+ return object.class.human_attribute_name(attribute) if object.class.respond_to?(:human_attribute_name)
114
+
115
+ attribute.to_s.humanize
116
+ end
117
+ end
118
+ end