decidim-core 0.29.4 → 0.30.0.rc1

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 (562) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/address/show.erb +3 -3
  3. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  4. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  5. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  6. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  7. data/app/cells/decidim/author/flag.erb +6 -0
  8. data/app/cells/decidim/author/flag_user.erb +14 -0
  9. data/app/cells/decidim/author/show.erb +4 -2
  10. data/app/cells/decidim/author_cell.rb +1 -1
  11. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  12. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  13. data/app/cells/decidim/comments_button_cell.rb +14 -2
  14. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  15. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  16. data/app/cells/decidim/content_blocks/participatory_space_extra_data/extra_data.erb +2 -2
  17. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  18. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  19. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  20. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  21. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  22. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  23. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  24. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  25. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  26. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  27. data/app/cells/decidim/flag_modal/flag_user.erb +34 -0
  28. data/app/cells/decidim/flag_modal/show.erb +52 -0
  29. data/app/cells/decidim/flag_modal_cell.rb +56 -0
  30. data/app/cells/decidim/follow_button/show.erb +1 -2
  31. data/app/cells/decidim/follow_button_cell.rb +5 -0
  32. data/app/cells/decidim/map/show.erb +3 -0
  33. data/app/cells/decidim/map/template.erb +14 -0
  34. data/app/cells/decidim/map_cell.rb +39 -0
  35. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  36. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  37. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  38. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +4 -4
  39. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +3 -5
  40. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  41. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  42. data/app/cells/decidim/profile_actions/show.erb +1 -1
  43. data/app/cells/decidim/profile_sidebar/show.erb +167 -0
  44. data/app/cells/decidim/profile_sidebar_cell.rb +68 -0
  45. data/app/cells/decidim/progress_bar/show.erb +2 -2
  46. data/app/cells/decidim/report_button/already_reported_modal.erb +2 -2
  47. data/app/cells/decidim/report_button/flag_modal.erb +27 -13
  48. data/app/cells/decidim/report_button_cell.rb +9 -2
  49. data/app/cells/decidim/resource_history/show.erb +20 -0
  50. data/app/cells/decidim/resource_history_cell.rb +66 -0
  51. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  52. data/app/cells/decidim/resource_types_filter_cell.rb +6 -6
  53. data/app/cells/decidim/share_button_cell.rb +0 -4
  54. data/app/cells/decidim/share_widget/modal.erb +26 -0
  55. data/app/cells/decidim/share_widget/show.erb +2 -0
  56. data/app/cells/decidim/share_widget_cell.rb +20 -0
  57. data/app/cells/decidim/tags/show.erb +7 -4
  58. data/app/cells/decidim/tags_cell.rb +11 -72
  59. data/app/cells/decidim/user_activity/show.erb +1 -1
  60. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  61. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  62. data/app/commands/decidim/create_omniauth_registration.rb +21 -17
  63. data/app/commands/decidim/create_report.rb +8 -11
  64. data/app/commands/decidim/create_user_group.rb +6 -2
  65. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  66. data/app/commands/decidim/invite_user.rb +1 -1
  67. data/app/commands/decidim/search.rb +0 -14
  68. data/app/commands/decidim/update_account.rb +11 -3
  69. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  70. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  71. data/app/commands/decidim/update_user_group.rb +7 -1
  72. data/app/constraints/decidim/current_component.rb +1 -1
  73. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  74. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  75. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  76. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  77. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  78. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  79. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  80. data/app/controllers/concerns/decidim/headers/browser_feature_permissions.rb +50 -0
  81. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  82. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  83. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  84. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  85. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  86. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -4
  87. data/app/controllers/decidim/application_controller.rb +10 -0
  88. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  89. data/app/controllers/decidim/components/base_controller.rb +3 -7
  90. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  91. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  92. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  93. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  94. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  95. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  96. data/app/controllers/decidim/follows_controller.rb +1 -1
  97. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  98. data/app/controllers/decidim/homepage_controller.rb +0 -1
  99. data/app/controllers/decidim/open_data_controller.rb +33 -8
  100. data/app/controllers/decidim/profiles_controller.rb +2 -2
  101. data/app/controllers/decidim/reports_controller.rb +2 -7
  102. data/app/controllers/decidim/user_activities_controller.rb +1 -1
  103. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  104. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  105. data/app/forms/decidim/account_form.rb +2 -5
  106. data/app/forms/decidim/amendable/form.rb +4 -2
  107. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  108. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  109. data/app/forms/decidim/omniauth_registration_form.rb +15 -2
  110. data/app/forms/decidim/registration_form.rb +1 -1
  111. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  112. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  113. data/app/helpers/decidim/amendments_helper.rb +0 -9
  114. data/app/helpers/decidim/application_helper.rb +6 -2
  115. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  116. data/app/helpers/decidim/cache_helper.rb +1 -1
  117. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  118. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  119. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  120. data/app/helpers/decidim/layout_helper.rb +6 -0
  121. data/app/helpers/decidim/menu_helper.rb +2 -2
  122. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  123. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  124. data/app/helpers/decidim/modal_helper.rb +23 -0
  125. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  126. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  127. data/app/helpers/decidim/orders_helper.rb +1 -2
  128. data/app/helpers/decidim/paginate_helper.rb +1 -1
  129. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  130. data/app/helpers/decidim/passwords_helper.rb +2 -2
  131. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  132. data/app/helpers/decidim/tooltip_helper.rb +1 -4
  133. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  134. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  135. data/app/jobs/decidim/export_job.rb +5 -1
  136. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  137. data/app/jobs/decidim/open_data_job.rb +4 -4
  138. data/app/mailers/decidim/export_mailer.rb +7 -12
  139. data/app/mailers/decidim/notifications_digest_mailer.rb +1 -7
  140. data/app/mailers/decidim/reported_mailer.rb +2 -18
  141. data/app/models/decidim/action_log.rb +20 -1
  142. data/app/models/decidim/category.rb +4 -0
  143. data/app/models/decidim/component.rb +25 -3
  144. data/app/models/decidim/metric.rb +2 -1
  145. data/app/models/decidim/moderation.rb +16 -0
  146. data/app/models/decidim/newsletter.rb +12 -8
  147. data/app/models/decidim/organization.rb +7 -3
  148. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  149. data/app/models/decidim/private_export.rb +24 -0
  150. data/app/models/decidim/push_notification_message.rb +1 -1
  151. data/app/models/decidim/report.rb +1 -1
  152. data/app/models/decidim/scope.rb +4 -0
  153. data/app/models/decidim/share_token.rb +36 -10
  154. data/app/models/decidim/taxonomization.rb +23 -0
  155. data/app/models/decidim/taxonomy.rb +139 -0
  156. data/app/models/decidim/taxonomy_filter.rb +130 -0
  157. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  158. data/app/models/decidim/user.rb +13 -23
  159. data/app/models/decidim/user_base_entity.rb +12 -4
  160. data/app/models/decidim/user_moderation.rb +9 -0
  161. data/app/models/decidim/user_report.rb +4 -0
  162. data/app/packs/entrypoints/decidim_core.js +1 -0
  163. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  164. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  165. data/app/packs/images/decidim/brands/google.svg +7 -1
  166. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  167. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  168. data/app/packs/src/decidim/clipboard.js +18 -9
  169. data/app/packs/src/decidim/confirm.js +79 -59
  170. data/app/packs/src/decidim/datepicker/datepicker_functions.js +3 -3
  171. data/app/packs/src/decidim/decidim_application.js +1 -0
  172. data/app/packs/src/decidim/form_remote.js +1 -1
  173. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  174. data/app/packs/src/decidim/impersonation.js +1 -1
  175. data/app/packs/src/decidim/index.js +13 -5
  176. data/app/packs/src/decidim/input_character_counter.js +1 -1
  177. data/app/packs/src/decidim/map/provider/here.js +1 -1
  178. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  179. data/app/packs/src/decidim/session_timeouter.js +1 -1
  180. data/app/packs/src/decidim/sticky_footer.js +29 -0
  181. data/app/packs/src/decidim/sticky_header.js +6 -31
  182. data/app/packs/src/decidim/user_registrations.js +13 -0
  183. data/app/packs/src/decidim/utilities/dom.js +148 -0
  184. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +212 -0
  185. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  186. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  187. data/app/packs/stylesheets/decidim/_cards.scss +1 -1
  188. data/app/packs/stylesheets/decidim/_content_blocks.scss +0 -4
  189. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  190. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  191. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  192. data/app/packs/stylesheets/decidim/_header.scss +37 -60
  193. data/app/packs/stylesheets/decidim/_layout.scss +32 -2
  194. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  195. data/app/packs/stylesheets/decidim/_modal.scss +42 -0
  196. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  197. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  198. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  199. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  200. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  201. data/app/packs/stylesheets/decidim/application.scss +1 -1
  202. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  203. data/app/packs/stylesheets/decidim/map.scss +7 -10
  204. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  205. data/app/permissions/decidim/default_permissions.rb +0 -2
  206. data/app/permissions/decidim/permissions.rb +8 -2
  207. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  208. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  209. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  210. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  211. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  212. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  213. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  214. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  215. data/app/presenters/decidim/log/user_presenter.rb +0 -1
  216. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  217. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  218. data/app/presenters/decidim/notification_to_mailer_presenter.rb +3 -7
  219. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  220. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  221. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  222. data/app/presenters/decidim/user_presenter.rb +1 -1
  223. data/app/queries/decidim/last_activity.rb +0 -25
  224. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  225. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  226. data/app/queries/decidim/public_activities.rb +1 -12
  227. data/app/queries/decidim/stats_users_count.rb +2 -2
  228. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  229. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  230. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  231. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  232. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  233. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  234. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  235. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  236. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  237. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  238. data/app/services/decidim/action_authorizer.rb +32 -3
  239. data/app/services/decidim/base_diff_renderer.rb +1 -3
  240. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  241. data/app/services/decidim/onboarding_manager.rb +272 -0
  242. data/app/services/decidim/open_data_exporter.rb +139 -13
  243. data/app/services/decidim/static_map_generator.rb +1 -1
  244. data/app/services/decidim/traceability.rb +13 -0
  245. data/app/uploaders/decidim/application_uploader.rb +1 -1
  246. data/app/validators/etiquette_validator.rb +9 -2
  247. data/app/validators/passthru_validator.rb +1 -1
  248. data/app/validators/translated_etiquette_validator.rb +32 -0
  249. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  250. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  251. data/app/views/decidim/application/_collection.html.erb +30 -18
  252. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  253. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  254. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  255. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  256. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  257. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  258. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  259. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  260. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  261. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  262. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  263. data/app/views/decidim/last_activities/index.html.erb +1 -1
  264. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +2 -1
  265. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  266. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  267. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  268. data/app/views/decidim/open_data/index.html.erb +108 -0
  269. data/app/views/decidim/pages/show.html.erb +2 -1
  270. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  271. data/app/views/decidim/reported_mailer/hide.html.erb +9 -0
  272. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  273. data/app/views/decidim/searches/_count.html.erb +1 -1
  274. data/app/views/decidim/searches/_filters.html.erb +38 -40
  275. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  276. data/app/views/decidim/shared/_orders.html.erb +2 -2
  277. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  278. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  279. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  280. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  281. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  282. data/app/views/kaminari/decidim/_page.html.erb +1 -1
  283. data/app/views/kaminari/decidim/_paginator.html.erb +1 -1
  284. data/app/views/layouts/decidim/_application.html.erb +0 -1
  285. data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
  286. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  287. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  288. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  289. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  290. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  291. data/app/views/layouts/decidim/footer/_main_legal.html.erb +1 -1
  292. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  293. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  294. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  295. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  296. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +11 -5
  297. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +5 -5
  298. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  299. data/config/assets.rb +2 -1
  300. data/config/locales/ar.yml +35 -74
  301. data/config/locales/bg.yml +33 -74
  302. data/config/locales/bs-BA.yml +0 -2
  303. data/config/locales/ca.yml +370 -102
  304. data/config/locales/cs.yml +374 -102
  305. data/config/locales/de.yml +350 -88
  306. data/config/locales/el.yml +22 -58
  307. data/config/locales/en.yml +350 -82
  308. data/config/locales/eo.yml +0 -4
  309. data/config/locales/es-MX.yml +364 -99
  310. data/config/locales/es-PY.yml +369 -104
  311. data/config/locales/es.yml +370 -102
  312. data/config/locales/eu.yml +426 -156
  313. data/config/locales/fi-plain.yml +366 -76
  314. data/config/locales/fi.yml +370 -77
  315. data/config/locales/fr-CA.yml +176 -97
  316. data/config/locales/fr.yml +176 -94
  317. data/config/locales/ga-IE.yml +4 -25
  318. data/config/locales/gl.yml +20 -58
  319. data/config/locales/hu.yml +30 -62
  320. data/config/locales/id-ID.yml +21 -57
  321. data/config/locales/is-IS.yml +5 -25
  322. data/config/locales/it.yml +36 -94
  323. data/config/locales/ja.yml +231 -112
  324. data/config/locales/lb.yml +28 -76
  325. data/config/locales/lt.yml +24 -64
  326. data/config/locales/lv.yml +21 -58
  327. data/config/locales/nl.yml +23 -75
  328. data/config/locales/no.yml +23 -70
  329. data/config/locales/pl.yml +30 -72
  330. data/config/locales/pt-BR.yml +41 -63
  331. data/config/locales/pt.yml +23 -70
  332. data/config/locales/ro-RO.yml +115 -184
  333. data/config/locales/ru.yml +13 -43
  334. data/config/locales/sk.yml +24 -70
  335. data/config/locales/sl.yml +0 -4
  336. data/config/locales/sr-CS.yml +0 -2
  337. data/config/locales/sv.yml +138 -106
  338. data/config/locales/tr-TR.yml +29 -75
  339. data/config/locales/uk.yml +6 -29
  340. data/config/locales/zh-CN.yml +21 -68
  341. data/config/locales/zh-TW.yml +23 -62
  342. data/config/routes.rb +4 -10
  343. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  344. data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
  345. data/db/migrate/20180706104107_add_nickname_to_managed_users.rb +1 -1
  346. data/db/migrate/20181001124950_move_users_groups_to_users_table.rb +1 -1
  347. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  348. data/db/migrate/20190412131728_fix_user_names.rb +1 -1
  349. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  350. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  351. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  352. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  353. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  354. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  355. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  356. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  357. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  358. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  359. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  360. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  361. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  362. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  363. data/decidim-core.gemspec +14 -17
  364. data/lib/decidim/action_authorization.rb +3 -2
  365. data/lib/decidim/amendable.rb +1 -1
  366. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  367. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  368. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  369. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  370. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  371. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  372. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  373. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  374. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  375. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  376. data/lib/decidim/api/types/amendment_type.rb +5 -7
  377. data/lib/decidim/api/types/area_api_type.rb +3 -3
  378. data/lib/decidim/api/types/attachment_type.rb +3 -3
  379. data/lib/decidim/api/types/category_type.rb +2 -2
  380. data/lib/decidim/api/types/decidim_type.rb +5 -1
  381. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  382. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  383. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  384. data/lib/decidim/api/types/metric_type.rb +1 -1
  385. data/lib/decidim/api/types/organization_type.rb +5 -0
  386. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  387. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  388. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  389. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  390. data/lib/decidim/api/types/session_type.rb +1 -2
  391. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  392. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  393. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  394. data/lib/decidim/api/types/user_group_type.rb +7 -20
  395. data/lib/decidim/api/types/user_type.rb +7 -20
  396. data/lib/decidim/asset_router/storage.rb +6 -11
  397. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +2 -1
  398. data/lib/decidim/attachment_attributes.rb +1 -1
  399. data/lib/decidim/attribute_encryptor.rb +1 -1
  400. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  401. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  402. data/lib/decidim/attributes/time_with_zone.rb +1 -5
  403. data/lib/decidim/attributes.rb +2 -0
  404. data/lib/decidim/authorization_form_builder.rb +0 -7
  405. data/lib/decidim/coauthorable.rb +1 -1
  406. data/lib/decidim/command.rb +3 -3
  407. data/lib/decidim/commands/destroy_resource.rb +5 -1
  408. data/lib/decidim/commands/resource_handler.rb +2 -2
  409. data/lib/decidim/commands/restore_resource.rb +45 -0
  410. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  411. data/lib/decidim/component_manifest.rb +7 -0
  412. data/lib/decidim/content_parsers/blob_parser.rb +8 -10
  413. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  414. data/lib/decidim/core/api.rb +2 -0
  415. data/lib/decidim/core/engine.rb +21 -7
  416. data/lib/decidim/core/menu.rb +0 -5
  417. data/lib/decidim/core/seeds.rb +42 -2
  418. data/lib/decidim/core/test/factories.rb +105 -2
  419. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  420. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  421. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  422. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  423. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  424. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  425. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  426. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  427. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  428. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  429. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  430. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  431. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  432. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  433. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  434. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  435. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  436. data/lib/decidim/core/test/shared_examples/reports_examples.rb +15 -53
  437. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  438. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  439. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  440. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  441. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +7 -14
  442. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  443. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  444. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  445. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  446. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  447. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  448. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +0 -26
  449. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -28
  450. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  451. data/lib/decidim/core/test.rb +9 -5
  452. data/lib/decidim/core/version.rb +1 -1
  453. data/lib/decidim/core.rb +58 -0
  454. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  455. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  456. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  457. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  458. data/lib/decidim/download_your_data_serializers.rb +19 -0
  459. data/lib/decidim/exporters/csv.rb +6 -0
  460. data/lib/decidim/exporters/export_manifest.rb +14 -0
  461. data/lib/decidim/exporters/pdf.rb +26 -22
  462. data/lib/decidim/filter_form_builder.rb +12 -15
  463. data/lib/decidim/form_builder.rb +6 -129
  464. data/lib/decidim/has_category.rb +5 -1
  465. data/lib/decidim/has_private_users.rb +4 -0
  466. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  467. data/lib/decidim/has_upload_validations.rb +1 -1
  468. data/lib/decidim/legacy_form_builder.rb +118 -0
  469. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  470. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  471. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  472. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  473. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  474. data/lib/decidim/maintenance/import_models/category.rb +107 -0
  475. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  476. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  477. data/lib/decidim/maintenance/import_models.rb +19 -0
  478. data/lib/decidim/maintenance/taxonomy_importer.rb +132 -0
  479. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  480. data/lib/decidim/maintenance.rb +12 -0
  481. data/lib/decidim/map/autocomplete.rb +52 -8
  482. data/lib/decidim/map/dynamic_map.rb +1 -1
  483. data/lib/decidim/map/provider/dynamic_map/here.rb +40 -1
  484. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  485. data/lib/decidim/map/provider/static_map/here.rb +0 -34
  486. data/lib/decidim/map.rb +3 -6
  487. data/lib/decidim/moderation_tools.rb +16 -19
  488. data/lib/decidim/newsletter_encryptor.rb +1 -1
  489. data/lib/decidim/nicknamizable.rb +9 -6
  490. data/lib/decidim/paddable.rb +1 -1
  491. data/lib/decidim/participable.rb +10 -10
  492. data/lib/decidim/participatory_space_user.rb +10 -0
  493. data/lib/decidim/private_download_helper.rb +15 -0
  494. data/lib/decidim/record_encryptor.rb +51 -46
  495. data/lib/decidim/reportable.rb +2 -6
  496. data/lib/decidim/resourceable.rb +16 -0
  497. data/lib/decidim/seeds.rb +18 -20
  498. data/lib/decidim/settings_manifest.rb +34 -1
  499. data/lib/decidim/soft_deletable.rb +17 -0
  500. data/lib/decidim/taxonomizable.rb +72 -0
  501. data/lib/decidim/translatable_attributes.rb +1 -5
  502. data/lib/decidim/view_model.rb +0 -1
  503. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  504. data/lib/tasks/decidim_procfile.rake +6 -0
  505. data/lib/tasks/decidim_tasks.rake +1 -0
  506. data/lib/tasks/decidim_taxonomies.rake +155 -0
  507. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  508. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  509. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +20 -23
  510. data/lib/tasks/upgrade/migrations.rake +91 -0
  511. metadata +203 -112
  512. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  513. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  514. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  515. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  516. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  517. data/app/cells/decidim/report_user_button/already_reported_modal.erb +0 -11
  518. data/app/cells/decidim/report_user_button/flag_modal.erb +0 -46
  519. data/app/cells/decidim/report_user_button/show.erb +0 -2
  520. data/app/cells/decidim/report_user_button_cell.rb +0 -59
  521. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  522. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  523. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  524. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  525. data/app/commands/decidim/update_user_interests.rb +0 -41
  526. data/app/controllers/decidim/scopes_controller.rb +0 -84
  527. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  528. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  529. data/app/forms/decidim/user_interests_form.rb +0 -17
  530. data/app/helpers/decidim/categories_helper.rb +0 -26
  531. data/app/helpers/decidim/scopes_helper.rb +0 -105
  532. data/app/jobs/decidim/hide_child_resources_job.rb +0 -24
  533. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  534. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  535. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  536. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  537. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  538. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  539. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  540. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  541. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  542. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  543. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  544. data/app/views/decidim/reported_mailer/hidden_automatically.html.erb +0 -25
  545. data/app/views/decidim/reported_mailer/hidden_manually.html.erb +0 -25
  546. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  547. data/app/views/decidim/scopes/picker.html.erb +0 -53
  548. data/app/views/decidim/shared/_comments.html.erb +0 -0
  549. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  550. data/app/views/decidim/shared/_tags.html.erb +0 -1
  551. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  552. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  553. data/app/views/decidim/user_interests/show.html.erb +0 -22
  554. data/config/initializers/foundation_rails_helper.rb +0 -4
  555. data/config/locales/ca-IT.yml +0 -2122
  556. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  557. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  558. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  559. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  560. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  561. data/lib/decidim/seven_zip_wrapper.rb +0 -29
  562. data/lib/tasks/upgrade/clean_hidden_resources.rake +0 -33
@@ -0,0 +1,148 @@
1
+ import confirmAction from "src/decidim/confirm"
2
+ import { getMessages } from "src/decidim/i18n"
3
+
4
+ const { Rails } = window;
5
+
6
+ const createUnloadPreventer = () => {
7
+ const preventUnloadConditions = [];
8
+
9
+ const confirmMessage = getMessages("confirmUnload") || "Are you sure you want to leave this page?";
10
+
11
+ const canUnload = (event) => !preventUnloadConditions.some((condition) => condition(event));
12
+
13
+ // TLDR:
14
+ // The beforeunload event does not work during tests due to the deprecation of
15
+ // the unload event and ChromeDriver automatically accepting these dialogs.
16
+ // ---
17
+ //
18
+ // Even when there are custom listeners on links and forms, the beforeunload
19
+ // event is to ensure that the user does not accidentally reload the page or
20
+ // close the browser or the tab. Note that this does not work during the tests
21
+ // with ChromeDriver due to the deprecation of the unload event and
22
+ // ChromeDriver automatically accepting these dialogs. For the time being,
23
+ // this should work when a real user interacts with the browser along with the
24
+ // "Permissions-Policy" header set by the backend. For more information about
25
+ // the header, see Decidim::Headers::BrowserFeaturePermissions).
26
+ const unloadListener = (event) => {
27
+ if (canUnload(event)) {
28
+ return;
29
+ }
30
+
31
+ // According to:
32
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event
33
+ //
34
+ // > [...] best practice is to trigger the dialog by invoking
35
+ // > preventDefault() on the event object, while also setting returnValue to
36
+ // > support legacy cases.
37
+ event.preventDefault();
38
+ event.returnValue = true;
39
+ };
40
+
41
+ // The beforeunload event listener has to be registered AFTER a user
42
+ // interaction which is why it is wrapped around the next click event that
43
+ // happens after the first unload listener was registered. Otherwise it might
44
+ // not work due to the deprecation of the unload APIs in Chromium based
45
+ // browsers and possibly in the web standards in the future.
46
+ //
47
+ // According to:
48
+ // https://developer.chrome.com/docs/web-platform/page-lifecycle-api#the_beforeunload_event
49
+ //
50
+ // > Never add a beforeunload listener unconditionally or use it as an
51
+ // > end-of-session signal. Only add it when a user has unsaved work, and
52
+ // > remove it as soon as that work has been saved.
53
+ const registerBeforeUnload = () => {
54
+ window.removeEventListener("click", registerBeforeUnload);
55
+ window.addEventListener("beforeunload", unloadListener);
56
+ };
57
+
58
+ const disableBeforeUnload = () => {
59
+ window.removeEventListener("click", registerBeforeUnload);
60
+ window.removeEventListener("beforeunload", unloadListener);
61
+ };
62
+
63
+ const linkClickListener = (ev) => {
64
+ const link = ev.target?.closest("a");
65
+ if (!link) {
66
+ return;
67
+ }
68
+
69
+ if (canUnload(ev)) {
70
+ disableBeforeUnload();
71
+ document.removeEventListener("click", linkClickListener);
72
+ return;
73
+ }
74
+
75
+ window.exitUrl = link.href;
76
+
77
+ ev.preventDefault();
78
+ ev.stopPropagation();
79
+
80
+ confirmAction(confirmMessage, link).then((answer) => {
81
+ if (!answer) {
82
+ return;
83
+ }
84
+
85
+ disableBeforeUnload();
86
+ document.removeEventListener("click", linkClickListener);
87
+ link.click();
88
+ });
89
+ };
90
+
91
+ const formSubmitListener = (ev) => {
92
+ const source = ev.target?.closest("form");
93
+ if (!source) {
94
+ return;
95
+ }
96
+
97
+ if (canUnload(ev)) {
98
+ disableBeforeUnload();
99
+ document.removeEventListener("submit", formSubmitListener);
100
+ return;
101
+ }
102
+
103
+ const button = source.closest(Rails.formSubmitSelector);
104
+ if (!button) {
105
+ return;
106
+ }
107
+
108
+ ev.preventDefault();
109
+ ev.stopImmediatePropagation();
110
+ ev.stopPropagation();
111
+
112
+ confirmAction(confirmMessage, button).then((answer) => {
113
+ if (!answer) {
114
+ return;
115
+ }
116
+
117
+ disableBeforeUnload();
118
+ document.removeEventListener("submit", formSubmitListener);
119
+ source.submit();
120
+ });
121
+ };
122
+
123
+ const registerPreventUnloadListeners = () => {
124
+ window.addEventListener("click", registerBeforeUnload);
125
+ document.addEventListener("click", linkClickListener);
126
+ document.addEventListener("submit", formSubmitListener);
127
+ };
128
+
129
+ return {
130
+ addPreventCondition: (condition) => {
131
+ if (typeof condition !== "function") {
132
+ return;
133
+ }
134
+
135
+ if (preventUnloadConditions.length < 1) {
136
+ // The unload listeners are global, so only the first call to this
137
+ // function should result to registering these listeners.
138
+ registerPreventUnloadListeners();
139
+ }
140
+
141
+ preventUnloadConditions.push(condition);
142
+ }
143
+ };
144
+ };
145
+
146
+ const unloadPreventer = createUnloadPreventer();
147
+
148
+ export const preventUnload = (condition) => unloadPreventer.addPreventCondition(condition);
@@ -0,0 +1,212 @@
1
+ /* eslint-disable */
2
+
3
+ // 🍂class TileLayer.HERE
4
+ // Tile layer for HERE maps tiles.
5
+ L.TileLayer.HERE = L.TileLayer.extend({
6
+
7
+ options: {
8
+ subdomains: '1234',
9
+ minZoom: 2,
10
+ maxZoom: 18,
11
+
12
+ // 🍂option scheme: String = 'normal.day'
13
+ // The "map scheme", as documented in the HERE API.
14
+ scheme: 'normal.day',
15
+
16
+ // 🍂option resource: String = 'maptile'
17
+ // The "map resource", as documented in the HERE API.
18
+ resource: 'maptile',
19
+
20
+ // 🍂option mapId: String = 'newest'
21
+ // Version of the map tiles to be used, or a hash of an unique map
22
+ mapId: 'newest',
23
+
24
+ // 🍂option format: String = 'png8'
25
+ // Image format to be used (`png8`, `png`, or `jpg`)
26
+ format: 'png8',
27
+
28
+ // 🍂option appId: String = ''
29
+ // Required option. The `app_id` provided as part of the HERE credentials
30
+ appId: '',
31
+
32
+ // 🍂option appCode: String = ''
33
+ // Required option. The `app_code` provided as part of the HERE credentials
34
+ appCode: '',
35
+
36
+ // 🍂option useCIT: boolean = false
37
+ // Whether to use the CIT when loading the here-maptiles
38
+ useCIT: false,
39
+
40
+ // 🍂option useHTTPS: boolean = true
41
+ // Whether to use HTTPS when loading the here-maptiles
42
+ useHTTPS: true,
43
+
44
+ // 🍂option language: String = ''
45
+ // The language of the descriptions on the maps that are loaded
46
+ language: '',
47
+
48
+ // 🍂option language: String = ''
49
+ // The second language of the descriptions on the maps that are loaded
50
+ language2: '',
51
+ },
52
+
53
+
54
+ initialize: function initialize(options) {
55
+ options = L.setOptions(this, options);
56
+
57
+ // Decide if this scheme uses the aerial servers or the basemap servers
58
+ var schemeStart = options.scheme.split('.')[0];
59
+ options.tileResolution = 256;
60
+
61
+ // {Base URL}{Path}/{resource (tile type)}/{map id}/{scheme}/{zoom}/{column}/{row}/{size}/{format}
62
+ // ?apiKey={YOUR_API_KEY}
63
+ // &{param}={value}
64
+
65
+ var params = [
66
+ 'apiKey=' + encodeURIComponent(options.apiKey)
67
+ ];
68
+ // Fallback to old app_id,app_code if no apiKey passed
69
+ if(!options.apiKey) {
70
+ params = [
71
+ 'app_id=' + encodeURIComponent(options.appId),
72
+ 'app_code=' + encodeURIComponent(options.appCode),
73
+ ];
74
+ }
75
+ if(options.language) {
76
+ params.push('lg=' + encodeURIComponent(options.language));
77
+ }
78
+ if(options.language2) {
79
+ params.push('lg2=' + encodeURIComponent(options.language2));
80
+ }
81
+ var urlQuery = '?' + params.join('&');
82
+
83
+ var path = '/maptile/2.1/{resource}/{mapId}/{scheme}/{z}/{x}/{y}/{tileResolution}/{format}' + urlQuery;
84
+ var attributionPath = '/maptile/2.1/copyright/{mapId}?apiKey={apiKey}';
85
+
86
+ var baseUrl = 'maps.ls.hereapi.com';
87
+
88
+ // Old style with apiId/apiCode for compatibility
89
+ if(!options.apiKey) {
90
+ // make sure the CIT-url can be used
91
+ baseUrl = 'maps' + (options.useCIT ? '.cit' : '') + '.api.here.com';
92
+ attributionPath = '/maptile/2.1/copyright/{mapId}?app_id={appId}&app_code={appCode}';
93
+ }
94
+
95
+ var tileServer = 'base.' + baseUrl;
96
+ if (schemeStart == 'satellite' || schemeStart == 'terrain' || schemeStart == 'hybrid') {
97
+ tileServer = 'aerial.' + baseUrl;
98
+ }
99
+ if (options.scheme.indexOf('.traffic.') !== -1) {
100
+ tileServer = 'traffic' + baseUrl;
101
+ }
102
+
103
+ var protocol = 'http' + (options.useHTTPS ? 's' : '');
104
+ var tileUrl = protocol + '://{s}.' + tileServer + path;
105
+
106
+ this._attributionUrl = L.Util.template(protocol + '://1.' + tileServer + attributionPath, this.options);
107
+
108
+ L.TileLayer.prototype.initialize.call(this, tileUrl, options);
109
+
110
+ this._attributionText = '';
111
+
112
+ },
113
+
114
+ onAdd: function onAdd(map) {
115
+ L.TileLayer.prototype.onAdd.call(this, map);
116
+
117
+ if (!this._attributionBBoxes) {
118
+ this._fetchAttributionBBoxes();
119
+ }
120
+ },
121
+
122
+ onRemove: function onRemove(map) {
123
+ //
124
+ // Remove the attribution text, and clear the cached text so it will be recalculated
125
+ // if/when we are shown again.
126
+ //
127
+ this._map.attributionControl.removeAttribution(this._attributionText);
128
+ this._attributionText = '';
129
+
130
+ this._map.off('moveend zoomend resetview', this._findCopyrightBBox, this);
131
+
132
+ //
133
+ // Call the prototype last, once we have tidied up our own changes
134
+ //
135
+ L.TileLayer.prototype.onRemove.call(this, map);
136
+ },
137
+
138
+ _fetchAttributionBBoxes: function _onMapMove() {
139
+ var xmlhttp = new XMLHttpRequest();
140
+ xmlhttp.onreadystatechange = L.bind(function(){
141
+ if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
142
+ this._parseAttributionBBoxes(JSON.parse(xmlhttp.responseText));
143
+ }
144
+ }, this);
145
+ xmlhttp.open("GET", this._attributionUrl, true);
146
+ xmlhttp.send();
147
+ },
148
+
149
+ _parseAttributionBBoxes: function _parseAttributionBBoxes(json) {
150
+ if (!this._map) { return; }
151
+ var providers = json[this.options.scheme.split('.')[0]] || json.normal;
152
+ for (var i=0; i<providers.length; i++) {
153
+ if (providers[i].boxes) {
154
+ for (var j=0; j<providers[i].boxes.length; j++) {
155
+ var box = providers[i].boxes[j];
156
+ providers[i].boxes[j] = L.latLngBounds( [ [box[0], box[1]], [box[2], box[3]] ]);
157
+ }
158
+ }
159
+ }
160
+
161
+ this._map.on('moveend zoomend resetview', this._findCopyrightBBox, this);
162
+
163
+ this._attributionProviders = providers;
164
+
165
+ this._findCopyrightBBox();
166
+ },
167
+
168
+ _findCopyrightBBox: function _findCopyrightBBox() {
169
+ if (!this._map) { return; }
170
+ var providers = this._attributionProviders;
171
+ var visibleProviders = [];
172
+ var zoom = this._map.getZoom();
173
+ var visibleBounds = this._map.getBounds();
174
+
175
+ for (var i=0; i<providers.length; i++) {
176
+ if (providers[i].minLevel <= zoom && providers[i].maxLevel >= zoom) {
177
+
178
+ if (!providers[i].boxes) {
179
+ // No boxes = attribution always visible
180
+ visibleProviders.push(providers[i]);
181
+ } else {
182
+ for (var j=0; j<providers[i].boxes.length; j++) {
183
+ var box = providers[i].boxes[j];
184
+ if (visibleBounds.intersects(box)) {
185
+ visibleProviders.push(providers[i]);
186
+ break;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+
193
+ var attributions = ['<a href="https://legal.here.com/en-gb/terms" target="_blank" rel="noopener noreferrer">HERE maps</a>'];
194
+ for (var i=0; i<visibleProviders.length; i++) {
195
+ var provider = visibleProviders[i];
196
+ attributions.push('<abbr title="' + provider.alt + '">' + provider.label + '</abbr>');
197
+ }
198
+
199
+ var attributionText = '© ' + attributions.join(', ') + '. ';
200
+
201
+ if (attributionText !== this._attributionText) {
202
+ this._map.attributionControl.removeAttribution(this._attributionText);
203
+ this._map.attributionControl.addAttribution(this._attributionText = attributionText);
204
+ }
205
+ },
206
+
207
+ });
208
+
209
+
210
+ L.tileLayer.here = function(opts){
211
+ return new L.TileLayer.HERE(opts);
212
+ }
@@ -11,3 +11,33 @@
11
11
  [id*="comment"][class="comment-reply"][aria-hidden="false"] {
12
12
  display: block;
13
13
  }
14
+
15
+ .card-accordion {
16
+ @apply border-b border-gray-3 mt-6;
17
+
18
+ &-title {
19
+ @apply text-primary font-semibold text-xl inline-block;
20
+ }
21
+
22
+ &-divider-button {
23
+ @apply flex items-center justify-between items-end w-full;
24
+
25
+ svg {
26
+ @apply inline-block w-6 h-6 fill-primary;
27
+ }
28
+
29
+ &[aria-expanded="true"] {
30
+ svg {
31
+ @apply rotate-180 transition-transform;
32
+ }
33
+ }
34
+ }
35
+
36
+ &-section {
37
+ @apply pb-8;
38
+
39
+ ul {
40
+ @apply mb-0;
41
+ }
42
+ }
43
+ }
@@ -98,3 +98,22 @@
98
98
  @apply rounded-full bg-secondary text-white inline-grid place-items-center h-[18px] w-[18px] ml-2 text-xs;
99
99
  }
100
100
  }
101
+
102
+ .layout-main__buttons {
103
+ .button {
104
+ &__sm {
105
+ @apply text-2xl [&:not([class*="button\\_\\_text"])]:px-1.5 [&:not([class*="button\\_\\_text"])]:py-1.5 gap-1.5
106
+ lg:text-sm lg:[&:not([class*="button\\_\\_text"])]:px-4;
107
+
108
+ span {
109
+ @apply hidden lg:flex;
110
+ }
111
+ }
112
+
113
+ &__transparent {
114
+ &-secondary {
115
+ @apply p-0 border-0 lg:border lg:border-secondary;
116
+ }
117
+ }
118
+ }
119
+ }
@@ -159,7 +159,7 @@
159
159
  /* shared styles */
160
160
  &__highlight-metadata,
161
161
  &__grid-metadata {
162
- @apply mt-auto flex items-center justify-between flex-wrap w-full text-sm text-gray-2 [&>*]:flex [&>*]:items-center [&>*]:gap-1 first:[&>*]:w-4/5;
162
+ @apply mt-auto flex items-center justify-between flex-wrap text-sm text-gray-2 [&>*]:flex [&>*]:items-center [&>*]:gap-1 first:[&>*]:flex-none;
163
163
 
164
164
  svg {
165
165
  @apply flex-none text-gray fill-current;
@@ -27,10 +27,6 @@
27
27
  @apply block;
28
28
  }
29
29
  }
30
-
31
- > h3:not([class~="not-prose"]) {
32
- @apply mb-[-0.4rem] pt-4 pb-2;
33
- }
34
30
  }
35
31
 
36
32
  &__span {
@@ -19,7 +19,7 @@
19
19
  }
20
20
 
21
21
  > svg {
22
- @apply w-8 h-8 flex-none text-secondary fill-current;
22
+ @apply w-6 h-6 flex-none text-secondary fill-current;
23
23
  }
24
24
 
25
25
  &[aria-expanded="false"] > svg:last-of-type,
@@ -2,44 +2,50 @@
2
2
  @apply space-y-3 opacity-0 -translate-y-full invisible transition-all absolute;
3
3
 
4
4
  &__text {
5
- @apply text-sm text-gray-2;
5
+ @apply text-md text-gray-2 ml-4 leading-normal;
6
+
7
+ a {
8
+ @apply text-md;
9
+ }
6
10
  }
7
11
 
8
12
  &__grid {
9
13
  @apply flex flex-wrap gap-y-3;
10
14
  }
11
15
 
12
- &__avatar,
13
- &__counter {
16
+ &__avatar {
14
17
  @apply rounded-full overflow-hidden border border-white inline-grid w-6 h-6;
15
18
  }
16
19
 
17
- &__counter {
18
- @apply bg-background place-items-center text-secondary text-xs font-semibold transition;
19
- }
20
-
21
20
  &__button {
22
21
  @apply block ml-auto text-right text-xs text-secondary cursor-pointer;
23
22
  }
24
23
 
25
- &__trigger {
26
- @apply flex justify-start -space-x-4;
27
- }
28
-
29
- &__trigger:hover &__counter,
30
- &__trigger[aria-expanded="true"] &__counter {
31
- @apply text-white bg-secondary border-secondary;
32
- }
33
-
34
- &__trigger[data-target*="dropdown"] {
35
- @apply p-0 w-auto;
24
+ &__container {
25
+ @apply w-full flex justify-start -space-x-4 p-0 gap-2;
36
26
 
37
27
  > span {
38
28
  @apply inline-grid;
39
29
  }
40
30
  }
41
31
 
42
- &[id*="dropdown-menu"][aria-hidden="false"] {
43
- @apply opacity-100 visible translate-y-0 transition-all relative;
32
+ &__modal {
33
+ .list-item__author {
34
+ @apply flex w-full justify-between;
35
+
36
+ .author__avatar-container {
37
+ @apply w-8 h-8;
38
+ }
39
+
40
+ .button {
41
+ @apply [&>svg]:hidden;
42
+ }
43
+ }
44
+
45
+ .list-item__author + .list-item__author {
46
+ --vertical-spacing: 1rem;
47
+
48
+ @apply mt-[var(--vertical-spacing)];
49
+ }
44
50
  }
45
51
  }
@@ -79,10 +79,10 @@
79
79
  }
80
80
 
81
81
  .form__wrapper {
82
- @apply flex flex-col py-10 gap-10 last:pb-0;
82
+ @apply flex flex-col pt-10 pb-4 gap-10 last:pb-0;
83
83
 
84
84
  &-block {
85
- @apply py-10 last:pb-0 border-t-2 border-background flex flex-col gap-4 only:[&_*]:ml-auto [&_p]:text-gray-2;
85
+ @apply py-10 last:pb-0 border-background flex flex-col gap-4 [&_p]:text-gray-2;
86
86
  }
87
87
 
88
88
  &-checkbox-label {
@@ -167,7 +167,7 @@ header {
167
167
  }
168
168
 
169
169
  &__item {
170
- @apply flex relative;
170
+ @apply relative;
171
171
  }
172
172
 
173
173
  &__search {
@@ -334,6 +334,10 @@ header {
334
334
  &__dropdown-trigger {
335
335
  @apply flex items-center justify-between text-white;
336
336
 
337
+ span {
338
+ @apply flex flex-wrap md:flex-nowrap gap-x-2.5 overflow-hidden text-white;
339
+ }
340
+
337
341
  svg {
338
342
  @apply w-6 h-6 fill-current;
339
343
  }
@@ -369,63 +373,15 @@ header {
369
373
  @apply absolute top-full left-0 bg-white rounded w-full bg-gray-5;
370
374
  }
371
375
 
372
- &__dropdown-menu {
373
- @apply w-full md:w-1/4 bg-primary px-4 md:px-8 pt-0 pb-3 md:py-3 divide-y divide-gray-3 text-white;
374
-
375
- > * {
376
- @apply py-3 md:py-3.5;
377
- }
378
-
379
- a {
380
- @apply flex items-center justify-start gap-1 font-semibold text-lg text-white;
381
-
382
- span {
383
- @apply min-w-0 truncate;
384
- }
385
-
386
- svg {
387
- @apply flex-none fill-current;
388
- }
389
- }
390
- }
391
-
392
376
  &__main-dropdown {
393
- @apply bg-white flex flex-row rounded-b shadow-lg text-black w-full lg:w-[1280px] h-screen md:h-auto;
394
-
395
- &__left {
396
- @apply flex flex-col justify-between p-4 md:p-8 space-y-5 hidden md:block md:w-3/4;
397
-
398
- &-top {
399
- @apply border-b-4 border-gray-3 pb-3;
400
- }
401
- }
377
+ @apply bg-white divide-y divide-gray-3 rounded-b shadow-lg text-black w-full lg:w-[1280px] h-screen md:h-auto;
402
378
 
379
+ &__bottom,
403
380
  &__top {
404
- @apply w-full px-4;
405
-
406
- &-menu {
407
- @apply w-full md:w-1/2 mt-0 grid md:grid-cols-2 gap-x-6 text-secondary;
408
-
409
- > * {
410
- @apply py-3 md:py-3.5 border-b last:border-0 border-gray-3;
411
-
412
- /* since the grid has 2 columns, remove the border for these last 2 columns */
413
- &:nth-last-child(-n + 2) {
414
- @apply md:border-0;
415
- }
416
- }
381
+ @apply flex flex-col md:flex-row justify-between p-4 md:p-8 gap-x-8;
417
382
 
418
- a {
419
- @apply flex items-center justify-start gap-1 font-semibold text-lg text-secondary;
420
-
421
- span {
422
- @apply min-w-0 truncate;
423
- }
424
-
425
- svg {
426
- @apply flex-none fill-current;
427
- }
428
- }
383
+ &-right {
384
+ @apply hidden md:block md:w-1/2;
429
385
  }
430
386
  }
431
387
 
@@ -440,6 +396,31 @@ header {
440
396
  &__subtitle {
441
397
  @apply hidden text-md md:flex md:text-lg text-gray-2 mt-5;
442
398
  }
399
+
400
+ &__menu {
401
+ @apply w-full md:w-1/2 mt-0 grid md:grid-cols-2 gap-x-6 text-secondary;
402
+
403
+ > * {
404
+ @apply py-3 md:py-3.5 border-b last:border-0 border-gray-3;
405
+
406
+ /* since the grid has 2 columns, remove the border for these last 2 columns */
407
+ &:nth-last-child(-n + 2) {
408
+ @apply md:border-0;
409
+ }
410
+ }
411
+
412
+ a {
413
+ @apply flex items-center justify-start gap-1 font-semibold text-lg text-secondary;
414
+
415
+ span {
416
+ @apply min-w-0 truncate;
417
+ }
418
+
419
+ svg {
420
+ @apply flex-none fill-current;
421
+ }
422
+ }
423
+ }
443
424
  }
444
425
 
445
426
  &__secondary-dropdown {
@@ -453,12 +434,8 @@ header {
453
434
  @apply h4 md:h3;
454
435
  }
455
436
 
456
- nav {
457
- @apply w-full md:w-1/4;
458
- }
459
-
460
437
  &__menu {
461
- @apply w-full bg-primary px-4 md:px-8 pt-0 pb-3 md:py-3 divide-y divide-gray-3 text-white;
438
+ @apply w-full md:w-1/4 bg-primary px-4 md:px-8 pt-0 pb-3 md:py-3 divide-y divide-gray-3 text-white;
462
439
 
463
440
  > * {
464
441
  @apply py-3 md:py-3.5;
@@ -478,7 +455,7 @@ header {
478
455
  }
479
456
 
480
457
  &__metadata {
481
- @apply flex items-center text-sm space-x-6 pb-6;
458
+ @apply flex items-center text-sm space-x-6 py-8;
482
459
 
483
460
  > span {
484
461
  @apply flex items-center space-x-2;