decidim-core 0.26.0.rc2 → 0.26.2

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity_cell.rb +3 -0
  3. data/app/cells/decidim/author_cell.rb +1 -0
  4. data/app/cells/decidim/card_m/show.erb +1 -1
  5. data/app/cells/decidim/card_m_cell.rb +1 -1
  6. data/app/cells/decidim/diff/diff_mode_dropdown.erb +13 -8
  7. data/app/cells/decidim/diff/diff_mode_html.erb +13 -8
  8. data/app/cells/decidim/diff/show.erb +5 -3
  9. data/app/cells/decidim/endorsers_list/show.erb +1 -1
  10. data/app/cells/decidim/fingerprint/show.erb +1 -1
  11. data/app/cells/decidim/followers/show.erb +1 -1
  12. data/app/cells/decidim/followers_cell.rb +1 -1
  13. data/app/cells/decidim/following/show.erb +2 -2
  14. data/app/cells/decidim/groups/show.erb +1 -1
  15. data/app/cells/decidim/members/show.erb +1 -1
  16. data/app/cells/decidim/notification/show.erb +1 -1
  17. data/app/cells/decidim/notification_cell.rb +6 -0
  18. data/app/cells/decidim/profile_sidebar/show.erb +1 -1
  19. data/app/cells/decidim/user_conversation/messages.erb +1 -1
  20. data/app/cells/decidim/user_conversation_cell.rb +4 -0
  21. data/app/cells/decidim/user_conversations/add_conversation_users.erb +1 -1
  22. data/app/cells/decidim/version_cell.rb +1 -1
  23. data/app/cells/decidim/versions_list_cell.rb +1 -1
  24. data/app/cells/decidim/versions_list_item/show.erb +2 -2
  25. data/app/commands/decidim/messaging/reply_to_conversation.rb +4 -1
  26. data/app/commands/decidim/unendorse_resource.rb +5 -4
  27. data/app/commands/decidim/update_user_interests.rb +5 -1
  28. data/app/controllers/concerns/decidim/skip_timeoutable.rb +17 -0
  29. data/app/controllers/decidim/application_controller.rb +1 -0
  30. data/app/controllers/decidim/components/base_controller.rb +0 -1
  31. data/app/controllers/decidim/timeouts_controller.rb +2 -6
  32. data/app/events/decidim/amendable/amendment_base_event.rb +1 -1
  33. data/app/forms/decidim/messaging/message_form.rb +1 -1
  34. data/app/forms/decidim/user_interest_scope_form.rb +1 -1
  35. data/app/helpers/decidim/application_helper.rb +4 -0
  36. data/app/helpers/decidim/endorsable_helper.rb +7 -6
  37. data/app/helpers/decidim/meta_tags_helper.rb +24 -1
  38. data/app/helpers/decidim/sanitize_helper.rb +8 -2
  39. data/app/helpers/decidim/twitter_search_helper.rb +14 -0
  40. data/app/models/decidim/action_log.rb +1 -0
  41. data/app/models/decidim/moderation.rb +3 -0
  42. data/app/models/decidim/user.rb +0 -3
  43. data/app/models/decidim/user_base_entity.rb +1 -0
  44. data/app/models/decidim/user_group.rb +0 -3
  45. data/app/packs/entrypoints/decidim_core.js +3 -0
  46. data/app/packs/src/decidim/back_to_list.js +26 -0
  47. data/app/packs/src/decidim/dialog_mode.js +11 -99
  48. data/app/packs/src/decidim/dialog_mode.test.js +17 -4
  49. data/app/packs/src/decidim/diff_mode_dropdown.js +3 -3
  50. data/app/packs/src/decidim/dropdowns_menus.js +1 -0
  51. data/app/packs/src/decidim/external_link.js +6 -0
  52. data/app/packs/src/decidim/focus_guard.js +142 -0
  53. data/app/packs/src/decidim/form_filter.js +17 -1
  54. data/app/packs/src/decidim/form_remote.js +38 -0
  55. data/app/packs/src/decidim/index.js +15 -0
  56. data/app/packs/src/decidim/input_character_counter.js +4 -1
  57. data/app/packs/src/decidim/input_emoji.js +28 -5
  58. data/app/packs/src/decidim/input_multiple_mentions.js +19 -0
  59. data/app/packs/src/decidim/map/controller/static.js +6 -5
  60. data/app/packs/src/decidim/session_timeouter.js +10 -5
  61. data/app/packs/src/decidim/vendor/social-share-button.js +174 -0
  62. data/app/packs/stylesheets/decidim/extras/_quill.scss +1 -2
  63. data/app/packs/stylesheets/decidim/modules/_buttons.scss +2 -1
  64. data/app/packs/stylesheets/decidim/modules/_comments.scss +1 -0
  65. data/app/packs/stylesheets/decidim/modules/_forms.scss +6 -1
  66. data/app/packs/stylesheets/decidim/modules/_typography.scss +2 -0
  67. data/app/packs/stylesheets/decidim/utils/_settings.scss +1 -0
  68. data/app/packs/stylesheets/decidim/vendor/_social_share_button.scss +7 -1
  69. data/app/permissions/decidim/permissions.rb +9 -0
  70. data/app/presenters/decidim/menu_item_presenter.rb +9 -1
  71. data/app/validators/password_validator.rb +12 -3
  72. data/app/views/decidim/account/show.html.erb +1 -1
  73. data/app/views/decidim/application/_collection.html.erb +2 -2
  74. data/app/views/decidim/devise/invitations/edit.html.erb +2 -2
  75. data/app/views/decidim/endorsements/identities.html.erb +1 -1
  76. data/app/views/decidim/groups/new.html.erb +2 -0
  77. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +1 -1
  78. data/app/views/decidim/messaging/conversations/_reply.html.erb +1 -1
  79. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  80. data/app/views/decidim/messaging/conversations/create.js.erb +1 -0
  81. data/app/views/layouts/decidim/_language_chooser.html.erb +9 -2
  82. data/app/views/layouts/decidim/_logo.html.erb +1 -1
  83. data/app/views/layouts/decidim/_timeout_modal.html.erb +2 -0
  84. data/config/initializers/devise.rb +9 -20
  85. data/config/locales/ar.yml +72 -0
  86. data/config/locales/ca.yml +21 -2
  87. data/config/locales/cs.yml +15 -0
  88. data/config/locales/de.yml +20 -3
  89. data/config/locales/en.yml +15 -0
  90. data/config/locales/es-MX.yml +24 -4
  91. data/config/locales/es-PY.yml +20 -0
  92. data/config/locales/es.yml +20 -0
  93. data/config/locales/fi-plain.yml +20 -0
  94. data/config/locales/fi.yml +21 -1
  95. data/config/locales/fr-CA.yml +19 -0
  96. data/config/locales/fr.yml +42 -27
  97. data/config/locales/gl.yml +51 -0
  98. data/config/locales/hu.yml +112 -0
  99. data/config/locales/it.yml +9 -0
  100. data/config/locales/ja.yml +25 -6
  101. data/config/locales/no.yml +225 -0
  102. data/config/locales/pt.yml +2 -2
  103. data/config/locales/ro-RO.yml +5 -0
  104. data/config/locales/sv.yml +38 -1
  105. data/db/seeds.rb +2 -2
  106. data/lib/decidim/content_parsers/hashtag_parser.rb +1 -1
  107. data/lib/decidim/content_parsers/resource_parser.rb +97 -0
  108. data/lib/decidim/content_parsers.rb +1 -0
  109. data/lib/decidim/content_processor.rb +2 -1
  110. data/lib/decidim/content_renderers/link_renderer.rb +1 -1
  111. data/lib/decidim/content_renderers/resource_renderer.rb +30 -0
  112. data/lib/decidim/content_renderers.rb +1 -0
  113. data/lib/decidim/core/engine.rb +43 -0
  114. data/lib/decidim/core/test/factories.rb +2 -1
  115. data/lib/decidim/core/test/shared_examples/amendable/amendment_accepted_event_examples.rb +0 -1
  116. data/lib/decidim/core/test/shared_examples/amendable/amendment_created_event_examples.rb +0 -1
  117. data/lib/decidim/core/test/shared_examples/amendable/amendment_promoted_event_examples.rb +0 -1
  118. data/lib/decidim/core/test/shared_examples/amendable/amendment_rejected_event_examples.rb +0 -1
  119. data/lib/decidim/core/test/shared_examples/comments_examples.rb +27 -0
  120. data/lib/decidim/core/test/shared_examples/conversations_examples.rb +19 -0
  121. data/lib/decidim/core/test/shared_examples/endorsable.rb +69 -0
  122. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +34 -0
  123. data/lib/decidim/core/test.rb +2 -0
  124. data/lib/decidim/core/version.rb +1 -1
  125. data/lib/decidim/endorsable.rb +5 -1
  126. data/lib/decidim/map/autocomplete.rb +12 -5
  127. data/lib/decidim/middleware/rails_cookies.rb +23 -0
  128. data/lib/decidim/resourceable.rb +1 -0
  129. data/lib/decidim/searchable.rb +10 -4
  130. data/lib/decidim/view_model.rb +0 -1
  131. data/lib/devise/models/decidim_validatable.rb +3 -3
  132. data/lib/tasks/upgrade/decidim_moderation_tasks.rake +32 -0
  133. metadata +22 -12
  134. data/app/helpers/decidim/filter_params_helper.rb +0 -30
  135. data/config/initializers/mail_previews.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '008fc01a452a6ce6800305e9cd20ebaf12adade8db7b13aa2f62d5d11bf07eb0'
4
- data.tar.gz: 9acc5acf5b9e95057be4731b089fb383e45f2ac90065d978e7f23f8a97dac4e6
3
+ metadata.gz: 18193603bd469c0ea5937875b577f4cc5439727b2ad1759e60ea725d029e18f1
4
+ data.tar.gz: 91c95bec2cdc7af5ad17a5d5ccd165817516fbaf0ed46051c198d3b8b5b1321b
5
5
  SHA512:
6
- metadata.gz: 5edc8e0a59cf89167962340fe5fca99b5ddd5257f1dd936b0e8a9c8e3f620f8cdd8596b1d831c2886750d94764dd009453fa117c347ba00020ceb6eefa8f911f
7
- data.tar.gz: 7538bffa5a162c3e4777fc9317f529854e664540dcf77da130c6a08362afa37bff8a84d78b29ae78b04cf2f370b6c582da21a8fdeebdbf447cf360cf82419f63
6
+ metadata.gz: 71b39ec5cae4751ab21048ef686cd6b3704e8d5469d9ba608fcf163944ebf83fc100d1a47c59d4eae4b4c01af4d5074918113a8cf533151e954eb97defa14bf9
7
+ data.tar.gz: 72011b7df988f022988d64892177f9f4b28338019152d0a2ce46f489696256acdcd095d0da83346e41d70cdeb72c72ef7e21c0e701b50a1d4b35a6de8c51840d
@@ -95,6 +95,9 @@ module Decidim
95
95
  hash << I18n.locale.to_s
96
96
  hash << model.class.name.underscore
97
97
  hash << model.cache_key_with_version
98
+ if (author_cell = author)
99
+ hash.push(Digest::MD5.hexdigest(author_cell.send(:cache_hash)))
100
+ end
98
101
 
99
102
  hash.join(Decidim.cache_key_separator)
100
103
  end
@@ -66,6 +66,7 @@ module Decidim
66
66
 
67
67
  hash.push(I18n.locale)
68
68
  hash.push(model.cache_key_with_version) if model.respond_to?(:cache_key_with_version)
69
+ hash.push(from_context.cache_key_with_version) if from_context.respond_to?(:cache_key_with_version)
69
70
  hash.push(current_user.try(:id))
70
71
  hash.push(current_user.present?)
71
72
  hash.push(commentable?)
@@ -9,7 +9,7 @@
9
9
  <div class="card__text">
10
10
  <div class="card__text--paragraph">
11
11
  <%= render :badge if has_badge? %>
12
- <%= description %>
12
+ <%= Decidim::ContentProcessor.render(description, "div") %>
13
13
  </div>
14
14
  </div>
15
15
 
@@ -19,7 +19,7 @@ module Decidim
19
19
  private
20
20
 
21
21
  def resource_path
22
- resource_locator(model).path(filter_link_params)
22
+ resource_locator(model).path
23
23
  end
24
24
 
25
25
  def resource_image_path
@@ -4,21 +4,26 @@
4
4
  <%= t("versions.dropdown.choose_diff_view_mode") %>
5
5
  </span>
6
6
 
7
- <ul class="dropdown menu" data-dropdown-menu>
8
- <li class="is-dropdown-submenu-parent">
9
- <a id="diff-view-selected">
7
+ <ul class="dropdown menu" data-dropdown-menu
8
+ data-autoclose="false"
9
+ data-disable-hover="true"
10
+ data-click-open="true"
11
+ data-close-on-click="true"
12
+ role="menubar">
13
+ <li class="is-dropdown-submenu-parent" role="presentation">
14
+ <a href="#diffmode-chooser-menu" id="diff-view-selected" aria-controls="diffmode-chooser-menu" aria-haspopup="true" aria-label="<%= t("versions.dropdown.choose_diff_view_mode_menu") %>" role="menuitem">
10
15
  <%= t("versions.dropdown.option_unified") %>
11
16
  </a>
12
17
 
13
- <ul class="menu">
14
- <li>
15
- <%= link_to "#diff-view-unified", class: "diff-view-mode", id:"diff-view-unified" do %>
18
+ <ul class="menu is-dropdown-submenu" id="diffmode-chooser-menu" role="menu" aria-labelledby="diff-view-selected">
19
+ <li role="presentation">
20
+ <%= link_to "#diff-view-unified", class: "diff-view-mode", id:"diff-view-unified", role: "menuitem" do %>
16
21
  <%= t("versions.dropdown.option_unified") %>
17
22
  <% end %>
18
23
  </li>
19
24
 
20
- <li>
21
- <%= link_to "#diff-view-split", class: "diff-view-mode", id:"diff-view-split" do %>
25
+ <li role="presentation">
26
+ <%= link_to "#diff-view-split", class: "diff-view-mode", id:"diff-view-split", role: "menuitem" do %>
22
27
  <%= t("versions.dropdown.option_split") %>
23
28
  <% end %>
24
29
  </li>
@@ -5,21 +5,26 @@
5
5
  <%= t("versions.dropdown.choose_diff_view_html") %>
6
6
  </span>
7
7
 
8
- <ul class="dropdown menu" data-dropdown-menu>
9
- <li class="is-dropdown-submenu-parent">
10
- <a id="diff-view-selected">
8
+ <ul class="dropdown menu" data-dropdown-menu
9
+ data-autoclose="false"
10
+ data-disable-hover="true"
11
+ data-click-open="true"
12
+ data-close-on-click="true"
13
+ role="menubar">
14
+ <li class="is-dropdown-submenu-parent" role="presentation">
15
+ <a href="#htmlmode-chooser-menu" id="diff-view-html-selected" aria-controls="htmlmode-chooser-menu" aria-haspopup="true" aria-label="<%= t("versions.dropdown.choose_diff_view_mode_menu") %>" role="menuitem">
11
16
  <%= t("versions.dropdown.option_unescaped") %>
12
17
  </a>
13
18
 
14
- <ul class="menu">
15
- <li>
16
- <%= link_to "#unescaped-html", class: "diff-view-html", id:"unescaped-html" do %>
19
+ <ul class="menu is-dropdown-submenu" id="htmlmode-chooser-menu" role="menu" aria-labelledby="diff-view-html-selected">
20
+ <li role="presentation">
21
+ <%= link_to "#diff-view-unescaped-html", class: "diff-view-html", id: "diff-view-unescaped-html", role: "menuitem" do %>
17
22
  <%= t("versions.dropdown.option_unescaped") %>
18
23
  <% end %>
19
24
  </li>
20
25
 
21
- <li>
22
- <%= link_to "#escaped-html", class: "diff-view-html", id:"escaped-html" do %>
26
+ <li role="presentation">
27
+ <%= link_to "#diff-view-escaped-html", class: "diff-view-html", id: "diff-view-escaped-html", role: "menuitem" do %>
23
28
  <%= t("versions.dropdown.option_escaped") %>
24
29
  <% end %>
25
30
  </li>
@@ -1,6 +1,8 @@
1
1
  <%= render :diff_mode_dropdown %>
2
2
  <%= render :diff_mode_html %>
3
3
 
4
- <% diff_data.each do |data| %>
5
- <%= attribute(data) %>
6
- <% end %>
4
+ <div aria-live="polite">
5
+ <% diff_data.each do |data| %>
6
+ <%= attribute(data) %>
7
+ <% end %>
8
+ </div>
@@ -1,7 +1,7 @@
1
1
  <div id="list-of-endorsements" class="section">
2
2
  <div class="row">
3
3
  <div class="columns large-12">
4
- <h4 class="section-heading"><%= t("decidim.proposals.proposals.show.endorsements_list") %></h4>
4
+ <h3 class="section-heading"><%= t("decidim.proposals.proposals.show.endorsements_list") %></h3>
5
5
  </div>
6
6
  <div class="columns large-12">
7
7
  <%= cell(
@@ -3,7 +3,7 @@
3
3
  </div>
4
4
 
5
5
  <div id="<%= modal_name %>" class="reveal fingerprint-dialog" data-reveal aria-labelledby="modalTitle" aria-hidden="true" role="dialog">
6
- <h2 id="modalTitle"><%= t "decidim.fingerprint.title" %></h2>
6
+ <h2 id="modalTitle" class="reveal__title"><%= t "decidim.fingerprint.title" %></h2>
7
7
  <p><%= t "decidim.fingerprint.explanation" %></p>
8
8
  <p>
9
9
  <strong><%= t "decidim.fingerprint.value" %>:</strong>
@@ -1,4 +1,4 @@
1
- <div class="empty-notifications callout secondary <%= "hide" if followers.any? %>">
1
+ <div class="callout secondary <%= "hide" if followers.any? %>">
2
2
  <p><%= t("decidim.followers.no_followers") %></p>
3
3
  </div>
4
4
  <div class="row small-up-1 medium-up-2 card-grid">
@@ -12,7 +12,7 @@ module Decidim
12
12
  end
13
13
 
14
14
  def followers
15
- @followers ||= model.followers.page(params[:page]).per(20)
15
+ @followers ||= model.followers.not_blocked.page(params[:page]).per(20)
16
16
  end
17
17
  end
18
18
  end
@@ -1,6 +1,6 @@
1
1
  <% if public_followings.any? %>
2
2
  <% if non_public_followings? %>
3
- <div class="empty-notifications callout secondary">
3
+ <div class="callout secondary">
4
4
  <p><%= t("decidim.following.non_public_followings") %></p>
5
5
  </div>
6
6
  <% end %>
@@ -12,7 +12,7 @@
12
12
  </div>
13
13
  <%= decidim_paginate public_followings %>
14
14
  <% else %>
15
- <div class="empty-notifications callout secondary">
15
+ <div class="callout secondary">
16
16
  <p><%= t("decidim.following.no_followings") %></p>
17
17
  </div>
18
18
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <%= cell "decidim/user_group_pending_invitations_list", model %>
2
- <div class="empty-notifications callout secondary <%= "hide" if user_groups.any? %>">
2
+ <div class="callout secondary <%= "hide" if user_groups.any? %>">
3
3
  <p><%= t("decidim.groups.no_user_groups") %></p>
4
4
  </div>
5
5
  <div class="row small-up-1 medium-up-2 card-grid">
@@ -1,4 +1,4 @@
1
- <div class="empty-notifications callout secondary <%= "hide" if memberships.any? %>">
1
+ <div class="callout secondary <%= "hide" if memberships.any? %>">
2
2
  <p><%= t("decidim.members.no_members") %></p>
3
3
  </div>
4
4
  <div class="row small-up-1 medium-up-2 card-grid">
@@ -13,7 +13,7 @@
13
13
  <span class="text-small"><%= notification.event_class.constantize.model_name.human %></span>
14
14
  <br>
15
15
  <span>
16
- <%= notification.event_class_instance.notification_title %>
16
+ <%= notification_title %>
17
17
  </span>
18
18
  <% if notification.display_resource_text? %>
19
19
  <p>
@@ -11,6 +11,12 @@ module Decidim
11
11
  render :show
12
12
  end
13
13
 
14
+ def notification_title
15
+ notification.event_class_instance.notification_title
16
+ rescue StandardError
17
+ I18n.t("decidim.notifications.show.missing_event")
18
+ end
19
+
14
20
  private
15
21
 
16
22
  def notification
@@ -23,7 +23,7 @@
23
23
  <small><%= decidim_html_escape(profile_user.about.to_s) %></small>
24
24
  </div>
25
25
  <% if profile_user.personal_url.present? %>
26
- <%= link_to html_truncate(profile_user.personal_url.gsub(%r{https?\:\/\/}, ""), length: 30), profile_user.personal_url %>
26
+ <%= link_to html_truncate(profile_user.personal_url.gsub(%r{https?\:\/\/}, ""), length: 30), profile_user.personal_url, rel: "nofollow noopener noreferrer ugc" %>
27
27
  <% end %>
28
28
  </div>
29
29
  <% if profile_user.badge.present? %>
@@ -1,6 +1,6 @@
1
1
  <div class="conversation-chat<%= " conversation-chat--offset" if sender_is_user?(sender) %>">
2
2
  <%= link_to sender.personal_url do %>
3
- <%= image_tag sender.attached_uploader(:avatar).url(host: current_organization.host), alt: t("decidim.author.avatar", name: decidim_sanitize(sender.name)) %>
3
+ <%= image_tag avatar_url_for(sender), alt: t("decidim.author.avatar", name: decidim_sanitize(sender.name)) %>
4
4
  <% end %>
5
5
  <div>
6
6
  <% messages.each do |message| %>
@@ -37,6 +37,10 @@ module Decidim
37
37
  user.id == sender.id
38
38
  end
39
39
 
40
+ def avatar_url_for(sender)
41
+ present(sender).avatar_url
42
+ end
43
+
40
44
  def conversation_avatar
41
45
  if interlocutors.count == 1
42
46
  present(interlocutors.first).avatar_url
@@ -2,7 +2,7 @@
2
2
  <div class="wrapper wrapper--inner">
3
3
  <div class="row">
4
4
  <div class="large-12">
5
- <h2 id="modalTitle"> <%= t "decidim.user_conversations.index.modal_title" %> </h2>
5
+ <h2 id="modalTitle" class="reveal__title"><%= t "decidim.user_conversations.index.modal_title" %></h2>
6
6
  </div>
7
7
  </div>
8
8
  <div class="row">
@@ -77,7 +77,7 @@ module Decidim
77
77
  end
78
78
 
79
79
  def resource_path
80
- resource_locator(versioned_resource).path(filter_link_params)
80
+ resource_locator(versioned_resource).path
81
81
  end
82
82
  end
83
83
  end
@@ -13,7 +13,7 @@ module Decidim
13
13
  end
14
14
 
15
15
  def resource_path
16
- resource_locator(versioned_resource).path(filter_link_params)
16
+ resource_locator(versioned_resource).path
17
17
  end
18
18
 
19
19
  def i18n_changes_title
@@ -2,9 +2,9 @@
2
2
  <div class="card--list__text">
3
3
  <div>
4
4
  <%= link_to version_path do %>
5
- <h6 class="card--list__heading heading6">
5
+ <h4 class="card--list__heading heading6">
6
6
  <%= i18n_version_index %>
7
- </h6>
7
+ </h4>
8
8
  <% end %>
9
9
  <div class="author-data">
10
10
  <%= render_resource_editor(version) %>
@@ -20,7 +20,10 @@ module Decidim
20
20
  #
21
21
  # Returns nothing.
22
22
  def call
23
- return broadcast(:invalid) if form.invalid?
23
+ if form.invalid?
24
+ message.valid?
25
+ return broadcast(:invalid, message.errors.full_messages)
26
+ end
24
27
 
25
28
  if message.save
26
29
  notify_interlocutors
@@ -28,10 +28,11 @@ module Decidim
28
28
  private
29
29
 
30
30
  def destroy_resource_endorsement
31
- query = @resource.endorsements.where(
32
- author: @current_user,
33
- decidim_user_group_id: @current_group&.id
34
- )
31
+ query = if @current_group.present?
32
+ @resource.endorsements.where(decidim_user_group_id: @current_group&.id)
33
+ else
34
+ @resource.endorsements.where(author: @current_user)
35
+ end
35
36
  query.destroy_all
36
37
  end
37
38
  end
@@ -29,7 +29,11 @@ module Decidim
29
29
  end
30
30
 
31
31
  def selected_scopes_ids
32
- @form.scopes.select(&:checked).map(&:id)
32
+ @form.scopes.map do |scope|
33
+ next unless scope.checked?
34
+
35
+ scope.id.to_i
36
+ end.compact
33
37
  end
34
38
  end
35
39
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ # We don't want to reset timeout timer on routes where we make requests automatically
7
+ # (e.g. asking time before timeout or fetching comments).
8
+ module SkipTimeoutable
9
+ extend ActiveSupport::Concern
10
+
11
+ private
12
+
13
+ def skip_timeout
14
+ request.env["devise.skip_timeoutable"] = true
15
+ end
16
+ end
17
+ end
@@ -33,6 +33,7 @@ module Decidim
33
33
  helper Decidim::ViewHooksHelper
34
34
  helper Decidim::CardHelper
35
35
  helper Decidim::SanitizeHelper
36
+ helper Decidim::TwitterSearchHelper
36
37
 
37
38
  register_permissions(::Decidim::ApplicationController,
38
39
  ::Decidim::Admin::Permissions,
@@ -24,7 +24,6 @@ module Decidim
24
24
  helper Decidim::AttachmentsHelper
25
25
  helper Decidim::SanitizeHelper
26
26
  helper Decidim::PadHelper
27
- helper Decidim::FilterParamsHelper
28
27
 
29
28
  helper_method :current_component,
30
29
  :current_participatory_space,
@@ -5,6 +5,8 @@ require "active_support/concern"
5
5
  module Decidim
6
6
  # Tells/Extends time before inactivity warning or automatic logout.
7
7
  class TimeoutsController < Decidim::ApplicationController
8
+ include Decidim::SkipTimeoutable
9
+
8
10
  # Skip these methods because they can call Devise's store_location_for, which can save timeouts path to session.
9
11
  skip_before_action :store_current_location
10
12
 
@@ -23,11 +25,5 @@ module Decidim
23
25
  format.js
24
26
  end
25
27
  end
26
-
27
- private
28
-
29
- def skip_timeout
30
- request.env["devise.skip_timeoutable"] = true
31
- end
32
28
  end
33
29
  end
@@ -6,7 +6,7 @@ module Decidim::Amendable
6
6
  :emendation_path, :emendation_author_nickname, :emendation_author_path
7
7
 
8
8
  def amendable_title
9
- @amendable_title ||= amendable_resource.title
9
+ @amendable_title ||= translated_attribute(amendable_resource.title)
10
10
  end
11
11
 
12
12
  def amendable_type
@@ -8,7 +8,7 @@ module Decidim
8
8
 
9
9
  attribute :body, Decidim::Attributes::CleanString
10
10
 
11
- validates :body, presence: true
11
+ validates :body, presence: true, length: { maximum: Decidim.config.maximum_conversation_message_length }
12
12
  end
13
13
  end
14
14
  end
@@ -6,7 +6,7 @@ module Decidim
6
6
  class UserInterestScopeForm < Form
7
7
  mimic :scope
8
8
 
9
- attribute :name, String
9
+ attribute :name, JsonbAttributes
10
10
  attribute :checked, Boolean
11
11
  attribute :children, Array[UserInterestScopeForm]
12
12
 
@@ -119,5 +119,9 @@ module Decidim
119
119
  [base_url, "/", process.active_step.cta_path].join("")
120
120
  end
121
121
  end
122
+
123
+ def prevent_timeout_seconds
124
+ 0
125
+ end
122
126
  end
123
127
  end
@@ -76,12 +76,13 @@ module Decidim
76
76
  # user - The user that is endorsing at the end (mandatory).
77
77
  # user_group - The user_group on behalf of which the endorsement is being done (optional).
78
78
  def render_endorsement_identity(resource, user, user_group = nil)
79
- presenter = if user_group
80
- Decidim::UserGroupPresenter.new(user_group)
81
- else
82
- Decidim::UserPresenter.new(user)
83
- end
84
- selected = resource.endorsed_by?(user, user_group)
79
+ if user_group
80
+ presenter = Decidim::UserGroupPresenter.new(user_group)
81
+ selected = resource.endorsed_by?(user, user_group)
82
+ else
83
+ presenter = Decidim::UserPresenter.new(user)
84
+ selected = resource.endorsed_by?(user)
85
+ end
85
86
  http_method = selected ? :delete : :post
86
87
  render partial: "decidim/endorsements/identity", locals:
87
88
  { identity: presenter, selected: selected,
@@ -16,7 +16,30 @@ module Decidim
16
16
  add_decidim_meta_description(tags[:description])
17
17
  add_decidim_meta_url(tags[:url])
18
18
  add_decidim_meta_twitter_handler(tags[:twitter_handler])
19
- add_decidim_meta_image_url(tags[:image_url])
19
+ add_decidim_meta_image_url(add_base_url_to(tags[:image_url]))
20
+ end
21
+
22
+ # Public: Add base url to path if path doesn't include host.
23
+ # path - A String containing path (e.g. "/proposals/1" )
24
+ # Returns a String of URL including base URL and path, or path if it's blank.
25
+ def add_base_url_to(path)
26
+ return path if path.blank?
27
+ return path if URI.parse(path).host.present?
28
+
29
+ "#{resolve_base_url}#{path}"
30
+ end
31
+
32
+ # Public: Resolve base url (example: https://www.decidim.org) without url params
33
+ # Returns a String of base URL
34
+ def resolve_base_url
35
+ return request.base_url if respond_to?(:request) && request&.base_url.present?
36
+
37
+ uri = URI.parse(decidim.root_url(host: current_organization.host))
38
+ if uri.port.blank? || [80, 443].include?(uri.port)
39
+ "#{uri.scheme}://#{uri.host}"
40
+ else
41
+ "#{uri.scheme}://#{uri.host}:#{uri.port}"
42
+ end
20
43
  end
21
44
 
22
45
  # Public: Accumulates the given `title` so that they can be chained. Since Rails views
@@ -94,11 +94,17 @@ module Decidim
94
94
  end
95
95
  end
96
96
 
97
+ # This method is currently being used only for Proposal and Meeting,
98
+ # It aims to load the presenter class, and perform some basic sanitization on the content
99
+ # This method should be used along side simple_format.
100
+ # @param resource [Object] Resource object
101
+ # @param method [Symbol] Method name
102
+ #
103
+ # @return ActiveSupport::SafeBuffer
97
104
  def render_sanitized_content(resource, method)
98
105
  content = present(resource).send(method, links: true, strip_tags: !safe_content?)
99
- content = simple_format(content, {}, sanitize: false)
100
106
 
101
- return content unless safe_content?
107
+ return decidim_sanitize(content, {}) unless safe_content?
102
108
 
103
109
  decidim_sanitize_editor(content)
104
110
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TwitterSearchHelper
5
+ # Builds the URL for Twitter's hashtag search.
6
+ #
7
+ # @param hashtag [String] The hasthag to search
8
+ #
9
+ # @return [String]
10
+ def twitter_hashtag_url(hashtag)
11
+ format("https://twitter.com/hashtag/%{hashtag}?src=hash", hashtag: hashtag)
12
+ end
13
+ end
14
+ end
@@ -135,6 +135,7 @@ module Decidim
135
135
  def visible_for?(user)
136
136
  return false if resource_lazy.blank?
137
137
  return false if participatory_space_lazy.blank?
138
+ return false if resource_lazy.respond_to?(:deleted?) && resource_lazy.deleted?
138
139
  return false if resource_lazy.respond_to?(:hidden?) && resource_lazy.hidden?
139
140
  return false if resource_lazy.respond_to?(:can_participate?) && !resource_lazy.can_participate?(user)
140
141
 
@@ -12,6 +12,9 @@ module Decidim
12
12
 
13
13
  delegate :component, :organization, to: :reportable
14
14
 
15
+ scope :hidden, -> { where.not(hidden_at: nil) }
16
+ scope :not_hidden, -> { where(hidden_at: nil) }
17
+
15
18
  def self.log_presenter_class_for(_log)
16
19
  Decidim::AdminLog::ModerationPresenter
17
20
  end
@@ -50,9 +50,6 @@ module Decidim
50
50
 
51
51
  validate :all_roles_are_valid
52
52
 
53
- has_one_attached :avatar
54
- validates_upload :avatar, uploader: Decidim::AvatarUploader
55
-
56
53
  has_one_attached :data_portability_file
57
54
 
58
55
  scope :not_deleted, -> { where(deleted_at: nil) }
@@ -55,6 +55,7 @@ module Decidim
55
55
  scope = scope.public_spaces if klass.try(:participatory_space?)
56
56
  scope = scope.includes(:component) if klass.try(:has_component?)
57
57
  scope = scope.filter(&:visible?) if klass.method_defined?(:visible?)
58
+ scope = scope.reject(&:blocked) if klass == Decidim::UserBaseEntity
58
59
  scope
59
60
  end
60
61
  end
@@ -26,9 +26,6 @@ module Decidim
26
26
  validate :correct_state
27
27
  validate :unique_document_number, if: :has_document_number?
28
28
 
29
- has_one_attached :avatar
30
- validates_upload :avatar, uploader: Decidim::AvatarUploader
31
-
32
29
  devise :confirmable, :decidim_validatable, confirmation_keys: [:decidim_organization_id, :email]
33
30
 
34
31
  scope :verified, -> { where.not("extended_data->>'verified_at' IS ?", nil) }
@@ -13,6 +13,7 @@ window.morphdom = morphdom
13
13
  import "src/decidim/vendor/foundation-datepicker"
14
14
  import "src/decidim/foundation_datepicker_locales"
15
15
  import "src/decidim/vendor/modernizr"
16
+ import "src/decidim/vendor/social-share-button"
16
17
  import "social-share-button"
17
18
 
18
19
  import "src/decidim/input_tags"
@@ -33,6 +34,7 @@ import "src/decidim/dropdowns_menus"
33
34
  import "src/decidim/append_redirect_url_to_modals"
34
35
  import "src/decidim/form_attachments"
35
36
  import "src/decidim/form_validator"
37
+ import "src/decidim/form_remote"
36
38
  import "src/decidim/ajax_modals"
37
39
  import "src/decidim/conferences"
38
40
  import "src/decidim/tooltip_keep_on_hover"
@@ -55,6 +57,7 @@ import "src/decidim/start_conversation_dialog"
55
57
  import "src/decidim/notifications"
56
58
  import "src/decidim/identity_selector_dialog"
57
59
  import "src/decidim/gallery"
60
+ import "src/decidim/back_to_list"
58
61
 
59
62
  // CSS
60
63
  import "entrypoints/decidim_core.scss"