decidim-core 0.26.0.rc2 → 0.26.2

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 (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"