decidim-core 0.27.0.rc1 → 0.27.0.rc2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim-core might be problematic. Click here for more details.

Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/announcement_cell.rb +1 -1
  3. data/app/cells/decidim/content_blocks/cta/show.erb +1 -1
  4. data/app/cells/decidim/content_blocks/cta_cell.rb +1 -1
  5. data/app/cells/decidim/content_blocks/hero/show.erb +2 -2
  6. data/app/cells/decidim/content_blocks/hero_cell.rb +1 -0
  7. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +2 -2
  8. data/app/cells/decidim/content_blocks/stats_cell.rb +1 -0
  9. data/app/cells/decidim/content_blocks/sub_hero_cell.rb +1 -1
  10. data/app/cells/decidim/data_consent/category.erb +19 -19
  11. data/app/cells/decidim/data_consent/dialog.erb +12 -12
  12. data/app/cells/decidim/data_consent/modal.erb +13 -13
  13. data/app/cells/decidim/data_consent_cell.rb +3 -3
  14. data/app/commands/decidim/update_account.rb +3 -1
  15. data/app/controllers/concerns/decidim/resource_versions_concern.rb +4 -0
  16. data/app/controllers/decidim/devise/registrations_controller.rb +5 -1
  17. data/app/controllers/decidim/last_activities_controller.rb +1 -0
  18. data/app/events/decidim/resource_endorsed_event.rb +2 -1
  19. data/app/forms/decidim/account_form.rb +1 -1
  20. data/app/forms/decidim/user_group_form.rb +1 -1
  21. data/app/helpers/decidim/filters_helper.rb +5 -1
  22. data/app/helpers/decidim/sanitize_helper.rb +12 -3
  23. data/app/models/decidim/action_log.rb +9 -9
  24. data/app/models/decidim/notification.rb +11 -2
  25. data/app/models/decidim/user_base_entity.rb +1 -0
  26. data/app/packs/entrypoints/decidim_core.js +1 -1
  27. data/app/packs/src/decidim/account_form.js +68 -18
  28. data/app/packs/src/decidim/{cookie_consent → data_consent}/consent_manager.js +27 -24
  29. data/app/packs/src/decidim/data_consent/consent_manager.test.js +280 -0
  30. data/app/packs/src/decidim/{cookie_consent/cookie_consent.js → data_consent/index.js} +12 -12
  31. data/app/packs/src/decidim/input_character_counter.js +57 -34
  32. data/app/packs/src/decidim/sw/a2hs.js +10 -1
  33. data/app/packs/stylesheets/decidim/modules/_cards.scss +2 -0
  34. data/app/packs/stylesheets/decidim/modules/_comments.scss +2 -0
  35. data/app/packs/stylesheets/decidim/modules/{_cookie-consent.scss → _data-consent.scss} +10 -10
  36. data/app/packs/stylesheets/decidim/modules/_forms.scss +5 -0
  37. data/app/packs/stylesheets/decidim/modules/_modules.scss +1 -1
  38. data/app/permissions/decidim/permissions.rb +4 -2
  39. data/app/presenters/decidim/push_notification_presenter.rb +2 -1
  40. data/app/presenters/decidim/user_presenter.rb +4 -1
  41. data/app/scrubbers/decidim/admin_input_scrubber.rb +25 -0
  42. data/app/scrubbers/decidim/user_input_scrubber.rb +3 -5
  43. data/app/services/decidim/iframe_disabler.rb +2 -3
  44. data/app/services/decidim/notifications_digest_sending_decider.rb +6 -2
  45. data/app/services/decidim/send_push_notification.rb +14 -12
  46. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  47. data/app/views/decidim/download_your_data/show.html.erb +1 -1
  48. data/app/views/decidim/notifications_settings/show.html.erb +65 -67
  49. data/app/views/decidim/pages/_standalone.html.erb +1 -1
  50. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  51. data/app/views/decidim/user_interests/show.html.erb +11 -13
  52. data/app/views/layouts/decidim/_application.html.erb +1 -1
  53. data/app/views/layouts/decidim/_data_consent_warning.html.erb +8 -0
  54. data/app/views/layouts/decidim/_main_footer.html.erb +1 -1
  55. data/config/locales/am-ET.yml +0 -1
  56. data/config/locales/ar.yml +0 -9
  57. data/config/locales/bg.yml +0 -9
  58. data/config/locales/ca.yml +18 -23
  59. data/config/locales/cs.yml +19 -24
  60. data/config/locales/da.yml +0 -1
  61. data/config/locales/de.yml +204 -10
  62. data/config/locales/el.yml +0 -9
  63. data/config/locales/en.yml +17 -22
  64. data/config/locales/es-MX.yml +20 -25
  65. data/config/locales/es-PY.yml +19 -24
  66. data/config/locales/es.yml +20 -25
  67. data/config/locales/et.yml +0 -1
  68. data/config/locales/eu.yml +1 -10
  69. data/config/locales/fi-plain.yml +17 -22
  70. data/config/locales/fi.yml +17 -22
  71. data/config/locales/fr-CA.yml +29 -20
  72. data/config/locales/fr.yml +42 -33
  73. data/config/locales/ga-IE.yml +0 -2
  74. data/config/locales/gl.yml +0 -9
  75. data/config/locales/hr.yml +0 -1
  76. data/config/locales/hu.yml +250 -9
  77. data/config/locales/id-ID.yml +0 -9
  78. data/config/locales/it.yml +1 -10
  79. data/config/locales/ja.yml +30 -24
  80. data/config/locales/ko.yml +0 -1
  81. data/config/locales/lb.yml +0 -9
  82. data/config/locales/lt.yml +1949 -0
  83. data/config/locales/lv.yml +0 -9
  84. data/config/locales/mt.yml +0 -1
  85. data/config/locales/nl.yml +16 -10
  86. data/config/locales/no.yml +1 -10
  87. data/config/locales/om-ET.yml +0 -1
  88. data/config/locales/pl.yml +0 -9
  89. data/config/locales/pt-BR.yml +2 -11
  90. data/config/locales/pt.yml +0 -9
  91. data/config/locales/ro-RO.yml +0 -9
  92. data/config/locales/si-LK.yml +0 -1
  93. data/config/locales/sk.yml +0 -9
  94. data/config/locales/so-SO.yml +0 -1
  95. data/config/locales/sv.yml +9 -14
  96. data/config/locales/sw-KE.yml +0 -1
  97. data/config/locales/ti-ER.yml +0 -1
  98. data/config/locales/tr-TR.yml +0 -9
  99. data/config/locales/val-ES.yml +0 -1
  100. data/config/locales/vi.yml +0 -1
  101. data/config/locales/zh-CN.yml +2 -11
  102. data/config/locales/zh-TW.yml +0 -1
  103. data/config/routes.rb +20 -2
  104. data/lib/decidim/attributes/model.rb +9 -1
  105. data/lib/decidim/content_parsers/hashtag_parser.rb +1 -1
  106. data/lib/decidim/core/engine.rb +1 -1
  107. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +60 -0
  108. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +40 -0
  109. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  110. data/lib/decidim/core/test.rb +2 -0
  111. data/lib/decidim/core/version.rb +1 -1
  112. data/lib/decidim/core.rb +52 -13
  113. data/lib/decidim/dependency_resolver.rb +272 -0
  114. data/lib/decidim/events/simple_event.rb +1 -0
  115. data/lib/decidim/has_resource_permission.rb +0 -2
  116. data/lib/decidim/map/provider/dynamic_map/here.rb +46 -1
  117. data/lib/decidim/nicknamizable.rb +1 -1
  118. data/lib/decidim/translatable_attributes.rb +8 -1
  119. data/lib/decidim/url_option_resolver.rb +1 -1
  120. metadata +15 -11
  121. data/app/views/decidim/devise/registrations/edit.html.erb +0 -41
  122. data/app/views/layouts/decidim/_cookie_warning.html.erb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db2049c9f719053d8344dc12a1cc1333b839c20c53de98b67e3ca27bb013e0be
4
- data.tar.gz: 139361af6d051e502902469fed8c2fb0ed5357cd30d3f41895f63040f2140c7c
3
+ metadata.gz: 150f88886f1b4e3b5e3402c9f7fa34057d3c808a4de16cef92493aafb82597f9
4
+ data.tar.gz: b1fe1fa4fd31ed1038cb77395e7eee3bc0af36853f42c60d34bc96b388a3f7f4
5
5
  SHA512:
6
- metadata.gz: 58f161196f88af069f757f01d0cb008a0a0821d5e6fe26b8151bdeb8aac7b5b9646435e0108ef1bb6a4438c91161fa8c8de6896a4dc61bf9e6aa283cf62128ec
7
- data.tar.gz: 070fbf34950a9c38c70aa55f877dcc18e86b19914ed587536e5711c4fa2e68a14f43fd786197e3b99e07e4f66c2482978279f8aa96499639f4db91fd216da2fd
6
+ metadata.gz: 559ef49a486a762a2928150e7511faf9f9946bf50d825f1060613c3c0fcac696cfb6be68222895eb2ea0570e9d1b2e8dfccde78f56afb1b8b31704e8a14b5d76
7
+ data.tar.gz: aa814eae2a1d8ac9d2baaab67b9547b6066ddb14537c38be2f5e2990f84e1fb5727e3608912ec768fbb6f62cf908fc73be46c4cf0708b42586bec79d387a4945
@@ -62,7 +62,7 @@ module Decidim
62
62
  end
63
63
 
64
64
  def clean(value)
65
- decidim_sanitize(translated_attribute(value))
65
+ decidim_sanitize_admin(translated_attribute(value))
66
66
  end
67
67
  end
68
68
  end
@@ -1,5 +1,5 @@
1
1
  <section class="section">
2
- <div class="expanded hero" style="background-image:url(<%= background_image %>);">
2
+ <div class="expanded hero" style="background-image:url('<%= background_image %>');">
3
3
  <div class="hero__container">
4
4
  <div class="row">
5
5
  <div class="columns small-centered medium-6 text-center">
@@ -16,7 +16,7 @@ module Decidim
16
16
  end
17
17
 
18
18
  def translated_description
19
- @translated_description ||= decidim_sanitize_editor(translated_attribute(model.settings.description))
19
+ @translated_description ||= decidim_sanitize_editor_admin(translated_attribute(model.settings.description))
20
20
  end
21
21
 
22
22
  def button_url
@@ -1,4 +1,4 @@
1
- <section id="hero" class="extended hero home-section" style="background-image:url(<%= background_image %>);">
1
+ <section id="hero" class="extended hero home-section" style="background-image:url('<%= background_image %>');">
2
2
  <div class="hero__container">
3
3
  <div class="row">
4
4
  <div class="columns small-centered large-10">
@@ -6,7 +6,7 @@
6
6
  <% if translated_welcome_text.blank? %>
7
7
  <%= t("decidim.pages.home.hero.welcome", organization: current_organization.name) %>
8
8
  <% else %>
9
- <%= decidim_sanitize translated_welcome_text %>
9
+ <%= decidim_sanitize_admin translated_welcome_text %>
10
10
  <% end %>
11
11
  </h1>
12
12
  </div>
@@ -29,6 +29,7 @@ module Decidim
29
29
  hash << Digest::MD5.hexdigest(model.attributes.to_s)
30
30
  hash << current_organization.cache_key_with_version
31
31
  hash << I18n.locale.to_s
32
+ hash << background_image
32
33
 
33
34
  hash.join(Decidim.cache_key_separator)
34
35
  end
@@ -1,5 +1,5 @@
1
1
  <section id="highlighted_content_banner" class="extended highligted-content-banner home-section"
2
- style="background-image:url(<%= current_organization.attached_uploader(:highlighted_content_banner_image).path %>);">
2
+ style="background-image:url('<%= current_organization.attached_uploader(:highlighted_content_banner_image).path %>');">
3
3
  <div class="highligted-content-banner__container">
4
4
  <div class="row">
5
5
  <div class="columns large-10">
@@ -7,7 +7,7 @@
7
7
  <%= translated_attribute current_organization.highlighted_content_banner_title %>
8
8
  </h1>
9
9
  <div class="text-highlight">
10
- <%= decidim_sanitize_editor translated_attribute current_organization.highlighted_content_banner_short_description %>
10
+ <%= decidim_sanitize_editor_admin translated_attribute current_organization.highlighted_content_banner_short_description %>
11
11
  </div>
12
12
  </div>
13
13
  <div class="columns large-2">
@@ -12,6 +12,7 @@ module Decidim
12
12
  def cache_hash
13
13
  hash = []
14
14
  hash.push(I18n.locale)
15
+ hash.push(current_organization.cache_key)
15
16
  hash.join(Decidim.cache_key_separator)
16
17
  end
17
18
 
@@ -15,7 +15,7 @@ module Decidim
15
15
  private
16
16
 
17
17
  def organization_description
18
- desc = decidim_sanitize(translated_attribute(current_organization.description))
18
+ desc = decidim_sanitize_admin(translated_attribute(current_organization.description))
19
19
 
20
20
  # Strip the surrounding paragraph tag because it is not allowed within
21
21
  # a <hN> element.
@@ -1,60 +1,60 @@
1
1
  <div class="category-wrapper margin-vertical-1" data-id="<%= category[:slug] %>">
2
2
  <div class="category-row flex-center">
3
- <button class="cc-title padding-left-3">
4
- <span class="h5 cc-category-title">
3
+ <button class="dc-title padding-left-3">
4
+ <span class="h5 dc-category-title">
5
5
  <strong><%= category[:title] %></strong>
6
6
  </span>
7
7
  </button>
8
8
 
9
- <div class="cc-switch">
9
+ <div class="dc-switch">
10
10
  <input
11
11
  class="switch-input"
12
12
  <%= %(checked="checked") if category[:mandatory] %>
13
- id="cc-<%= category[:slug] %>"
13
+ id="dc-<%= category[:slug] %>"
14
14
  type="checkbox"
15
15
  name="<%= category[:slug] %>"
16
16
  <%= "disabled" if category[:mandatory] %>>
17
17
 
18
- <label class="switch-paddle" for="cc-<%= category[:slug] %>">
19
- <span class="show-for-sr"><%= t("layouts.decidim.cookie_consent.modal.toggle", consent_category: category[:title]) %></span>
18
+ <label class="switch-paddle" for="dc-<%= category[:slug] %>">
19
+ <span class="show-for-sr"><%= t("layouts.decidim.data_consent.modal.toggle", consent_category: category[:title]) %></span>
20
20
  </label>
21
21
  </div>
22
22
  </div>
23
- <div class="cc-description hide">
23
+ <div class="dc-description hide">
24
24
  <div class="description-text">
25
25
  <p><%= category[:description] %></p>
26
26
  </div>
27
27
 
28
- <% if category[:cookies].present? %>
29
- <div class="cookie-details-wrapper">
28
+ <% if category[:items].present? %>
29
+ <div class="dataconsent-details-wrapper">
30
30
  <div class="row detail-titles">
31
31
  <div class="columns small-2">
32
- <%= t("layouts.decidim.cookie_consent.cookie_details.columns.type") %>
32
+ <%= t("layouts.decidim.data_consent.details.columns.type") %>
33
33
  </div>
34
34
  <div class="columns small-2">
35
- <%= t("layouts.decidim.cookie_consent.cookie_details.columns.name") %>
35
+ <%= t("layouts.decidim.data_consent.details.columns.name") %>
36
36
  </div>
37
37
  <div class="columns small-2">
38
- <%= t("layouts.decidim.cookie_consent.cookie_details.columns.service") %>
38
+ <%= t("layouts.decidim.data_consent.details.columns.service") %>
39
39
  </div>
40
40
  <div class="columns small-6">
41
- <%= t("layouts.decidim.cookie_consent.cookie_details.columns.description") %>
41
+ <%= t("layouts.decidim.data_consent.details.columns.description") %>
42
42
  </div>
43
43
  </div>
44
44
 
45
- <% category[:cookies].each do |cookie| %>
46
- <div class="row cookie-detail-row">
45
+ <% category[:items].each do |item| %>
46
+ <div class="row dataconsent-detail-row">
47
47
  <div class="columns small-2">
48
- <%= t("layouts.decidim.cookie_consent.cookie_details.types.#{cookie[:type]}") %>
48
+ <%= t("layouts.decidim.data_consent.details.types.#{item[:type]}") %>
49
49
  </div>
50
50
  <div class="columns small-2">
51
- <%= cookie[:name] %>
51
+ <%= item[:name] %>
52
52
  </div>
53
53
  <div class="columns small-2">
54
- <%= t("layouts.decidim.cookie_consent.cookie_details.cookies.#{cookie[:name]}.service") %>
54
+ <%= t("layouts.decidim.data_consent.details.items.#{item[:name]}.service") %>
55
55
  </div>
56
56
  <div class="columns small-6">
57
- <%= t("layouts.decidim.cookie_consent.cookie_details.cookies.#{cookie[:name]}.description") %>
57
+ <%= t("layouts.decidim.data_consent.details.items.#{item[:name]}.description") %>
58
58
  </div>
59
59
  </div>
60
60
  <% end %>
@@ -1,26 +1,26 @@
1
- <div id="cc-dialog-wrapper" class="flex-center hide robots-noindex robots-nocontent noindex" data-nosnippet role="region">
2
- <div class="cc-dialog padding-vertical-1">
1
+ <div id="dc-dialog-wrapper" class="flex-center hide robots-noindex robots-nocontent noindex" data-nosnippet role="region">
2
+ <div class="dc-dialog padding-vertical-1">
3
3
  <div class="row expanded">
4
4
  <div class="columns medium-12 large-8">
5
- <div class="cc-content">
5
+ <div class="dc-content">
6
6
  <div class="h5">
7
- <%= t("layouts.decidim.cookie_consent.dialog.title") %>
7
+ <%= t("layouts.decidim.data_consent.dialog.title") %>
8
8
  </div>
9
9
  <div>
10
- <%= t("layouts.decidim.cookie_consent.dialog.description") %>
10
+ <%= t("layouts.decidim.data_consent.dialog.description") %>
11
11
  </div>
12
12
  </div>
13
13
  </div>
14
14
  <div class="columns medium-12 large-4">
15
- <div class="cc-button-wrapper flex-center">
16
- <button id="cc-dialog-accept" class="button">
17
- <%= t("layouts.decidim.cookie_consent.dialog.accept_all") %>
15
+ <div class="dc-button-wrapper flex-center">
16
+ <button id="dc-dialog-accept" class="button">
17
+ <%= t("layouts.decidim.data_consent.dialog.accept_all") %>
18
18
  </button>
19
- <button id="cc-dialog-reject" class="button hollow">
20
- <%= t("layouts.decidim.cookie_consent.dialog.accept_only_essential") %>
19
+ <button id="dc-dialog-reject" class="button hollow">
20
+ <%= t("layouts.decidim.data_consent.dialog.accept_only_essential") %>
21
21
  </button>
22
- <button id="cc-dialog-settings" class="button clear" data-open="cc-modal">
23
- <%= t("layouts.decidim.cookie_consent.dialog.cookie_settings") %>
22
+ <button id="dc-dialog-settings" class="button clear" data-open="dc-modal">
23
+ <%= t("layouts.decidim.data_consent.dialog.settings") %>
24
24
  </button>
25
25
  </div>
26
26
  </div>
@@ -1,14 +1,14 @@
1
- <div class="reveal cc-modal" id="cc-modal" role="dialog" data-close-on-click="false" data-close-on-esc="false" aria-modal="true" data-reveal>
1
+ <div class="reveal dc-modal" id="dc-modal" role="dialog" data-close-on-click="false" data-close-on-esc="false" aria-modal="true" data-reveal>
2
2
  <div class="reveal__header">
3
3
  <h3 class="reveal__title">
4
- <%= t("layouts.decidim.cookie_consent.modal.title") %>
4
+ <%= t("layouts.decidim.data_consent.modal.title") %>
5
5
  </h3>
6
6
  <p>
7
- <%= t("layouts.decidim.cookie_consent.modal.description") %>
7
+ <%= t("layouts.decidim.data_consent.modal.description") %>
8
8
  </p>
9
9
  </div>
10
10
 
11
- <div class="cc-categories">
11
+ <div class="dc-categories">
12
12
  <% categories.each do |category| %>
13
13
  <%= render(
14
14
  {
@@ -21,18 +21,18 @@
21
21
  <% end %>
22
22
  </div>
23
23
 
24
- <div class="cc-buttons-wrapper flex-center">
25
- <div class="cc-buttons-left">
26
- <button id="cc-modal-accept" class="button" data-close>
27
- <%= t("layouts.decidim.cookie_consent.modal.accept_all") %>
24
+ <div class="dc-buttons-wrapper flex-center">
25
+ <div class="dc-buttons-left">
26
+ <button id="dc-modal-accept" class="button" data-close>
27
+ <%= t("layouts.decidim.data_consent.modal.accept_all") %>
28
28
  </button>
29
- <button id="cc-modal-reject" class="button hollow" data-close>
30
- <%= t("layouts.decidim.cookie_consent.modal.accept_only_essential") %>
29
+ <button id="dc-modal-reject" class="button hollow" data-close>
30
+ <%= t("layouts.decidim.data_consent.modal.accept_only_essential") %>
31
31
  </button>
32
32
  </div>
33
- <div class="cc-buttons-right">
34
- <button id="cc-modal-save" class="button clear" data-close>
35
- <%= t("layouts.decidim.cookie_consent.modal.save_settings") %>
33
+ <div class="dc-buttons-right">
34
+ <button id="dc-modal-save" class="button clear" data-close>
35
+ <%= t("layouts.decidim.data_consent.modal.save_settings") %>
36
36
  </button>
37
37
  </div>
38
38
  </div>
@@ -10,10 +10,10 @@ module Decidim
10
10
  @categories ||= Decidim.consent_categories.map do |category|
11
11
  {
12
12
  slug: category[:slug],
13
- title: t("layouts.decidim.cookie_consent.modal.#{category[:slug]}.title"),
14
- description: t("layouts.decidim.cookie_consent.modal.#{category[:slug]}.description"),
13
+ title: t("layouts.decidim.data_consent.modal.#{category[:slug]}.title"),
14
+ description: t("layouts.decidim.data_consent.modal.#{category[:slug]}.description"),
15
15
  mandatory: category[:mandatory],
16
- cookies: category.has_key?(:cookies) ? category[:cookies] : []
16
+ items: category.has_key?(:items) ? category[:items] : []
17
17
  }
18
18
  end
19
19
  end
@@ -24,7 +24,9 @@ module Decidim
24
24
  notify_followers
25
25
  broadcast(:ok, @user.unconfirmed_email.present?)
26
26
  else
27
- @form.errors.add :avatar, @user.errors[:avatar] if @user.errors.has_key? :avatar
27
+ [:avatar, :password, :password_confirmation].each do |key|
28
+ @form.errors.add key, @user.errors[key] if @user.errors.has_key? key
29
+ end
28
30
  broadcast(:invalid)
29
31
  end
30
32
  end
@@ -10,6 +10,10 @@ module Decidim
10
10
  helper Decidim::TraceabilityHelper
11
11
  helper_method :current_version, :versioned_resource
12
12
 
13
+ def show
14
+ raise ActionController::RoutingError, "Not found" unless current_version
15
+ end
16
+
13
17
  private
14
18
 
15
19
  # Overwrite this method in your controller to define how to find the
@@ -39,7 +39,7 @@ module Decidim
39
39
  end
40
40
 
41
41
  on(:invalid) do
42
- flash.now[:alert] = @form.errors[:base].join(", ") if @form.errors[:base].any?
42
+ flash.now[:alert] = @form.errors.full_messages.join(", ") if @form.errors.full_messages.any?
43
43
  render :new
44
44
  end
45
45
  end
@@ -60,6 +60,10 @@ module Decidim
60
60
  super(hash)
61
61
  resource.organization = current_organization
62
62
  end
63
+
64
+ def devise_mapping
65
+ ::Devise.mappings[:user]
66
+ end
63
67
  end
64
68
  end
65
69
  end
@@ -35,6 +35,7 @@ module Decidim
35
35
  ActionLog
36
36
  .where(visibility: %w(public-only all))
37
37
  .where(organization: current_organization)
38
+ .order(created_at: :desc)
38
39
  end
39
40
 
40
41
  def default_filter_params
@@ -15,7 +15,8 @@ module Decidim
15
15
  end
16
16
 
17
17
  def resource_text
18
- resource.body
18
+ return resource.body if resource.respond_to? :body
19
+ return resource.description if resource.respond_to? :description
19
20
  end
20
21
 
21
22
  def resource_type
@@ -14,7 +14,7 @@ module Decidim
14
14
  attribute :email
15
15
  attribute :password
16
16
  attribute :password_confirmation
17
- attribute :avatar
17
+ attribute :avatar, Decidim::Attributes::Blob
18
18
  attribute :remove_avatar, Boolean, default: false
19
19
  attribute :personal_url
20
20
  attribute :about
@@ -10,7 +10,7 @@ module Decidim
10
10
  attribute :name
11
11
  attribute :nickname
12
12
  attribute :email
13
- attribute :avatar
13
+ attribute :avatar, Decidim::Attributes::Blob
14
14
  attribute :about
15
15
  attribute :document_number
16
16
  attribute :phone
@@ -24,7 +24,11 @@ module Decidim
24
24
  remote: true,
25
25
  html: { id: nil }.merge(html_options)
26
26
  ) do |form|
27
- yield form
27
+ # Cannot use `concat()` here because it's not available in cells
28
+ inner = []
29
+ inner << hidden_field_tag("per_page", params[:per_page], id: nil) if params[:per_page]
30
+ inner << capture { yield form }
31
+ inner.join.html_safe
28
32
  end
29
33
  end
30
34
  end
@@ -16,13 +16,18 @@ module Decidim
16
16
  #
17
17
  # Returns an HTML-safe String.
18
18
  def decidim_sanitize(html, options = {})
19
+ scrubber = options[:scrubber] || Decidim::UserInputScrubber.new
19
20
  if options[:strip_tags]
20
- strip_tags sanitize(html, scrubber: Decidim::UserInputScrubber.new)
21
+ strip_tags sanitize(html, scrubber: scrubber)
21
22
  else
22
- sanitize(html, scrubber: Decidim::UserInputScrubber.new)
23
+ sanitize(html, scrubber: scrubber)
23
24
  end
24
25
  end
25
26
 
27
+ def decidim_sanitize_admin(html, options = {})
28
+ decidim_sanitize(html, { scrubber: Decidim::AdminInputScrubber.new }.merge(options))
29
+ end
30
+
26
31
  def decidim_sanitize_newsletter(html, options = {})
27
32
  if options[:strip_tags]
28
33
  strip_tags sanitize(html, scrubber: Decidim::NewsletterScrubber.new)
@@ -32,10 +37,14 @@ module Decidim
32
37
  end
33
38
 
34
39
  def decidim_sanitize_editor(html, options = {})
35
- html = Decidim::IframeDisabler.new(html, options).perform
36
40
  content_tag(:div, decidim_sanitize(html, options), class: %w(ql-editor ql-reset-decidim))
37
41
  end
38
42
 
43
+ def decidim_sanitize_editor_admin(html, options = {})
44
+ html = Decidim::IframeDisabler.new(html, options).perform
45
+ decidim_sanitize_editor(html, { scrubber: Decidim::AdminInputScrubber.new }.merge(options))
46
+ end
47
+
39
48
  def decidim_html_escape(text)
40
49
  ERB::Util.unwrapped_html_escape(text.to_str)
41
50
  end
@@ -214,16 +214,16 @@ module Decidim
214
214
  end
215
215
 
216
216
  # Whether this activity or log is visible for a given user (can also be nil)
217
- #
218
- # Returns a True/False.
219
217
  def visible_for?(user)
220
- return false if resource_lazy.blank?
221
- return false if participatory_space_lazy.blank?
222
- return false if resource_lazy.respond_to?(:deleted?) && resource_lazy.deleted?
223
- return false if resource_lazy.respond_to?(:hidden?) && resource_lazy.hidden?
224
- return false if resource_lazy.respond_to?(:can_participate?) && !resource_lazy.can_participate?(user)
225
-
226
- true
218
+ resource_lazy.present? &&
219
+ participatory_space_lazy.present? &&
220
+ !resource_lazy.try(:deleted?) &&
221
+ !resource_lazy.try(:hidden?) &&
222
+ (!resource_lazy.respond_to?(:can_participate?) || resource_lazy.try(:can_participate?, user))
223
+ rescue NameError => e
224
+ Rails.logger.warn "Failed resource for #{self.class.name}(id=#{id}): #{e.message}"
225
+
226
+ false
227
227
  end
228
228
  end
229
229
  end
@@ -7,8 +7,17 @@ module Decidim
7
7
  belongs_to :resource, foreign_key: "decidim_resource_id", foreign_type: "decidim_resource_type", polymorphic: true
8
8
  belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User"
9
9
 
10
- scope :daily, ->(time: Time.now.utc - 1.day) { where(created_at: time.all_day) }
11
- scope :weekly, ->(time: Time.now.utc) { where(created_at: (time - 7.days)..time) }
10
+ # Daily notifications should contain all notifications within the previous
11
+ # day from the given day.
12
+ scope :daily, ->(time: Time.now.utc) { where(created_at: (time - 1.day).all_day) }
13
+
14
+ # Weekly notifications should contain all notifications within the previous
15
+ # week counting from the end of the previous day until the start of the day
16
+ # 1 week ago from the previous day.
17
+ scope :weekly, lambda { |time: Time.now.utc|
18
+ end_of_previous_day = (time - 1.day).end_of_day
19
+ where(created_at: (end_of_previous_day - 7.days).beginning_of_day..end_of_previous_day)
20
+ }
12
21
 
13
22
  def event_class_instance
14
23
  @event_class_instance ||= event_class.constantize.new(
@@ -30,6 +30,7 @@ module Decidim
30
30
 
31
31
  scope :blocked, -> { where(blocked: true) }
32
32
  scope :not_blocked, -> { where(blocked: false) }
33
+ scope :available, -> { where(deleted_at: nil, blocked: false, managed: false) }
33
34
 
34
35
  # Public: Returns a collection with all the public entities this user is following.
35
36
  #
@@ -58,7 +58,7 @@ import "src/decidim/identity_selector_dialog"
58
58
  import "src/decidim/gallery"
59
59
  import "src/decidim/direct_uploads/upload_field"
60
60
  import "src/decidim/back_to_list"
61
- import "src/decidim/cookie_consent/cookie_consent"
61
+ import "src/decidim/data_consent"
62
62
 
63
63
  // CSS
64
64
  import "entrypoints/decidim_core.scss"
@@ -1,27 +1,77 @@
1
+ /**
2
+ * Initializes the edit account form to control the password field elements
3
+ * which should only be required when they are visible.
4
+ *
5
+ * @returns {void}
6
+ */
7
+ const initializeAccountForm = () => {
8
+ const editUserForm = document.querySelector("form.edit_user");
9
+ if (!editUserForm) {
10
+ return;
11
+ }
12
+
13
+ const passwordChange = editUserForm.querySelector("#passwordChange");
14
+ if (!passwordChange) {
15
+ return;
16
+ }
17
+
18
+ const passwordFields = passwordChange.querySelectorAll("input[type='password']");
19
+ if (passwordFields.length < 1) {
20
+ return;
21
+ }
22
+
23
+ // Foundation uses jQuery so these have to be bound using jQuery and the
24
+ // attribute value needs to be set through jQuery.
25
+ const togglePasswordFieldValidators = (enabled) => {
26
+ $(passwordFields).attr("required", enabled);
27
+
28
+ if (!enabled) {
29
+ passwordFields.forEach((field) => (field.value = ""));
30
+ }
31
+ }
32
+
33
+ $(passwordChange).on("on.zf.toggler", () => {
34
+ togglePasswordFieldValidators(true);
35
+ });
36
+ $(passwordChange).on("off.zf.toggler", () => {
37
+ togglePasswordFieldValidators(false);
38
+ });
39
+ togglePasswordFieldValidators(false);
40
+ };
41
+
1
42
  /**
2
43
  * Since the delete account has a modal to confirm it we need to copy the content of the
3
44
  * reason field to the hidden field in the form inside the modal.
45
+ *
46
+ * @return {void}
4
47
  */
5
- $(() => {
48
+ const initializeDeleteAccount = () => {
6
49
  const $deleteAccountForm = $(".delete-account");
7
50
  const $deleteAccountModalForm = $(".delete-account-modal");
8
51
 
9
- if ($deleteAccountForm.length > 0) {
10
- const $openModalButton = $(".open-modal-button");
11
- const $modal = $("#deleteConfirm");
12
-
13
- $openModalButton.on("click", (event) => {
14
- try {
15
- const reasonValue = $deleteAccountForm.find("textarea#delete_account_delete_reason").val();
16
- $deleteAccountModalForm.find("input#delete_account_delete_reason").val(reasonValue);
17
- $modal.foundation("open");
18
- } catch (error) {
19
- console.error(error); // eslint-disable-line no-console
20
- }
21
-
22
- event.preventDefault();
23
- event.stopPropagation();
24
- return false;
25
- });
52
+ if ($deleteAccountForm.length < 1) {
53
+ return;
26
54
  }
55
+
56
+ const $openModalButton = $(".open-modal-button");
57
+ const $modal = $("#deleteConfirm");
58
+
59
+ $openModalButton.on("click", (event) => {
60
+ try {
61
+ const reasonValue = $deleteAccountForm.find("textarea#delete_account_delete_reason").val();
62
+ $deleteAccountModalForm.find("input#delete_account_delete_reason").val(reasonValue);
63
+ $modal.foundation("open");
64
+ } catch (error) {
65
+ console.error(error); // eslint-disable-line no-console
66
+ }
67
+
68
+ event.preventDefault();
69
+ event.stopPropagation();
70
+ return false;
71
+ });
72
+ };
73
+
74
+ $(() => {
75
+ initializeAccountForm();
76
+ initializeDeleteAccount();
27
77
  });