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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 83ba22655575833dce2ce20e91060aa195abccf10cd5d185dbadbc04e79fcd93
4
- data.tar.gz: a53c89d6b0c01046408b2872119406ffbd1a80a50b943256b872c8575b069e4a
3
+ metadata.gz: 51f519d636709acef9ba64ba8adb8be0c2d554f9f6f38a9e741f607fed90a6da
4
+ data.tar.gz: bb93e7720dd8f5e005cda7dc6fab14d21443d6fcf9c0ba1428b1887a1a785d5f
5
5
  SHA512:
6
- metadata.gz: 07db0787cc696b27044eb8765477b338a16f7263cd29d9231dfd8e7145f5c4b63b19753a90b4d35c5e7614c1a69d47104435fcb2ecf12badea9a1163709ccbef
7
- data.tar.gz: 034e07f956b0ad613172afdd3a56cbb3e37e273555537919073bf75b63dfe8b2ab7ec5502ecf87fb224cd5d525ad009a01e0db6742815ce61eec643c0fa1f1ae
6
+ metadata.gz: 00663f06f72fc52a152b00aac2d0c680a7b9c8d349f737ea5d8f34970ea7f791d71f224579469cfe9ca4aeee3ad7d2aaa1d33bccd898bbd7cc7fa5b8bf158675
7
+ data.tar.gz: 1e504e001f0f88b185a8eae321dffe70696bb17055b0826416bdb16ed44ca51d269d8a461cf56318c2278c0eba2976d41f34fa947be2cb2c88d8d49f9bba6acb
@@ -1,4 +1,6 @@
1
- <%= action_authorized_link_to :amend, new_amend_path, resource: model, data: { "redirect_url" => new_amend_path }, id: "amend-button", class: "button button__sm button__transparent-secondary w-full" do %>
2
- <span><%= t("button", scope: "decidim.amendments.amendable", model_name: nil) %></span>
3
- <%= icon "pencil-line" %>
4
- <% end %>
1
+ <li role="menuitem">
2
+ <%= action_authorized_link_to :amend, new_amend_path, resource: model, data: { "redirect_url" => new_amend_path }, id: "amend-button", class: "button button__sm button__text button__text-secondary" do %>
3
+ <span><%= t("button", scope: "decidim.amendments.amendable", model_name: nil) %></span>
4
+ <%= icon "pencil-line" %>
5
+ <% end %>
6
+ </li>
@@ -4,6 +4,14 @@ module Decidim
4
4
  module Amendable
5
5
  # This cell renders the button to amend the given resource.
6
6
  class AmendButtonCardCell < Decidim::ViewModel
7
+ def show
8
+ return unless amendments_enabled? && model.amendable?
9
+ return unless current_component.current_settings.amendment_creation_enabled
10
+ return unless can_participate_in_private_space?
11
+
12
+ render
13
+ end
14
+
7
15
  def model_name
8
16
  model.model_name.human
9
17
  end
@@ -6,7 +6,7 @@
6
6
 
7
7
  <div id="amendment-list">
8
8
  <% emendations.each do |emendation| %>
9
- <%= card_for emendation, context: { current_user: } %>
9
+ <%= card_for emendation, hide_voting: true, context: { current_user: } %>
10
10
  <% end %>
11
11
  </div>
12
12
  </section>
@@ -1,7 +1,9 @@
1
1
  <%= action_authorized_link_to :amend,
2
2
  promote_amend_path,
3
3
  method: :post,
4
+ resource: emendation,
4
5
  data: { confirm: promote_confirm_text },
6
+ title: promote_amend_button_label,
5
7
  class: "button button__sm button__transparent-secondary" do %>
6
8
  <span><%= promote_amend_button_label %></span>
7
9
  <%= icon "pencil-line" %>
@@ -72,7 +72,7 @@ module Decidim
72
72
  end
73
73
 
74
74
  def show_icons?
75
- layout != :compact
75
+ options[:show_icons] != false && layout != :compact
76
76
  end
77
77
 
78
78
  def context_actions
@@ -0,0 +1 @@
1
+ <!-- This file is intentionally left empty because it may be overwritten by the child cells in case they need to display extra data -->
@@ -110,22 +110,15 @@ module Decidim
110
110
  }
111
111
  end
112
112
 
113
- def scope_item
114
- return unless resource.is_a?(Decidim::ScopableResource) && has_visible_scopes?(resource)
115
-
116
- {
117
- icon: resource_type_icon_key("Decidim::Scope"),
118
- text: translated_attribute(resource.scope.name)
119
- }
120
- end
121
-
122
- def category_item
123
- return unless resource.is_a?(Decidim::HasCategory) && resource.category.present?
124
-
125
- {
126
- text: resource.category.translated_name,
127
- icon: resource_type_icon_key("Decidim::Category")
128
- }
113
+ def taxonomy_items
114
+ return [] unless resource.is_a?(Taxonomizable) && resource.taxonomies.any?
115
+
116
+ resource.taxonomies.map do |taxonomy|
117
+ {
118
+ text: translated_attribute(taxonomy.name),
119
+ icon: resource_type_icon_key("Decidim::Taxonomy")
120
+ }
121
+ end
129
122
  end
130
123
 
131
124
  def enable_links?
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  class CommentsButtonCell < ButtonCell
5
+ include UserRoleChecker
6
+
5
7
  def show
6
8
  if options.has_key?(:display)
7
9
  return render if options[:display]
@@ -9,13 +11,19 @@ module Decidim
9
11
  return
10
12
  end
11
13
 
12
- render if component_settings.comments_enabled? && !current_settings.try(:comments_blocked?)
14
+ render if comments_enabled?
13
15
  end
14
16
 
15
17
  private
16
18
 
19
+ def comments_enabled?
20
+ return true if user_has_any_role?(current_user, current_participatory_space)
21
+
22
+ component_settings.comments_enabled? && !current_settings.try(:comments_blocked?)
23
+ end
24
+
17
25
  def path
18
- "#comments"
26
+ "#add-comment-anchor"
19
27
  end
20
28
 
21
29
  def text
@@ -25,5 +33,9 @@ module Decidim
25
33
  def icon_name
26
34
  resource_type_icon_key "Decidim::Comments::Comment"
27
35
  end
36
+
37
+ def button_classes
38
+ "button button__sm button__transparent-secondary add-comment-mobile"
39
+ end
28
40
  end
29
41
  end
@@ -4,6 +4,8 @@ module Decidim
4
4
  module ContentBlocks
5
5
  class HighlightedElementsCell < BaseCell
6
6
  include Decidim::ContentBlocks::HasRelatedComponents
7
+ include Decidim::ComponentPathHelper
8
+ include Decidim::CardHelper
7
9
 
8
10
  def published_components
9
11
  @published_components ||= if model.settings.try(:component_id).present?
@@ -19,7 +19,7 @@ module Decidim
19
19
  @list_cell ||= cell(
20
20
  list_cell_path,
21
21
  published_components.one? ? published_components.first : published_components,
22
- **model.settings.to_h.merge(see_all_path:)
22
+ **model.settings.to_h, see_all_path:
23
23
  )
24
24
  end
25
25
 
@@ -1,4 +1,3 @@
1
1
  <div id="resource-<%= resource&.id %>-endorsement-block" class="flex gap-2">
2
- <%= cell "decidim/endorsers_list_button", resource %>
3
2
  <%= cell "decidim/endorsement_buttons", resource %>
4
3
  </div>
@@ -2,6 +2,12 @@
2
2
 
3
3
  module Decidim
4
4
  class EndorsementBlockCell < Decidim::ViewModel
5
+ def show
6
+ return unless endorsements_enabled?
7
+
8
+ render :show
9
+ end
10
+
5
11
  alias resource model
6
12
  end
7
13
  end
@@ -1,2 +1,2 @@
1
- <span><%= endorse_translated %></span>
1
+ <span><%= t("decidim.endorsement_buttons_cell.endorse") %></span>
2
2
  <%= endorse_icon %>
@@ -1,5 +1,5 @@
1
1
  <div id="resource-<%= resource&.id %>-endorsement-button">
2
- <button id="select-identity-button" type="button" name="button" class="<%= button_classes %>" data-dialog-open="user-identities" data-dialog-remote-url="<%= reveal_identities_url %>">
2
+ <button id="select-identity-button" type="button" name="button" class="<%= button_classes %>" data-dialog-open="user-identities" data-dialog-remote-url="<%= reveal_identities_url %>" aria-label="<%= endorse_translated %>">
3
3
  <%= render "button_content" %>
4
4
  </button>
5
5
 
@@ -1,17 +1,17 @@
1
1
  <div id="resource-<%= resource&.id %>-endorsement-button">
2
2
  <% path = resource.endorsed_by?(current_user) ? path_to_destroy_endorsement(resource) : path_to_create_endorsement(resource) %>
3
- <% label = resource.endorsed_by?(current_user) ? t("decidim.endorsement_buttons_cell.already_endorsed") : endorse_translated %>
4
3
  <% method = resource.endorsed_by?(current_user) ? :delete : :post %>
5
4
  <%= action_authorized_button_to(
6
5
  :endorse,
7
6
  path,
8
- resource:,
9
- method:,
10
- remote: true,
11
- class: button_classes,
12
- id: "endorsement-button"
7
+ :resource => resource,
8
+ :method => method,
9
+ :remote => true,
10
+ :class => button_classes,
11
+ :id => "endorsement-button",
12
+ "aria-label" => endorse_translated
13
13
  ) do %>
14
- <%= label %>
14
+ <span><%= t("decidim.endorsement_buttons_cell.endorse") %></span>
15
15
  <%= endorse_icon %>
16
16
  <% end %>
17
17
  </div>
@@ -1,5 +1,7 @@
1
1
  <%= button_to(endorsement_path(resource),
2
- data: { "dialog-open": "authorizationModal", "dialog-remote-url": modal_path(:endorse, resource) },
3
- class: button_classes) do %>
2
+ :data => { "dialog-open": "authorizationModal", "dialog-remote-url": modal_path(:endorse, resource) },
3
+ :class => button_classes,
4
+ "aria-label" => endorse_translated
5
+ ) do %>
4
6
  <%= render "button_content" %>
5
7
  <% end %>
@@ -0,0 +1,3 @@
1
+ <section class="hidden layout-main__section" id="endorser-list-<%= model.id %>">
2
+
3
+ </section>
@@ -1,6 +1,18 @@
1
- <div id="dropdown-menu-endorsers-list" class="endorsers-list">
2
- <div class="endorsers-list__text"><%= t("decidim.endorsers_list.endorsed_by") %></div>
3
- <div class="endorsers-list__grid">
4
- <%= render :full_endorsers_list %>
1
+ <%= decidim_modal id: "endorsersModal-#{model.id}", class: "endorsers-list__modal" do %>
2
+ <div data-dialog-container>
3
+ <%= icon "like" %>
4
+ <h2 id="dialog-title-endorsersModal" tabindex="-1" data-dialog-title><%= t("decidim.endorsers_list.title") %></h2>
5
+ <div>
6
+ <% full_endorsers.each do |author| %>
7
+ <div class="list-item__author">
8
+ <div>
9
+ <%= cell "decidim/author", author, has_actions: true, skip_profile_link: true %>
10
+ </div>
11
+ <div class="ml-auto">
12
+ <%= cell("decidim/follow_button", author, button_classes: "button button__sm button__transparent-secondary") %>
13
+ </div>
14
+ </div>
15
+ <% end %>
16
+ </div>
5
17
  </div>
6
- </div>
18
+ <% end %>
@@ -1,11 +1,20 @@
1
- <% visible_endorsers.each do |visible_endorser| %>
2
- <span class="endorsers-list__avatar">
3
- <%= cell "decidim/author", visible_endorser, layout: :avatar, skip_profile_link: true %>
4
- </span>
5
- <% end %>
1
+ <section class="layout-main__section" id="endorser-list-<%= model.id %>">
2
+ <div class="endorsers-list__container">
3
+ <% visible_endorsers.each do |visible_endorser| %>
4
+ <span class="endorsers-list__avatar">
5
+ <%= cell "decidim/author", visible_endorser, layout: :avatar, skip_profile_link: true %>
6
+ </span>
7
+ <% end %>
6
8
 
7
- <% if full_endorsers.length > MAX_ITEMS_STACKED %>
8
- <span class="endorsers-list__counter">
9
- <%= "+" + (endorsers_count - MAX_ITEMS_STACKED).to_s %>
10
- </span>
11
- <% end %>
9
+ <div class="text-center">
10
+ <div class="endorsers-list__text">
11
+ <%= t("decidim.endorsers_list.endorsed_by",
12
+ visible: display_link(voted_by_me? ? t("decidim.endorsers_list.you") : visible_endorsers.first.try(:name)),
13
+ others: display_link(t("decidim.endorsers_list.others", count: endorsers_count - 1), css_class: " first-letter:uppercase"),
14
+ count: endorsers_count
15
+ ) %>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ <%= render :full %>
20
+ </section>
@@ -11,18 +11,15 @@ module Decidim
11
11
  class EndorsersListCell < Decidim::ViewModel
12
12
  include ApplicationHelper
13
13
 
14
- MAX_ITEMS_STACKED = 3
14
+ MAX_ITEMS_STACKED = 8
15
15
 
16
16
  def show
17
+ return render :empty if visible_endorsers.count.zero?
17
18
  return render :full if full_list?
18
19
 
19
20
  render
20
21
  end
21
22
 
22
- def full_endorsers_list
23
- render
24
- end
25
-
26
23
  def endorsers_count
27
24
  base_relation.count
28
25
  end
@@ -37,7 +34,13 @@ module Decidim
37
34
  #
38
35
  # Returns an Array of presented Users/UserGroups
39
36
  def visible_endorsers
40
- @visible_endorsers ||= base_relation.limit(MAX_ITEMS_STACKED).map { |identity| present(identity.normalized_author) }
37
+ @visible_endorsers ||= if voted_by_me?
38
+ base_relation.where.not(author: current_user).limit(MAX_ITEMS_STACKED - 1).map do |identity|
39
+ present(identity.normalized_author)
40
+ end + [present(current_user)]
41
+ else
42
+ base_relation.limit(MAX_ITEMS_STACKED).map { |identity| present(identity.normalized_author) }
43
+ end
41
44
  end
42
45
 
43
46
  def full_endorsers
@@ -47,5 +50,15 @@ module Decidim
47
50
  def base_relation
48
51
  @base_relation ||= model.endorsements.for_listing.includes(:author, :user_group)
49
52
  end
53
+
54
+ def voted_by_me?
55
+ @voted_by_me ||= model.endorsed_by?(current_user)
56
+ end
57
+
58
+ def display_link(text, css_class: "")
59
+ link_to(text, "#",
60
+ class: "text-sm font-semibold text-secondary inline-block #{css_class}",
61
+ data: { "dialog-open": "endorsersModal-#{model.id}" })
62
+ end
50
63
  end
51
64
  end
@@ -10,8 +10,7 @@
10
10
  <%= render :content %>
11
11
  <% end %>
12
12
  <% else %>
13
- <%= action_authorized_button_to(
14
- :follow,
13
+ <%= logged_button_to(
15
14
  path,
16
15
  resource: model,
17
16
  class: button_classes,
@@ -23,6 +23,11 @@ module Decidim
23
23
 
24
24
  private
25
25
 
26
+ # This method is required by action_authorized_button_to
27
+ def current_component
28
+ controller.try(:current_component)
29
+ end
30
+
26
31
  def button_classes
27
32
  options[:button_classes] || "button button__sm button__text-secondary only:m-auto"
28
33
  end
@@ -0,0 +1,3 @@
1
+ <%= dynamic_map_for geocoded_data do %>
2
+ <%= render :template %>
3
+ <% end.html_safe %>
@@ -0,0 +1,14 @@
1
+ <template id="marker-popup">
2
+ <div class="space-y-6">
3
+ <a href="${link}" class="card__list">
4
+ <div class="card__list-content">
5
+ <h3 class="h4 card__list-title">${title}</h3>
6
+ <div class="card__list-metadata">
7
+ {{each JSON.parse(items)}}
8
+ <span>{{html icon}}${text}</span>
9
+ {{/each}}
10
+ </div>
11
+ </div>
12
+ </a>
13
+ </div>
14
+ </template>
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class MapCell < Decidim::ViewModel
5
+ include Decidim::MapHelper
6
+
7
+ def show
8
+ return unless Decidim::Map.available?(:geocoding, :dynamic)
9
+
10
+ render
11
+ end
12
+
13
+ def geocoded_data
14
+ @geocoded_data ||= data_for_map
15
+ end
16
+
17
+ private
18
+
19
+ def data_for_map
20
+ data = model.select(&:geocoded_and_valid?)
21
+ data.map do |map|
22
+ map.slice(:latitude, :longitude, :address)
23
+ .merge(
24
+ title: map.presenter.title,
25
+ link: resource_locator(map).path,
26
+ items: cell(options[:metadata_card], map).send(:items_for_map).to_json
27
+ )
28
+ end
29
+ end
30
+
31
+ def metadata_card
32
+ "decidim/meetings/meeting_card_metadata"
33
+ end
34
+
35
+ def cache_hash
36
+ nil
37
+ end
38
+ end
39
+ end
@@ -34,7 +34,7 @@ module Decidim
34
34
  end
35
35
 
36
36
  def class_for(item)
37
- (item[:class].presence || "button__transparent-secondary")
37
+ item[:class].presence || "button__transparent-secondary"
38
38
  end
39
39
  end
40
40
  end
@@ -0,0 +1,15 @@
1
+ <div id="onboarding-messages-container" class="container">
2
+ <div class="flash info" data-closable>
3
+ <div class="flash__icon">
4
+ <%= info_icon %>
5
+ </div>
6
+
7
+ <div class="flash__message">
8
+ <%= message_text %>
9
+ </div>
10
+
11
+ <%= button_to decidim_verifications.clear_onboarding_data_authorizations_path, form_class: "close-button", role: :button, method: :delete, remote: true, data: { close: "" } do %>
12
+ <%= close_icon %>
13
+ <% end %>
14
+ </div>
15
+ </div>
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This cell renders an announcement of pending onboarding action
5
+ # if exists for a user
6
+ #
7
+ # The `model` is expected to be a user
8
+ #
9
+ class OnboardingActionMessageCell < Decidim::ViewModel
10
+ include ActiveLinkTo
11
+
12
+ alias user model
13
+
14
+ def show
15
+ return if is_active_link?(onboarding_path)
16
+ return unless onboarding_manager.valid?
17
+ return unless onboarding_manager.pending_action?
18
+ return if authorization_status == :unauthorized
19
+ return if pending_authorization_link_active?
20
+ return if ephemeral_authorized?
21
+
22
+ render :show
23
+ end
24
+
25
+ private
26
+
27
+ def onboarding_path
28
+ decidim_verifications.onboarding_pending_authorizations_path
29
+ end
30
+
31
+ def onboarding_manager
32
+ @onboarding_manager ||= OnboardingManager.new(user)
33
+ end
34
+
35
+ def authorizations
36
+ @authorizations ||= action_authorized_to(onboarding_manager.action, **onboarding_manager.action_authorized_resources)
37
+ end
38
+
39
+ def authorization_status
40
+ @authorization_status ||= authorizations.global_code
41
+ end
42
+
43
+ def pending_authorization_link_active?
44
+ return unless authorizations.single_authorization_required?
45
+
46
+ is_active_link? authorizations.statuses.first.current_path
47
+ end
48
+
49
+ def message_text
50
+ t(
51
+ "cta_html",
52
+ scope: "decidim.onboarding_action_message",
53
+ link_text:,
54
+ path: onboarding_path,
55
+ action: onboarding_manager.action_text.downcase,
56
+ resource_name: onboarding_manager.model_name.human.downcase,
57
+ resource_title: decidim_sanitize_translated(onboarding_manager.model_title)
58
+ )
59
+ end
60
+
61
+ def link_text
62
+ if onboarding_manager.finished_verifications?
63
+ t("click_link", scope: "decidim.onboarding_action_message")
64
+ else
65
+ t("finish_authorization_process", scope: "decidim.onboarding_action_message")
66
+ end
67
+ end
68
+
69
+ def ephemeral_authorized?
70
+ user.ephemeral? && authorization_status == :ok
71
+ end
72
+
73
+ def info_icon
74
+ icon("information-line")
75
+ end
76
+
77
+ def close_icon
78
+ icon("close-line")
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,23 @@
1
+ <div class="profile__user">
2
+ <div class="profile__user-avatar-container">
3
+ <div class="<%= has_profile? ? "profile__user-avatar" : "profile__user-avatar !border-0" %>">
4
+ <%= image_tag(has_profile? ? model.avatar_url(:big) : model.non_user_avatar_path, alt: "member-avatar") %>
5
+ </div>
6
+ </div>
7
+ <div>
8
+ <div class="<%= has_profile? ? "profile__user-name" : "profile__user-name !no-underline" %>">
9
+ <%= name %>
10
+ </div>
11
+ <% if nickname.present? %>
12
+ <span class="profile__user-nick block">
13
+ <%= nickname %>
14
+ </span>
15
+ <% end %>
16
+
17
+ <div class="mt-3">
18
+ <span class="text-gray-2 capitalize font-semibold">
19
+ <%= role_translated %>
20
+ </span>
21
+ </div>
22
+ </div>
23
+ </div>
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This cell renders the card for an instance of an Assembly member
5
+ class ParticipatorySpacePrivateUserCell < Decidim::ViewModel
6
+ property :name
7
+ property :role
8
+ property :nickname
9
+ property :profile_url
10
+
11
+ private
12
+
13
+ def has_profile?
14
+ model.profile_url.present?
15
+ end
16
+
17
+ def role_translated
18
+ decidim_html_escape(decidim_sanitize(translated_attribute(role)))
19
+ end
20
+ end
21
+ end
@@ -5,12 +5,12 @@
5
5
  </div>
6
6
 
7
7
  <div class="proposals__aside-progress">
8
- <%= content_tag :div, units_name_text, class: "progress-bar__units" if units_name %>
9
-
10
8
  <% if total != 0 %>
11
9
  <div class="progress-bar" role="progressbar" aria-label="<%= units_name.present? ? units_name_text : t("decidim.shared.progress") %>" aria-valuenow="<%= number_with_precision(percentage, separator: ".", precision: 2) %>" aria-valuemin="0" aria-valuemax="100" aria-valuetext="<%= number_to_percentage(percentage, precision: 2) %>">
12
10
  <div style="width: <%= percentage %>%"></div>
13
11
  </div>
14
12
  <% end %>
15
13
  </div>
14
+ <%= content_tag :div, units_name_text, class: "progress-bar__units" if units_name %>
15
+
16
16
  </div>
@@ -32,6 +32,7 @@ module Decidim
32
32
  def cache_hash
33
33
  hash = []
34
34
  hash.push(I18n.locale)
35
+ hash.push(only_button? ? 1 : 0)
35
36
  hash.push(current_user.try(:id))
36
37
  hash.push(model.reported_by?(current_user) ? 1 : 0)
37
38
  hash.push(model.class.name.gsub("::", ":"))
@@ -0,0 +1,20 @@
1
+ <ul class="resource_history">
2
+ <% history_items.each_with_index do |item, index| %>
3
+ <li class="resource_history__item">
4
+ <div class="resource_history__item_icon">
5
+ <div class="<%= item[:id] == "#{history_cell_id}_creation" ? "resource_history__item_icon-creation" : "" %>">
6
+ <%= icon item[:icon], class: item[:id] == "#{history_cell_id}_creation" ? "fill-current text-white" : "fill-current text-secondary" %>
7
+ </div>
8
+ </div>
9
+ <div class="resource_history__item_content">
10
+ <span class="resource_history__item_date"><%= item[:date].strftime("%d/%m/%Y %H:%M") %></span>
11
+ <p class="resource_history_text">
12
+ <%= item[:text] %>
13
+ <% if index < history_items.size - 1 %>
14
+ <span class="resource_history__line"></span>
15
+ <% end %>
16
+ </p>
17
+ </div>
18
+ </li>
19
+ <% end %>
20
+ </ul>